본문 바로가기

STUDY/TIL

의존관계 주입 방법 네 가지

스프링을 기준으로 한다.

1. 필드 주입

  • 필드에 바로 주입하는 방법
  • 가장 흔히들 사용하는 방법 중 하나
  • 코드가 간결함
@Autowired
private MemberService memberService;

2. setter 주입

  • 필드의 값을 변경하는 setter 메서드를 이용하는 방법
  • 자바빈 프로퍼티 규약의 수정자 메서드(setter) 방식을 이용
  • 수정자 메서드를 생성해야하고, public으로 열어두어야 함
private MemberService memberService;

@Autowired
public void setMemberService(MemberService memberService) {
    this.memberService = memberService;
}

3. 생성자 주입*

  • 클래스의 생성자를 통해 의존관계를 주입 받는 방법
  • 생성자가 호출되는 시점에 단 한 번만 호출되는 것이 보장됨
  • 필드에 final을 사용할 수 있으므로 불변성이 보장됨
  • 클래스 내에 한 개의 생성자만 존재할 경우 @Autowired를 생략할 수 있음
private final MemberService memberService;

@Autowired
public MemberController(MemberService memberService) {
    this.memberService = memberService;
}

4. 일반 메서드 주입

  • 말그대로 일반 메서드를 통해 주입하는 방법
  • 한 번에 여러 필드를 주입받을 수 있음
  • 잘 사용되지 않음
private MemberService memberService;

@Autowired
public void init(MemberService) {
    this.memberService = memberService;
}

어떤 방식을 이용해야 하나?

생성자 주입을 이용하자.
스프링에서도 생성자 주입 방식을 권장하고 있다.

왜?

1. 불변성을 보장한다.

만약 수정자 주입(setter)를 사용하면 의존관계 주입 메서드를 public으로 열어두어야 한다. 이는 외부에서도 얼마든지 의존관계를 변경할 수 있다는 뜻이다. 변경해서는 안 되는 메서드를 열어두는 것은 좋지 않다.
대부분의 의존관계는 변경되지 않으며 오히려 변해서는 안 된다.(불변성을 유지해야 한다)
생성자 주입 방식은 객체 생성 시에 한 번만 호출되므로 불변성을 유지하도록 설계하는 것이 가능하다.

2. 누락되지 않는다.

만약 수정자 주입 방식을 선언한 경우, 외부에서 setter메서드를 호출하지 않으면 의존관계가 누락된다. 특히 여러 개의 의존관계를 주입해야 할 때는 더욱 누락되기 쉽고, 의존관계를 정확히 주입하기 위해서는 해당 클래스를 열어 확인해야 하는 번거로움도 발생한다.

3. final키워드를 허용한다.

필드에 final키워드를 사용할 수 있기 떄문에 만약 생성자에서 값이 설정되지 않는다면 컴파일 시점에서 오류를 발견할 수 있다.

번거로움을 줄이고 싶다면 롬복을 사용해라

Lombok라이브러리를 사용하면 @RequiredArgsConstructor 기능을 사용할 수 있다. 이 기능은 final 키워드가 붙은 모든 필드를 사용하는 생성자를 자동으로 만들어준다.

'STUDY > TIL' 카테고리의 다른 글

JS | Truthy와 Falsy  (0) 2021.07.26
React | Uncontrolled Components  (0) 2021.07.25
Composite Key (복합 키)  (0) 2021.07.07
객체지향 설계 원칙 5가지 (SOLID)  (0) 2021.07.05
Mock, TestDouble  (0) 2021.06.22