조회한 빈이 모두 필요할 때? 이런 경우를 한번 생각해보자. 쇼핑몰에서 고객이 물건을 살 때 할인을 해준다고 가정하자. 이 때 할인 정책은 정액 할인 정책과 정율 할인 정책이 있다. 이 때, 할인 정책을 고객이 선택할 수 있는 경우를 가정해보자. 어떤 고객은 정율 할인 정책을 원할 것이고, 어떤 고객은 정액 할인 정책을 원할 것이다. 위 상황은 특정 할인 정책으로만 의존관계 주입이 필요한 것이 아니라, 입력이 오는대로 동적으로 의존관계 주입이 필요한 상황이다. 이럴 때는 조회된 2개 이상의 빈을 모두 불러와서, 그 중에 필요한 빈을 동적으로 사용해야한다. 이를 위해서 조회된 빈을 List나 Map 형식으로 가져오고, 여기서 필요한 빈으로 잠시 객체를 만든다. 그리고 그 객체를 활용해 할인 정책을 제공하는..
어노테이션 만들기 with @Qualifer 앞의 Qualifer를 활용한 경우 문제점을 보완하기 위해 어노테이션을 만든다. @Qualifier의 문제점은 @Qualifer 안에 있는 "xxxx"값이 문자열이라는 것이다. 예를 들어 @Qualifier("mainDiscountPolicy")라고 치고 싶은데, @Qualifer("maiiiiiinDiscountPolicy")처럼 의도치 않게 칠 수 있다. 이 경우, 문자 상태이기 때문에 코드 작성단계부터 에러를 감지하지 못한다. 어노테이션 만들기는 코드 작성단계부터 이런 오타를 잡아주기 위해 도입되었다고 보면 된다. 어노테이션 만들기 with @Qualifier 코드 @Target({ElementType.FIELD, ElementType.METHOD, El..
@Autowired에서 조회되는 빈이 2개 이상인 경우? @Autowired는 의존관계 주입 단계에서 요구하는 객체에 대해 같은 타입을 가지는 빈을 스프링 컨테이너에서 조회한다. 이 때 조회된 빈이 1개면 문제가 없다. 2개 이상일 경우, getBean(Type) 검색에서 빈이 2개 이상 조회되었을 때와 동일한 에러가 발생한다. 먼저 아래에서 조회되는 빈이 2개 이상이 되도록 유발해본다. @Component public class FixDiscountPolicy implements DiscountPolicy @Component public class RateDiscountPolicy implements DiscountPolicy 위와 같이 Component를 설정하면, 스프링 컨테이너에는 Discount..
스프링 생산성 향상, Lombok 라이브러리 사용 막상 개발을 해보면 대부분 불변 키워드인 final을 사용한다고 한다. final을 사용하게 되면 생성자도 만들어야 하며 Getter/Setter를 만들어야한다. 따라서, 필드 변수가 많은 경우에는 이런 코드를 하나하나 직접 생성하는 것 자체가 부담이 될 수 있다. 이런 것들을 자동화해주는 것이 Lombok이다. Lombok은 스프링, 혹은 자바를 지원하는 라이브러리고 @Getter @Setter 같은 어노테이션을 달아서 관습적인 수정자, 생성자들을 자동으로 만들어주는 라이브러리다. Lombok을 등록하는 방법을 알아보자. 가장 쉬운 방법은 Spring Boot에서 Dependencies에서 Lombok 라이브러리를 추가하는 것이다. 그렇지만, 개발을 한..
스프링, DI 시 Optional 처리하기 스프링에서 @ComponentScan으로 스프링 빈을 자동등록할 때, @Autowired의 에노테이션을 활용해서 스프링 빈의 의존관계가 자동 주입된다. @Autowired는 @Autowired(required = true)로 되어있다. 즉, 의존관계를 주입할 대상이 없으면 오류가 발생하게 된다. 그렇지만 의존관계를 주입할 대상이 없더라도 동작해야 하는 경우(수정자 주입)가 있다. 이 때는 어떻게 동작을 해야할까? 이 상황에서 동작가능한 방법은 세 가지가 있다. @Autowired(required = false) 설정 매개변수 앞에 @Nullable 매개변수를 Optional 로 감싸기 위 방법들에 대해 하나하나 차이점을 아래에서 살펴보려고 한다. 1. Autow..