1. AppConfig의 역할
- 구현체가 아닌 인터페이스에만 의존하게 하기 위해서 애플리케이션의 전체 동작 방식을 구성(config)하는 별도의 설정 클래스다.
- 구현 객체를 생성하고, 객체들 간을 연결하는 역할을 함.
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl( new MemoryMemberRepository(), new FixDiscountPolicy());
}
}
- 위 코드에서 ( MemberServiceImpl / MemoryMemberRepository / OrderServiceImpl / FixDiscountPolicy ) 구현 객체를 생성함.
- 또한, MemberServiceImpl -> MemoryMemberRepository
OrderServiceImpl -> MemoryMemberRepository , FixDiscountPolicy
이와 같이 생성한 객체 인스턴스의 참조를 생성자를 통해서 주입(연결)해준다.
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public void join(Member member) {
memberRepository.save(member);
}
public Member findMember(Long memberId) {
return memberRepository.findById(memberId);
}
}
- 위 코드는 MemberServiceImpl은 MemoryMemberRepository를 의존하지 않고, MemberRepository 인터페이스에 의존한다. 즉, MemberServiceImpl의 입장에서는 어떤 구현 객체가 주입될지는 알 수 없고, MemberServiceImpl는 자기의 역할만 묵묵히 해낼 뿐임. 실행에만 집중하게 됨.
- MemberRepository 의 자리에 어떤 구현 객체가 들어올 지는 외부(설정 클래스 파일인 AppConfig)에서 결정됨.
2. AppConfig 실행
public class MemberApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("find Member = " + findMember.getName());
}
}
- MemberApp class에서 실행할 때, AppConfig 객체를 만들어서 설정 정보를 가져옴.
3. AppConfig 리팩터링
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl( memberRepository(), discountPolicy());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
- 기존의 코드 부분에서 중복된 부분을 제거하고, 수정 시 한 부분만 변경할 수 있게 작성함.
- 이렇게 하면 AppConfig의 역할과 구현 클래스가 한 눈에 들어옴.
'개발자 공부 > Spring' 카테고리의 다른 글
| 스프링 컨테이너의 생성 과정 (0) | 2023.07.10 |
|---|---|
| 순수한 자바 코드 -> Spring으로의 전환 (0) | 2023.07.10 |
| MVC (6) - Tiles ViewResolver 설정하기 / Root페이지들을 위한 Layout 페이지 만들기 (0) | 2023.04.13 |
| MVC (5) - 페이지 공통분모 집중화 / 페이지 모듈 분리하기 / 레이아웃만들기 / tiles 라이브러리 추가 (0) | 2023.04.13 |
| MVC (4) - ViewResolver 사용하기 / 정적파일 서비스하기 (0) | 2023.04.12 |