Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

생성자 주입을 선택해! 본문

인프런/[인프런] Spring 핵심원리 이해

생성자 주입을 선택해!

Seung__ 2021. 7. 29. 23:04
  • 최근에는 대부분 생성자 주입을 권장해!
  • 여러가지 이유가 있다.

1. 불변


  • 대부분의 의존관계 주입은 변경할 일이 없다.
  • 오히려 대부분의 의존관계는 애플리케이션 종료 전 까지 변하면 안된다!
  • 수정자 주입을 사용하면, setXXX를 public으로 열어둬야함.
  • 누군가 변경할 수 도 있고,,, 변경하면 안되는 것을 열어두는 것 은 좋지않아..
  • 생성자 주입을 객체 생성할 때 딱! 1번만 호출됨!
  • 이후에 호출될 일 없음!!! 
  • 따라서 불변하게 설계가 쌉가능

 

2. 누락


  • 프레임 워크 없이 순수한 자바 코드를 단위 테스트 하는 경우에....
  • 코드만 보면 의존관계를 확인하기 어렵다.
  • Setter 주입을 사용하면.. 코드를 직접 안까지 까보거나, 컴파일을 해야 확인이 가능하다.
  • 하지만 생성자 주입을 사용하면 의존관계를 주입 안하면 에러가 발생하기 때문에
    누락할 가능성이 없다.
  • 아~! 뭐가 필요하군!
  • 그리고 가짜 객체도 넣어줄 수 있어. 타입만 일치한다면 ㅋㅋ
        @Test
        void createOrder(){
    
            MemberRepository memberRepository = new MemoryMemberRepository();
            memberRepository.save(new Member(1L, "name", Grade.VIP));
    
    
            OrderServiceImpl orderService = new OrderServiceImpl(memberRepository,new FixDiscountPolicy());
            Order order = orderService.createOrder(1L, "itemA", 10000);
            Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);
        }
    }​
  • 즉, 생성자 주입을 사용하면 생성시 뭐가 필요한지 빨리 캐치할 수 있음! 

 

 

3. final 키워드


  • final은 한 번 생성할 때 정해지면 바뀌지 않음!!!
  • 초기 값을 넣어주는 것이 아니면
  • 생성자를 통해서만 값을 정해줄 수 있음.
  • 생성자 주입을 사용하면 final 키워드 사용가능.
  • 그래서 생성자에서 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 막아줌!
  • 실수를 막아줄 수 있음.
  • 즉 final 넣고 생성자 안만들어주면 에러발생시켜서 빨리 캐치가능.
  • 컴파일 오류는 세상에서 가장 빠르고,,, 소중한 오류다

 

4. 참고


  • 수정자 주입을 포함한 나머지 방식은 모두 생성자 이후에 호출됨.
  • 따라서 필드에 final 키워드 사용 불가
  • 왜냐 fianl은 초기에 값을 설정하거나 생성자를 통해서만 값을 정할 수 있기 때문
  • 그러고 값을 변경하지 못함.

 

 

5. 정리


  • 새성자 주입을 선택하는 이유는 프레임워크에 의존하지 않고, 자바 언어의 특징을 살리는 방법임
  • 기본으로 생성자 주입 사용, 필수 값이 아닌 경우 수정자 주입 방식을 옵션으로 부여.
  • 단, 생성자 주입과 수정자 주입 동시 사용 불가
  • 항상! 생성자!주입! 
  • 가끔! 옵션이 필요해? 그러면 수정자 주입을 선택!
  • 필드 주입은 멈춰!
  • 필드 주입 사용하면 test때 값을 넣어 줄 방법이 없음....스프링 컨테이너 무조건 띄워야함..
Comments