관심사의 분리
각각의 인터페이스를 배역 이라고 생각.
배역에 맞는 배우를 선택하는 것은 누가하는가?
공연 기획자 기획팀에서 다 하는거지 배우라는 사람이 섭외하는게 아니다.
AppConfig
애플리케이션의 전체 동작 방식을 구성(config) 하기 위해, **“구현 객체를 생성”**하고,
“연결” 하는 책임을 가지는 별도의 설정 플레이스를 만들어서 해결한다.
// 문제
// 인터페이스 - 인터페이스 로 이루지지않고
// 인터페이스 - 구현체 로 이루어 져있으며
// 이는 DIP를 위반한다.
public class MemberServiceImpl implements MemberService{
public final MemberRepository memberRepository = new MemoryMemberRepository();
...
}
// 해결
// 인터페이스 - 인터페이스 로 이루어지며
// 외부에서 생성자를 통해 memberRepository를 주입받는다.
// 이는 DIP를 위반하지 않는다.
// 이로써 MemberServiceImpl 객체는 독립적인 객체가 될 수 있다.
public class MemberServiceImpl implements MemberService{
public final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
그렇다면 외부에서 주입은 어떻게 하나요?
방법은 AppConfig를 통한 환경설정을 이용하여 분리시킨다.
// 아래와 같은 방법으로 구현체를 주입시켜준다.
// 예를들어 지금은 메모리 리포지토리를 주입시켜주지만,
// 후에 실제 DB서버를 주입한다면, DB서버의 구현체만 주입하면 된다.
// 이를통해 memberService 구현체 내부에서의 코드 수정이 불필요하게 된다.
// 클라이언트 코드의 변경이 없다는 의미와 같다.
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
}
반응형
'BackEnd' 카테고리의 다른 글
[DB] 효율적인 설계를 위해 어떤 SQL을 사용해야 할까? RDBMS vs NoSQL과 DB에서의 수직 확장(scale-up)과 수평 확장(scale-out) (0) | 2024.06.20 |
---|---|
[Spring] 스프링이 사랑한 디자인 패턴 - 1 (0) | 2024.05.29 |
[Spring] BeanFactory와 ApplicationContext 이해하기 (0) | 2024.04.03 |
[Spring] 스프링 컨테이너와 빈 (0) | 2024.04.02 |
Python으로 백엔드 서버 아주쉽게 구축하기 (Flask 서버) (0) | 2023.10.10 |