본문 바로가기
Backend - Java Spring/Spring Core

[SpringCore 핵심원리] 생성자주입과 롬복

by VictorMeredith 2024. 2. 17.

1. 불변

- 대부분의 의존관계 주입은 한번 일어나면 앱 종료시점까지 의존관계를 변경할 일이 없다. (불변해야하는 경우가 많다.)

- 수정자는 settter를 public으로 열어두어야 하기 때문에 위험하다.

- 테스트코드할때 의존성 주입을 넣어야하는 파라미터를 알려줌(컴파일 오류 단에서 해결 가능)

- final을 넣을 수 있다. 

- 누락을 막는데에 컴파일러의 도움이 가능하다.

- 생성자주입을 쓰되, 가끔 옵션이 필요하면 수정자 주입을 사용하면 된다.

 

2. Lombok

- @ToString, @Getter, @Setter, 

- @RequiredArgsConstructor :(권장) 생성자 주입에서 쓰면됨. final이 붙은 필드만을 모아서 생성자를 자동으로 만들어준다.

- @AllArgsConstructor : 모든 필드를 가진 생성자를 생성한다. 

생성자를 만들어준다! 주입도 되겠구만!

 

3. Autowired 조회 빈이 두개 이상 문제인 경우

- Autowired는 타입으로 조회하기 때문에 조회한 빈이 두개 이상인 경우 문제가 된다.

- 하나의 빈을 기대했는데 두개가 발견되었다고 오류가 알려줌.

- 하위타입으로 지정하는 것은 DIP 위반이며 유연성이 떨어짐.

- 같은 타입의 스프링 빈이 2개 있을 때 해결이 안되니까 다른 해결방법을 알아보자.

 

 1) @Autowired 필드명 매칭

  - 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다.

  - DiscountPolicy rateDiscountPolicy 이런걸로 딱 맞춰줘야함. 이름이 맞아야함

 2) @Qualifier 끼리 매칭 (빈 이름 매칭)

  - 빈 등록 시 @Qualifier 를 붙여준다

이런 식으로
이런 식으로

 

파라미터에 @Qualifier 를 추가해주면 된다.

  - 수정자에서도 사용 가능하다.

  - 경험상 @Qualifier 쓸때는 이거 끼리만 찾는 용도로만 사용하자 명확하게

 3) @Primary 사용

  - 자주 사용함

  - 우선순위를 정하는 방법이다.

  - @Autowired 시 여러 빈이 매칭되면 @Primary가 우선순위를 가진다.

이렇게 붙임

  - 메인 DB는 @Primary를 사용하고 , 서브DB에는 @Qualifier로 지정해서 명시적으로 획득하는 방식으로 사용하면 된다.

  - 참고로 @Qualifier 가 우선순위가 높다.

댓글