본문 바로가기
Learning-log/Spring & JPA

(스프링 핵심 원리 - 기본편) 7-(2) 옵션 처리, (3)생성자 주입을 선택해라!

by why제곱 2023. 4. 7.

- 옵션 처리

  • 주입할 스프링 빈이 없어도 동작해야 할 때 @Autowired만 사용하면 required 옵션의 기본값이 true이므로 오류 발생
  • 자동 주입 대상을 옵션으로 처리하는 방법
    • @Autowired(required = false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨(실행 안하고 지나감)
    • @Nullable : 자동 주할 대상이 없으면 null 입력됨
    • Optional<> : 자동 주입할 대상이 없으면 Optional.empty가 입력됨
    • 아래는 member가 스프링 빈이 아니지만 실행에 성공함.

- 생성자 주입을 선택해라!

  • 예전에는 수정자 주입과 필드 주입을 많이 사용했지만, 요즘은 생성자 주입 권장
  • 이유는?
    • 불변하기 때문 
      • 대부분 의존관계 주입은 한번 일어나면 애플리케이션 종료까지 의존관계를 변경할 필요가 없으며 오히려 대부분의 의존관계는 변경되면 안 됨
      • 수정자 주입을 사용하면 set~ 메서드를 public으로 열어둬야 함
      • 누군가 실수로 변경할 수도 있고, 변경하면 안되는 메서드를 열어두는 건 좋은 설계가 아님
      • 생성자 주입은 객체 생성 시 한 번만 호출 되므로 이후에 호출되는 일이 없어서 불변하게 설계 가능
    • 누락을 방지하기 위함
      • 생성자 주입을 선택하면 개발자가 해당 기능을 사용하기 위해 객체를 생성할 때, 의존 관계가 명시된 생성자의 형식을 지키지 않으면 컴파일 오류 발생=> 개발자가 이를 누락시키지 않을 수도 있고, 무슨 의존관계가 있는지 인지도 가능하게 함
      • 객체 생성을 위해 만들어 놓은 필드에 final 설정하는 게 좋음. 생성자에서 혹시라도 값이 설정되지 않은 오류를 컴파일 시점에서 오류 발생시킴.
  • 생성자 주입 방식은 프레임워크에 의존하지 않고, 순수 자바 언어의 특징을 잘 살리는 방법
  • 기본으로 생성자 주입 사용하고 옵션으로 가끔 필요하면 수정자 주입 사용하기