본문 바로가기

java

(16)
Spring Boot 파일 다운로드 (Controller) 스프링부트에서 컨트롤러를 만들어서 이미지를 다운로드하는 코드에요. 부트 환경이 아니여도 스프링 프레임워크를 사용하고 있다면 어디에나 적용 가능합니다. 코드를 간단하게 설명드리자면 파일 데이터에서 직접 Content-Type을 조사하여 Response Header에 세팅하고 InputStream으로 Resource를 생성하고 body에 세팅하여 전송합니다. Content-Disposition 값을 inline으로 하거나 헤더를 설정하지 않으면 웹 브라우저 내에서 이미지 확인이 가능합니다. (default가 inline) @GetMapping("download") public ResponseEntity download() throws IOException { Path path = Paths.get("C:/U..
Java Stream 기초 설명 (코딩 테스트 예제로) 최근에 어떤 기업의 경력직 코딩테스트를 보면서 Stream 기초 문제가 나왔어요. 예전에는 자바 디자인 패턴을 강조하는데, 요새는 Optional이나 Stream을 얼마나 잘 활용할 수 있냐를 보는 것 같아요. 문제를 약간 수정해서 공유해드리자면 이런 식이였어요. String[] array = { "carrot", "apple", "banana", "egg", "meat", "apple" }; - 다음 배열 요소의 중복을 제거하고, 다섯 글자 이상의 단어만, 내림차순으로 정렬하여 출력하라. - 다음 배열 요소에서 사전 상에 가장 앞에 나오는 단어 하나를 출력하라. ※ Stream을 이용할 것 그전에 Stream의 기초 사용법을 알아볼게요. Stream 생성 String[] array = { "carrot..
자바 팩토리 메소드 패턴 (Java Factory Method Pattern) 팩토리 메소드 패턴에 대해서 알아볼게요. 굉장히 많이 쓰이는 패턴이고, 익혀두면 나름 유용하게 쓸 수 있어요. 자바 소스 안에서도 많이 볼 수 있구요. 저도 때때로 사용하는 것 같습니다. 예제로는 패스워드를 암호화하는 기능을 구현해볼거에요. 실제 암호화 로직은 뺄거구요. 최대한 완성도 높게 구조를 만들겠습니다. 1. 인터페이스 만들기 Password라는 인터페이스를 만들었고, 클래스에서 세부 구현할 encode라는 메소드를 추가했어요. 혹은 추상클래스를 만들어서 추상 메소드를 추가하셔도 상관없습니다. public interface Password { String encode(String str); } 2. 구현체 작성 라이트하게 암호화하는 SimplePassword 클래스 강하게 암호화하는 SuperPa..
자바 파일 복사 (+ Spring) Java에서 파일을 복사하는 코드에요. Java 기존 java.io File in = new File("C:\\Temp\\abc.txt"); File out = new File("C:\\Temp\\def.txt"); try (InputStream fis = new FileInputStream(in); OutputStream fos = new FileOutputStream(out)) { int bytesRead = 0; while ((bytesRead = fis.read()) != -1) { fos.write(bytesRead); } fos.flush(); } catch (Exception e) { e.printStackTrace(); } java.nio Path in = Paths.get("C:\\Tem..
자바 싱글톤 패턴 (Java Singleton Pattern) 자바 환경에서 싱글톤으로 객체를 사용하는 방법에 대해서 알아볼게요. 싱글톤 패턴은 디자인 패턴 중 하나로 최초 한 번만 객체를 생성을 하여 메모리에 할당하는 기법이에요. 동일한 객체를 지속적으로 사용해야 할 때가 있어요. 이 때마다 인스턴스를 생성해내는 것보다 하나의 인스턴스를 사용하는 것이 리소스 절약면에서 유리합니다. 싱글톤을 구현하는 방법은 굉장히 많이 나와있지만 딱 두 가지만 알면 되요. 기본 방법 많이 쓰는 방법 Simple 방법 우선, 가장 기본 방법부터 작성해볼게요. 최초 한 번 객체를 초기화하기 때문에 Thread-Safe를 보장합니다. 하지만, 객체를 사용하지도 않는 경우에도 이미 생성되어 있어서 사용하지 않는다면 리소스 낭비가 있을 수 있습니다. 사실 사용하지 않을 객체를 싱글톤으로 만..
자바 템플릿 메소드 패턴 (Java Template Method Pattern) 자바 디자인 패턴에서 많이 언급되는 패턴 중 하나에요. 도대체 이게 뭔지 바로 구현해볼게요. 예제로 길을 찾는 기능을 구현하려고 해요. 출발지와 목적지를 입력하면 빠른 길, 가까운 길, 무료 길 등등 원하는 길을 알려줄거에요. 템플릿 클래스 어떤 길을 찾건 출발지와 목적지는 공통적으로 받아야되요. 공통적인 기능은 템플릿 클래스에 구현하고 빠른, 가까운, 무료와 같이 알고리즘이 다른 기능은 추상 메소드로 선언하여 각각 구현하도록 할거에요. public abstract class Direction { // 출발, 도착 세팅 final void setStartAndDest(String start, String end) { System.out.println("출발지 : " + start); System.out...
자바 빌더 패턴 (Java Builder Pattern) 장단점 우선, 빌더 패턴과 비교되는 패턴이 두 가지가 있어요. 두 가지 패턴은 용어만 거창하지 이미 알고 계실거에요. 점층적 생성자 패턴 : 생성자로 필드를 세팅, ex) new UserInfo(userId, password); 자바빈 패턴 : Setter 메서드로 필드를 세팅, ex) userInfo.set(userId); 빌더 패턴 이제, 빌더 패턴을 직접 구현해볼게요. Builder 패턴 직접 구현 @Getter public class UserInfo { private String userId; private String nickname; private String password; private String email; public static UserInfoBuilder builder() { retur..
자바 인터페이스 사용 이유 (Java Interface) 자바에서 인터페이스를 왜 써야하나? 이 글 내용은 실제 사용할 수 있는 몇 가지 사례라는 표현이 맞을 수 있습니다. 많은 분들이 인터페이스에 대한 내용을 이론만 보고 이해하기 어려워하시기에 최대한 접근하기 쉽게 적어두었습니다. 생각보다 많은 분들이 글을 보셔서 미리 말씀 드립니다. 해당 내용을 보시고 주체적으로 생각해보시고 다른 글의 내용도 한 번 다시 보시면 깊은 이해에 도움이 될 것 같습니다. 자바 인터페이스 사용 이유 1. Cooperation (협업) 예를 들어 우리는 한국인을 위한 번역기를 만들어 볼거에요. 아 전세계 언어가 너무 많아요ㅠㅠ 그래서 업무를 나눠봤어요. "너는 영어 번역 클래스를 만들어, 난 중국어 번역 클래스를 만들게. 준비~ 시작!" 하고 각자 다 만들어서 결과물을 공유했어요...