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
- db
- 스프링 핵심 기능
- 알고리즘
- 그리디
- springdatajpa
- Android
- Proxy
- pointcut
- 자바
- spring
- 백준
- http
- JPQL
- java
- Servlet
- kotlin
- Greedy
- jpa
- QueryDSL
- transaction
- 인프런
- 스프링 핵심 원리
- Spring Boot
- JDBC
- Thymeleaf
- 김영한
- SpringBoot
- AOP
- 스프링
- Exception
Archives
- Today
- Total
개발자되기 프로젝트
의존관계 주입 방법 본문
1. 의존관계 주입 방법
- 생성자 주입
- 수정자 주입(setter 주입)
- 필드 주입
- 일반 메서드 주입
2. 생성자 주입.
- ???? : @Autowired가 있네?
- 컨테이너에서 같은 타입의 빈 꺼내옴.
- 집어넣음
- 특징
- 생성자 호출 시점에 딲 1번 만 호출되는 것이 보장됨.
- 불변, 필수 의존관계에 사용--> set을 public으로 열어두면 안됨
(getter, setter 막만들면 안됨!)
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
//private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
private final DiscountPolicy discountPolicy; //이렇게하면 인터페이스에만 의존함.
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
- final로 하면 값이 무조건 있어야함! 직접 지정하거나 생성자 있어야함.
final : 한 번 값을 넣으면 바뀌지 않음. 말 그대로 final 그러니 무조건 값은 있어함. - 만약 생성자가 따악 1개만 있다? @Autowired 생략해도 자동 주입.
- 생성자 주입은 언제 일어날까?
- OverServiceImpl을 생성하려면 생성자를 불러야함
- 즉, 빈을 등록하면서 의존관계 주입 같이 일어남.
3. 수정자 주입(setter 주입)
- setter라는 필드의 값을 변경하는 수정자 메서드를 통해 의존관계 주입!
- 특징
- 선택, 변경 가능성이 있는 의존관계에 사용. setter는 필드값을 변경하기 때문
- 자바 빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법/
@Component public class OrderServiceImpl implements OrderService{ private MemberRepository memberRepository; @Autowired public void setMemberRepository(MemberRepository memberRepository) { this.memberRepository = memberRepository; }
- 어떻게 등록되는 거지...?
- @ComponentScan에 의해 OverderServiceImpl을 스프링 빈으로 등록
- 스프링 컨테이너가 @Autowired가 걸린 놈을 자동으로 주입함.
- 스프링 컨테이너 라이프 사이클
- 스프링 빈 등록
- 연관관계 주입 - Setter주입의 경우
- 스프링 빈 등록 후 연관관계 주입. - @Autowired(requited = false)로 지정하면 주입할 대상이 없어도 동작함.
- 자바빈 프로퍼티
- 자바에서는 필드의 값을 직접 변경하지 한고, getter, settter를 통해 값을 읽거사 수정함.
- 이를 자바빈 프로퍼티 규약이라함.
4. 필드 주입
- 필드에 바로 때려박아버리기
@Component
public class OrderServiceImpl implements OrderService{
@Autowired
private final MemberRepository memberRepository;
- 코드가 간결하니 좋다.
- 근데! 필드주입을 권장하지 않는다.. 안티패턴임
- 외부에서 변경이 불가능해서 테스트 하기 어렵다
- 만약 더비 repository로 테스트를 하고 싶으면.. setter도 없고.. 무슨 방법이 없다..
- 굳이 하려면은 setter를 따로 만들어 줘야햠.
- 그럴 바에야 그냥 setter에 @Autowired걸면됨 ㅋㅋㅋㅋ - 쓰지말자
- 단, application 실제 코드와 관계 없는 스프링 부트 테스트 코드에서 사용.
5. 일반 메서드 주입
- 일반 메서드를 통해서 주입 받을 수 있다.
- 한번에 여러 필드를 주입 받을 수 있다.
- 일반적으로 잘 사용 안함..생성자 주입, setter주입으로 웬만하면 됨..
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy){
this.memberRepository = memberRepository;
this. discountPolicy = discountPolicy;
}
- 참고로 의존관계 자동 주입은 스프링 컨테이너가 관리하는 빈이어야 작동한다.
- 스프링 빈이 아닌 다른 클래스에서 @Autowired하면 아무 것도 안함 ㅋㅋㅋㅋ
'인프런 > [인프런] Spring 핵심원리 이해' 카테고리의 다른 글
생성자 주입을 선택해! (0) | 2021.07.29 |
---|---|
@Autowired 옵션처리 (0) | 2021.07.29 |
컴포넌트 스캔, 중복 등록, 충돌 (0) | 2021.07.28 |
컴포넌트 스캔, 필터 (0) | 2021.07.28 |
Component Scan의 탐색 위치와 스캔 대상 (0) | 2021.07.28 |
Comments