본문 바로가기
Spring

TIL-4 다양한 의존관계 주입방법, 생성자 주입

by 다오__ 2023. 5. 17.

의존관계 주입은 크게 4가지 방법이 있다.

생성자, 수정자(setter), 필드 주입, 일반 메서드 주입

 

1. 생성자주입

  • 생성자 호출 시점에 1번만 호출되는 것이 보장된다.
  • 불변, 필수 의존관계에 사용된다.

수정이 가능하도록 해버리면 누군가가 변경할 일이 있어 문제가 생길 있다.

필수로 값이 들어가야 사용한다.

중요! 생성자가 1개라면 @Autowired 어노테이션을 생략해도 된다.

 

 

2. 수정자 주입

 

Setter 불리는 필드의 값을 변경하는 수정자 메서드를 통해 의존관계를 주입한다.

  • 선택, 변경 가능성이 있는 의존관계에 사용한다.
  • 자바 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다.
  • setMemberRepository
  • setDiscountPolicy
  • 메서드를 호출할 의존관계 주입이 일어난다.

 

 

3. 필드 주입

) @Autowired private MemberRepository memberRepository

그대로 필드에 곧바로 주입하는 것이다.

 

코드가 간결해서 많은 개발자들이 사용하지만 외부에서 변경이 불가능해서 스프링에서 테스트하는 것이 아닌 순수 자바코드로 테스트할 때에 하기 힘들다는 치명적인 단점이 있다.

 

 

이를 해결하려면 번거롭게도 setter 주입을 해야 한다.

이럴 바에는 그냥 setter 주입을 하는 낫다.

 

4. 일반 메서드 주입

 

 

옵션처리

주입할 스프링 빈이 없어도 동작해야 때가 있다.

그런데 @Autowired 사용하면 required 옵션의 기본값이 true 되어있어서 자동 주입 대상이 없으면 오류가 발생한다.

 

자동 주입 대상을 옵션으로 처리하는 방법은 다음과 같다.

  • @Autowired(required=false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨

org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null 입력된다.

  • Optional<> : 자동 주입할 대상이 없으면 Optional.empty 입력된다.

 

Member 스프링 빈이 아니다

 

 

 

개발자는 생성자 주입을 선택하는 것이 좋다.

'불변'

  • 대부분의 의존관계는 보통 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다. 오히려 종료 전까지 변하면 안된다.
  • 수정자 주입을 하용 하면, setXXX메서드를 public으로 열어 두기에 누군가 실수로 변경할 수도 있고 변경하면 안되는 메서드를 열어 두는 것은 나쁜 설계이다.

 

'누락'

  • 순수 자바코드로 테스트 일이 많은데 setter 주입을 하게 되면 nullPointerException 터질 확률이 높다. Setter 따로 주입 해주어야 하는데 이를 개발자가 모두 알고 있어야 하기 때문이다.
  • 생성자주입을 하는 경우, 파라미터로 넘기지 않으면 컴파일 에러를 내기 때문에 바로 잡을 있다.
  • 또한 final 키워드를 사용해 값이 담기지 않는 것을 막을 있어 효율적이다.

 

 

lombok

하지만.

생성자코드는 코드가 길기 때문에 만들기 귀찮기도 하다. 이를 해결하기 위해 롬복이라는 라이브러리가 있다. 코드를 최적화해보자

 

Build.gradle

 

 

플러그인도 설치를 해주자

 

 

해당 옵션도 켜주어야 한다.

 

 

롬복을 사용해보자

 

@Getter @Setter 어노테이션을 사용하면 자동으로 getter,setter메서드들을 생성한다.

@ToString : toString메서드가 만들어진다.

@RequiredArgsConstructor : final 붙은 선언한 변수를 가지고 생성자를 만들어준다

 

 

생성자를 만들어주어 코드가 간단 해진걸 있다.