[spring] 롬복과 의존성 우선순위 (스프링 기본편 by 김영한)

su_y2on·2022년 1월 25일
1

Spring

목록 보기
22/30
post-thumbnail

Lombok(롬복)

롬복은 의존성주입 코드를 대신 작성해주는 편리한 라이브러리입니다.
롬복을 사용하면 아래와 같은 기존 코드가

@Component
public class OrderServiceImpl implements OrderService {

      private final MemberRepository memberRepository;
      private final DiscountPolicy discountPolicy;
      
      @Autowired
      public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
          this.memberRepository = memberRepository;
          this.discountPolicy = discountPolicy;
      }
      
}

@RequiredArgsConstructor 이거 하나만 붙여주면 이렇게나 간단해집니다. 롬복이 따로 생성자 주입 코드를 넣어줍니다.

@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {

      private final MemberRepository memberRepository;
      private final DiscountPolicy discountPolicy;
      
}




생성자주입 뿐만아니라 getter , setter, tostring의 기능들도 어노테이션만 붙여주면 코드작성없이 사용할 수 있습니다👍

@Getter
@Setter
@ToString
public class HelloLombok {

    private String name;
    private int age;

    public static void main(String[] args) {
        HelloLombok helloLombok = new HelloLombok();
        helloLombok.setName("asdfd");

        String name = helloLombok.getName();
        System.out.println("name = " + name);

        System.out.println(helloLombok);

    }
}




중복 스프링 빈 : 스프링빈의 우선순위

@Autowired는 일반적으로 스프링 빈들중 타입이 일치하는 것을 찾아 주입해줍니다. 그런데 만약 타입이 같은게 두개 이상이라면 어떻게 될까요??

바로 NoUniqueBeanDefinitionException오류를 냅니다. 이렇게 중복 빈이 생길 때 오류를 내지 않도록 하는 해결방법은 크게 3가지가 있습니다



1. @Autowired 필드명

최대한 간단한 예제를 다루기 위해 필드주입을 사용하면 아래와 같이 원래는 discountPolicy라고 필드명을 적어줬다면 구현체의 타입과 일치하게 필드명을 rateDiscountPolicy(or fixDiscountPolicy)로 변경해줍니다. 그러면 DiscountPolicy타입의 빈이 두개지만 그중에 필드명과 같은 구체타입을 가진 rateDiscountPolicy를 주입해줍니다.

@Autowired
private DiscountPolicy discountPolicy
@Autowired
private DiscountPolicy rateDiscountPolicy

2. @Qualifier

이는 주입시에 추가적인 방법을 제공해주기위해 구분자를 붙여주는 방식입니다. 따라서 빈의 이름은 여전히 rateDiscountPolicy입니다.

@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}

그 뒤에 이렇게 주입시에 DiscountPolicy앞에 붙여줍니다. 스프링은 바로 Qualifier에 들어온 값과 같은 Qualifier를 갖는 스프링빈을 찾아 넣어줍니다.

@Autowired
public OrderServiceImpl(MemberRepository memberRepository, 
			@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
                          
      this.memberRepository = memberRepository;
      this.discountPolicy = discountPolicy;
      
}

3. @Primary

마지막으로 primary는 여러가지 빈이 매칭 되었을 때 우선권을 주는 어노테이션입니다. 아래와 같이 각각 등록되었다면 rateDiscountPolicy가 우선권을 갖게 됩니다.

@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
  
@Component
public class FixDiscountPolicy implements DiscountPolicy {}

@Primary vs @Qualifier

둘이 충돌하면 어떤 것이 우선순위가 높을 까요? 바로 @Qualifier입니다. Primary보다 Qualifier가 구체적이기 때문입니다. 따라서 중복이 일어나는 빈들을 평소에 자주 쓰는 빈은 Primary로 해놓고 가끔 쓰이는 빈을 Qualifier로 조절해주는 방식으로 활용하기에 좋습니다🍒

0개의 댓글