Spring Optional 처리, 생성자 주입의 강점

강정우·2023년 11월 16일
0

Spring-boot

목록 보기
14/73
post-thumbnail

옵션처리

  • 주입할 스핑 빈이 없어도 동작해야할 때가 있다.
    그런데 @Autowired 만 사용하면 required 옵션이 디폴트값이 true로 되어있어서 자동 주입 대상이 없으면 오류가 발생한다.
  • 아래는 예제 테스크 코드이다.
  1. @Autowired(required = false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출이 안 됨.
  2. org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null이 들어감.
    • 특이한 점은 IDEA IDE에서 유일하게 컴파일 전에 식별하여 오류를 띄워주는 방법이다.
    • 또한 자동주입에서 생성자에 파라미터가 3개 중 2개만 있어도 동작시키고 싶을 때 사용하는 방법이다.
  3. Optional<> 자동 주입할 대상이 없으면 Optional.empty 가 입력된다.

생성자 주입의 강점

1. 불변

  • 과거에는 수정자 주입이나 필드 주입을 많이 사용했다.

  • 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다.
    오히려 대부분의 의존관계는 애플리케이션 종료 전까지 변하면 안 된다. (불변해야한다.)

  • 수정자 주입을 사용하면, setXXX메서드를 public으로 열어두어야 한다.
    -> 누군가 실수로 변경할 수 있고, 변경하면 안되는 메서드를 열어두는 것이 좋은 설계 방법은 아니다.

  • 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되는 일이 없다. 따라서 불변하게 설계할 수 있다.

2. 누락

  • 프레임워크 없이 순수한 자바 코드를 작성하여 단위 테스트하는 경우가 되게 많다. (좋은 테스트라고 볼 수 있다.)

  • 수정자 메서드가 있다고 가정할 때 특정 유닛만 테스트하려고 하면 반드시 imple을 해야하는 경우가 생기는 부분이 바로 생성자 주입을 쓰지 않을 때의 단점이다.

  • 그래서 첫번째 사진에서 주석을 살리고 드래그한 부분을 주석처리하면
    다시 테스트 부분에서 빨간줄이 그어진 부분에만 아래 사진처럼 필요한 특정 생성자 함수를 넣어주면 된다.(요즘에 mob library가 나와서 사용하면 테스에 필요한 가짜 객체를 만들어서 자동으로 넣어준다.)

3. final keyword

  • 파이널 키워드는 뭘까? -> 딱 한 번 생성할 때 정해지면 안 바뀐다는 것이다.
    즉, 생성자에서만 값을 넣어줄 수 있고 나머지 부분에서는 값을 바꿀 수 없다.

  • 또한 final keyword를 등록해두면 compile시 반드시 값이 있어야하기 때문에 개발자가 생성자 주입부분을 깜빡하고 넣지 않아도 개발과정에 알아차릴 수 있다.

수정자 주입을 포함한 나머지 주입 방식은 모두 생성자 이후에 호출되므로, 필드에 final 키워드를 사용할 수 없다.
이는 반드시 생성자 주입을 써야만 필드에 final keyword를 주입할 수 있다.

3-1. 정리

  • 생성자 주입 방식을 선택하는 이유는 여러가지가 있지만 프레임웤에 의존하지 않고 순수한 자바 언어의 특징을 잘 살리는 방법이다.
  • 기본으로 생성자 주입을 사용하고, 필수 값이 아닌 경우에는 수정자 주입 방식을 옵션으로 부여하면 된다.
    생성자 주입과 수정자 주입을 동시에 사용할 수 있다.
  • 항상 생성자 주입을 선택하고 가끔 옵션이 필요하다면 수정자 주입을 선택하지만 필드 주입은 사용하지 않는게 좋다.
  • 필드주입을 사용하는 순간 테스트 같은 곳에서 값을 넣을 수 있는 방법 자체가 없고, 어플리케이션이 굉장히 딱딱하지고 스프링 컨테이너 없이는 테스트 조차 불가능하기 때문이다.
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글