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 |
Tags
- 파이썬
- Postman
- 컴프리헨션
- 행렬곱
- 토이프로젝트
- yaml
- 함수
- API
- 람다함수
- 코딩테스트
- Jar배포
- 클래스
- 프리온보딩
- sqlalchemy
- cerbot
- Django
- todo project
- 집계함수
- spring boot
- EC2
- 프로그래머스
- 파이써닉코드
- numpy
- RDS
- Comprehension
- 백엔드 인턴십
- PYTHON
- self
- 조건연산
- mock server
Archives
- Today
- Total
build my life
[Spring] AppConfig를 통한 의존관계 주입 본문
728x90
❗기존 구현 코드에는 인터페이스를 의존하는 것 뿐 아닌 구현체 클래스에도 의존하는 문제점이 있음
public class OrderServiceImpl implements OrderService {
// 인터페이스 뿐만 아니라 구현체도 의존하게 됨
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
OrderServiceImple
-> DiscountPolicy
뿐 아니라 FixDiscountPolicy
or RateDiscountPolicy
도 의존
✅ 인터페이스만 의존할 수 있도록 코드 수정
public class OrderServiceImpl implements OrderService {
// 인터페이스만 의존
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
하지만 구현체가 없기 때문에 코드 실행했을 경우 Null Pointer Exception 발생!
=> 해결하기 위해서 구현 객체를 대신 생성하고 주입해주어야 함 => AppConfig
AppConfig
애플리케이션의 전체 동작 방식을 구성(config)하기 위해 _'구현 객체를 생성'_하고 _'연결'_하는 _'책임'_을 가지는 클래스
1. 실제 동작에 필요한 구현 객체를 생성
2. 생성자를 통해서 주입(연결)
먼저, 의존 관계 주입을 위해 생성자를 만든다.
public class OrderServiceImpl implements OrderService {
...
public OrderServiceImpl(DiscountPolicy discountPolicy, MemberRepository memberRepository) {
this.discountPolicy = discountPolicy;
this.memberRepository = memberRepository;
}
그 다음, AppConfig
에서 OrderServiceImpl
객체를 생성자를 통해서 주입(연결)
public class AppConfig {
public OrderService orderService() {
return new OrderServiceImpl(new FixDiscountPolicy(), new MemoryMemberRepository());
}
}
결과적으로 의존관계 주입은 외부에서 결정이 되기 때문에 변경되는 부분에서도 수정이 쉽다.
OrderServiceImpl
입장에서는 생성자를 통해 어떤 구현 객체가 들어올지 알 수 없고 실행에만 집중하면 된다.
AppConfig
에서도 역할에 따른 구현이 잘 보이도록 구현할 것!
=> 다른 구현체로 변경할 때 해당 부분만 변경하면 된다는 이점이 있음
public class AppConfig {
private MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
public OrderService orderService() {
return new OrderServiceImpl(discountPolicy(), memberRepository());
}
}
< 테스트 코드에서 의존성 주입하기 위한 어노테이션 >
@BeforeEach
테스트 코드에서 각 테스트 실행하기 전에 호출
해당 코드를 먼저 실행해서 각 객체에 의존 관계를 주입!
728x90
'Spring' 카테고리의 다른 글
스코프와 프록시 (0) | 2023.07.14 |
---|---|
웹 스코프 (0) | 2023.07.14 |
[Spring] 의존 관계 주입 방법 (0) | 2023.06.14 |
[Spring] 스프링 컨테이너 (0) | 2023.06.14 |
[Spring Boot] Spring Initializr (0) | 2023.04.07 |