전체 글
3. private 생성자나 열거타입으로 싱글턴을 보증하라
싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜 구현으로 대체할 수 없다. 싱글턴을 만드는 방식은 보통 둘 중 하나다. 두 방식 모두 생성자는 private로 감춰두고 , 유일한 인스턴스에 접근할 수 있는 수단으로 public 적정 멤버를 만들어둔다. public static final 필드 방식의 싱글턴 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { } public void leaveT..
2. 생성자에 매개변수가 많다면 빌더를 고려하라
정적 팩터리 메서드와 생성자에는 같은 제약이 있다. 매개변수의 변동이 많을 때 적절히 대응하기 어려워 지는 것이다. 프로그래머들은 이럴 때 점층적 생성자 패턴을 즐겨 사용했다. 점층적 생성자 패턴이란 쉽게 말해 여러개의 생성자를 만드는 것이다. 매개변수가 다른 생성자들을 만들어 각각의 상황에 대응하지만 한계가 명확히 보인다. 코드가 복잡해지는 것 뿐만 아니라 매개변수가 추가되거나 변경될 때 마다 생성자를 변경해줘야 한다. 그 다음은 getter/setter를 사용하는 자바 빈즈 패턴이 있다. new로 객체를 생성하고, setter를 이용해 값을 넣어줄 수 있다. 하지만 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다. 값이 유효한지 알 수 없고, 값을 어디까지 설정해줘야 하는지 알 수..
[Java] Enum, 열거타입
상수 목록을 담을 수 있는 데이터 타입 특정한 변수가 가질 수 있는 값을 제한 가능. Type-Safety를 보장 할 수 있다. 싱글톤 패턴을 구현할 때 사용하기도 한다. 문자열과 비교해 IDE의 폭넓은 지원을 받을 수 있다. ( 자동완성, 오타검증 등) 리팩토링 시 변경 범위 최소화 java의 Enum은 코드의 가독성을 생각하며 만든 기능을 갖춘 클래스이기 때문에 여러가지 장점이 있다. 1. 데이터들의 연관관계 표현 특정 값을 이용해 또다른 값을 만들어내야 하는 상황은 많이 발생한다. public String getTypeFromValue(String value){ if( "a".equals(value) ){ return "aaa"; } else if( "b".equals(value) ) { retur..
1. 생성자 대신 정적 팩터리 메서드를 고려하라
클래스의 인스턴스를 얻는 전통적인 방법은 public 생성자이다. 하지만 클래스는 생성자와 별도로 클래스의 인스턴스를 반환하는 static factory method를 제공 할 수 있다. 이 방식에는 장단점이 모두 존재한다. 장점 1. 이름을 가질 수 있다. 생성자는 매개변수와 생성자만으로는 반환될 객체를 제대로 설명 할 수 없다. 하지만 정적 팩터리 메소드는 네이밍을 통해 반활될 객체의 특성을 설명할 수 있다. 예를들어 생성자인 BingInteger(int , int , Random) 과 정적 팩터리 BingInteger.probablePrime 중, 어느 쪽이 값이 소수인 BigInteger를 반환하는 것에 대하여 잘 설명할 수 있을지를 생각해보자. 프로젝트 중 하나의 인터페이스에서 특정 매개변수를 ..
[SpringBoot] MapStruct에 대하여
대부분의 애플리케이션에서 POJO를 다른 POJO로 변환하는 코드를 많이 볼 수 있다. 예를 들어 일반적인 유형의 변환은 엔티티와 클라이언트의 DTO 간에 발생한다. 이것이 바로 MapStruct가 해결하는 문제이다. 매퍼를 수동으로 만드는 것은 대부분 반복적이고, 시간이 많이 소요되며, 실수의 여지가 많다. 비즈니스 로직에 섞이게 되면 소스 또한 빌더의 호출로 인해 가독성이 떨어지게 된다. 해당 라이브러리는 빈 매퍼 클래스를 자동으로 생성해준다. 어노테이션 기반으로 작성되며 Bean으로 등록할 수 있어 여러 프레임워크의 DI를 활용하여 사용할 수도 있다. 같은 기능의 라이브러리인 modelMapper에 비해 리플렉션이 없이 메서드 호출만 하기 때문에 성능에 대한 영향이 없다. 리플렉션이란? 클래스, 필..
[SpringBoot] 실행환경에 따른 설정파일 변경 ( @EnableConfigurationProperties , @ConfigurationProperties )
어플리케이션의 실행환경이 계속 달라질 수 있다. 다른 서버, 다른 포트를 사용해야 할 때 마다 어플리케이션을 새로 빌드해야 한다면 정말 불편해진다. 웹 애플리케이션의 실행 환경에 따른 구성설정의 외부화를 이용해 설정파일(yml, properties)을 사용했다. 먼저 알아볼 것은 @EnableConfigurationProperties와 @ConfigurationProperties다. @ConfigurationProperties 는 Spring Boot 에서 properties 파일에 정의된 프로퍼티 중 주어진 prefix 를 가지는 프로퍼티들을 매핑하여 Bean 으로 만들수 있게 해주는 어노테이션이다. yml또는 properties 파일의 값을 bean으로 만들어 사용할 수 있게 된다. @EnableCo..