작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
324
1
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
MemberServiceImpl
을 보면 private final MemberRepository memberRepository = new MemoryMemberRepository();
를 통해 추상화와 구현체를 관리하고 있다.= new MemoryMemberRepository();
이 부분에 대한 수정이 필요해진다.MemberServiceImpl
에서 추상화를 통해 구현체를 관리하고 구현체에 대한 변경이 있을 때 인터페이스를 통해서만 구현체를 변경할 수 있어야 하는데 지금 보면 인터페이스가 아닌 MemberServiceImpl
에서 코드 수정이 일어난다.public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
}
AppConfig
클래스를 만들어 이런 구현체들을 관리해 준다.
return new MemberServiceImpl(new MemoryMemberRepository());
코드로 구현 객체를 생성한다.MemberServiceImpl
을 만들고 내가 만든 MemberServiceImpl
은 MemoryMemberRepository
를 사용할거야.!” 와 같이 해석할 수 있다.public class MemberServiceImpl implements MemberService {ㅗ
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; }
생성자를 통해 받아준다.MemberServiceImpl
클래스는 인터페이스에만 의존하게 되고 구체적인 구현 클래스에 대해 전혀 의존하지 않게 되므로 DIP를 잘 지키는 코드가 된다.MemberService memberService;
@BeforeEach
public void beforEach() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
}
//MemberService memberService = new MemberServiceImpl(memberRepository);
@BeforeEach
는 각 테스트를 실행하기 전에 무조건 실행시켜준다.성공적으로 DIP 보안을 마치게 된다.
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
}
MemberServiceImpl
과 OrderServiceImpl
에서 MemoryMemberRepository
를 사용하기 위해 각각 위 코드처럼 (new MemoryMemberRepository());
이렇게 따로 생성해 줘야 하기 때문에 이 자체를 중복이라고 본다.public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
private MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
리팩터링 후에는 memberRepository()
에 new MemoryMemberRepository()
를 생성하고 MemberServiceImpl
과 코드엔 없지만 OrderServiceImpl
에서 따로 new를 통해 생성하지 않고 memberRepository()
를 통해 객체를 생성한 것을 불러와 사용하게 되어 전체적으로 객체 생성 행위는 줄어든 것이므로 중복을 피했다보고 이러면 DIP에 이어 OCP도 만족하게 된다.
DIP / OCP 참고
DIP
OCP