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