Java

팩토리 메서드 패턴 (Factory Method Pattern) 이란?
팩토리 메서드 패턴이란? 객체 생성 패턴의 한 종류이다. 팩토리 패턴은 객체 생성 역할을 별도의 클래스에 넘기는 패턴을 말한다. 객체 생성 책임을 구체적인 클래스가 아닌 추상 메서드에 넘긴다. 인터페이스나, 추상 클래스로 구현이 가능하다. 다양한 팩토리 클래스를 만들어 객체 생성 추상 메서드를 구현할 수 있다. 다이어그램으로 살펴보기 Creator 는 factoryMethod() 라는 추상 메서드를 가지고 있다. Product 타입의 객체를 반환한다. factoryMethod() 는 추상 메서드인만큼 누군가 구현해주어야 한다. Creator1 은 Creator 의 구현체이다. 추상 메서드였던 factoryMethod() 를 구현했다. Product1 은 Product 의 구현체로 Product 를 상속한..
싱글톤 패턴 (Singleton Pattern) 이란?
싱글톤 패턴이란? 클래스의 인스턴스를 오직 하나만 두고 사용하는 패턴이다. 1개 외에 추가적인 인스턴스 생성을 의도적으로 막아야 한다. 용례 애플리케이션의 구성(configuration) 정보와 같이 런타임 내에 공유되어야 하는 정적인 정보를 가지고 있는 클래스의 인스턴스를 만들 때 이 패턴을 사용할 수 있다. 생성 비용이 큰 인스턴스가 있을 때, 이 인스턴스를 한번 만들고 계속 재활용이 가능하다면 이 인스턴스를 싱글톤으로 공유하는 것을 생각해볼 수 있다. 자바에서의 나이브한 싱글톤 구현 public class SingletonClass { private static instance; private SingletonClass() { // 생성자를 private 으로 만들면, 외부에서 생성자 호출이 불가능..
로컬과 운영 환경의 log4j 나누기
다른 경로의 log4j 사용하기 log4j.xml 은 설정에 따라 많은 정보를 로깅하기도, 꼭 필요한 정보를 로깅하기도 한다. level 태그의 value 프로퍼티를 INFO 로 바꾸면 아주 많은 로그를 띄운다. 운영 중인 프로젝트의 log4j 에 너무 많은 로그가 쌓이면 금방 용량이 꽉차게 되고 장애가 일어난다. 개발용 log4j.xml 과 운영용 log4j.xml 이 가끔 나누어질 필요가 있다. -Dlog4j.configuration="file:///D:/log4j/log4j_all_log.xml"톰캣을 실행할 때, VM 속성에 위와 같이 입력해주면, 특정 경로에 있는 log4j.xml 을 사용할 수 있다.
이펙티브 자바, 쉽게 정리하기 - item 43. 람다보다는 메서드 참조를 사용하라
이펙티브 자바, 쉽게 정리하기 - item 43. 람다보다는 메서드 참조를 사용하라 메서드 참조 사용 예 메서드 참조 사용 전 @Test public void mapMergeTest() { Map scoreMap = new HashMap(); String[] names = {"John", "Jake", "Jack", "Ted", "Paul"}; scoreMap.put("Jake", 10); for (String name : names) { scoreMap.merge(name, 5, (o, n) -> o + n); // (*) 여기 } for (String name : scoreMap.keySet()) { System.out.println("name = " + name); System.out.println..
이펙티브 자바, 쉽게 정리하기 - item 42. 익명 클래스보다는 람다를 사용하라
이펙티브 자바, 쉽게 정리하기 - item 42. 익명 클래스보다는 람다를 사용하라 메서드 파라미터로 함수 객체를 받는 경우: 람다 미사용 @Test public void sortTest1() { System.out.println("beforeSort: " + words.toString()); Collections.sort(words, new Comparator() { @Override public int compare(String o1, String o2) { return Integer.compare(o1.length(), o2.length()); } }); System.out.println("afterSort: " + words.toString()); } 기존에는 위와 같이 익명 클래스를 이용해 처리..
이펙티브 자바, 쉽게 정리하기 - item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라
이펙티브 자바, 쉽게 정리하기 - item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 마커 인터페이스의 정의 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스 ex) Serializable 은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream 을 통해 쓸 수 있다(직렬화할 수 있다)고 알려준다. 마커 애너테이션 vs 마커 인터페이스 마커 인터페이스의 장점 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 사용할 수 있다. 마커 애너테이션은 타입으로 사용할 수는 없다. 타입으로 사용할 수 있기 때문에 런타임에야 발견할만한 오류를 컴파일 타임에 발견할 수도 있다. 마커 인터페이스는 적용 대상을 더 정밀하게 지정할 수 있다. ex) 특정 ..
이펙티브 자바, 쉽게 정리하기 - item 40. @Override 애너테이션을 일관되게 사용하라
이펙티브 자바, 쉽게 정리하기 - item 40. @Override 애너테이션을 일관되게 사용하라 @Override가 없을 때 하기 쉬운 실수 public class Item40Test { static class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * first + secon..
이펙티브 자바, 쉽게 정리하기 - item 39. 명명 패턴보다 애너테이션을 사용하라
이펙티브 자바, 쉽게 정리하기 - item 39. 명명 패턴보다 애너테이션을 사용하라 명명패턴이란? 메서드의 이름 앞을 test...로 짓는 등 이름에 패턴을 주어 Reflection 등으로 해당 패턴 검출 시 특정 작업을 수행하는 식의 코딩 형식이다. 명명패턴의 단점 오탈자의 위험 메서드, 파라미터, 클래스명 등 영역에 대한 설정이 불가능하다. 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다. ex) 특정 예외가 던져져야 올바르게 실행되는 메서드가 있다면? 예제 실행 샘플 1: @MethodTest, 일반 메서드 애너테이션 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MethodTest { } @..
ObjectMapper (Jackson) 커스텀 직렬화 역직렬화 구현
ObjectMapper (Jackson) 커스텀 직렬화, 역직렬화 ObjectMapper 는 객체를 잘 직렬화해서 JSON 문자열로 만들어주거나, JSON 문자열을 잘 파싱해서 객체로 만들어준다. 그런데 사용자 정의 객체의 경우엔, 개발자가 직접 직렬화, 역직렬화 시켜줄 필요가 있다. 이럴 때 어떻게 확장할 수 있을까? 다음과 같은 코드로 확장하면 된다. @Bean public ObjectMapper objectMapper() { SimpleModule module = new SimpleModule(); module.addSerializer(LocalDateTime.class, new CustomLocalDateTimeSerializer()); module.addDeserializer(LocalDateT..
자바 8 이상에서 날짜 올바르게 다루기
java.util.Date vs java.time.LocalDate 자바에서 날짜를 지원하는 대표적인 API 는 2가지가 있다. java.util.Date: Java 8 이전부터 존재한 API 이다. java.time.LocalDate: Java 8 부터 생긴 API 이다. java.util.Date 는 이름과 다르게 날짜 뿐 아니라 시간까지 다룬다. 반면, java.time.LocalDate 는 날짜만 다루는 역할을 하고, 시간까지 다루기 위한 java.time.LocalDateTime 이라는 API 가 따로 정의되어 있다. 위의 두개 객체 중에서 java.time 패키지에 있는 LocalDate 를 사용하는 것이 권장된다. 예전엔 날짜를 다루기 위해서 java.util.Date, java.util.C..
javadoc 한글 깨짐 문제 해결
문제 현상 ./gradlew javadoc 위 명령어로 javadoc 빌드를 했을 때, 아래와 같은 에러가 난다. error: unmappable character (0xEC) for encoding x-windows-949해결 방법 Javadoc 빌드 시 인코딩을 추가해주면 된다. Gradle 기준으로 gradle.build 에 아래의 내용을 추가하자. javadoc { options.addStringOption("locale","ko_KR"); options.addStringOption("encoding","UTF-8"); options.addStringOption("charset","UTF-8"); options.addStringOption("docencoding","UTF-8"); } 이제 다시 ..
톰캣 + JDK 환경에서 로컬 개발환경에 HTTPS 적용하기
JDK 에서 keytool 로 keystore 생성하기 JDK 내부에서 keytool 을 제공한다. JDK 디렉토리로 이동하여 아래 명령어를 입력해 keystore 를 생성하자. keytool -genkey -alias tomcat -keyalg RSA -keystore d:\tomcat.keystoreTomcat 에서 server.xml 파일 수정하기 위는 톰캣 9.xxx 버전 기준이다. 설정을 한 이후 서버 켜고 https://localhost 접속해보면 된다. 레퍼런스 톰캣 SSL HOW-TO 공식문서