Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Spring Boot
- spring
- QueryDSL
- 스프링 핵심 기능
- 그리디
- 스프링
- kotlin
- JDBC
- 김영한
- jpa
- Greedy
- Exception
- java
- SpringBoot
- 스프링 핵심 원리
- pointcut
- springdatajpa
- AOP
- 자바
- db
- JPQL
- transaction
- Servlet
- 백준
- 알고리즘
- Android
- Thymeleaf
- 인프런
- http
- Proxy
Archives
- Today
- Total
개발자되기 프로젝트
생성자 주입을 선택해! 본문
- 최근에는 대부분 생성자 주입을 권장해!
- 여러가지 이유가 있다.
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때 값을 넣어 줄 방법이 없음....스프링 컨테이너 무조건 띄워야함..
'인프런 > [인프런] Spring 핵심원리 이해' 카테고리의 다른 글
조회할 빈이 2개 이상일 경우? (0) | 2021.07.30 |
---|---|
의존관계 주입, lombok (0) | 2021.07.29 |
@Autowired 옵션처리 (0) | 2021.07.29 |
의존관계 주입 방법 (0) | 2021.07.29 |
컴포넌트 스캔, 중복 등록, 충돌 (0) | 2021.07.28 |
Comments