Spring-2021.12.06

Jonguk Kim·2021년 12월 6일
0

Spring 강의

목록 보기
6/7

1. 관심사의 분리

애플리케이션을 하나의 공연으로 생각

  • 배우는 본인의 역할인 배역을 수행하는 것에만 집중해야 한다.
    (남자 주인공은 어떤 여자 주인공이 선택되더라도 똑같이 공연을 할 수 있어야 함)

  • 공연을 구성하고, 담당 배우를 섭외하고, 역할에 맞는 배우를 지정하는 책임을 담당하는 별도의 공연 기획자가 필요

  • AppConfig: 실제 동작에 필요한 구현 객체를 생성하고, 연결하는 책임을 가지는 별도의 설정 클래스

public class AppConfig {	// 실제 동작에 필요한 구현 객체를 생성

    public MemberService memberService() {
        return new MemberServiceImpl(new MemoryMemberRepository());	// 생성한 객체 인스턴스의 참조를 생성자를 통해서 주입(연결)
    }

    public OrderService orderService() {
        return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
    }

}
  • MemberServiceImpl - 생성자 주입
    • MemberServiceImpl 은 MemoryMemberRepository 를 의존하지 않는다!
    • 단지 MemberRepository 인터페이스만 의존한다.
    • MemberServiceImpl 입장에서 생성자를 통해 어떤 구현 객체가 들어올지(주입될지)는 오직 외부( AppConfig )에서 결정된다.
      (의존관계에 대한 고민은 외부에 맡기고 실행에만 집중하면 됨)
public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}
  • OrderServiceImpl - 생성자 주입
    • OrderServiceImpl 은 FixDiscountPolicy 를 의존하지 않는다!
    • 단지 DiscountPolicy 인터페이스만 의존한다.
    • OrderServiceImpl 입장에서 생성자를 통해 어떤 구현 객체가 들어올지(주입될지)는 오직 외부( AppConfig )에서 결정한다.
    • OrderServiceImpl 에는 MemoryMemberRepository, FixDiscountPolicy 객체의 의존관계가 주입된다.
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

    @Override
    public Order createOrder(Long memberId, String itemName, int itemPrice) {
        Member member = memberRepository.findById(memberId);
        int discountPrice = discountPolicy.discount(member, itemPrice);

        return new Order(memberId, itemName, itemPrice, discountPrice);
    }
}
  • 클래스 다이어그램
    • 객체의 생성과 연결은 AppConfig 가 담당한다.
    • DIP 완성: MemberServiceImpl 은 MemberRepository 인 추상에만 의존하면 된다. (구체 클래스를 몰라도 됨)
    • 관심사의 분리: 객체를 생성하고 연결하는 역할과 실행하는 역할이 명확히 분리되었다.
  • 회원 객체 인스턴스 다이어그램
    • appConfig 객체는 memoryMemberRepository 객체를 생성하고 그 참조값을 memberServiceImpl 을 생성하면서 생성자로 전달한다.
    • 클라이언트인 memberServiceImpl에 의존관계 주입 (의존성 주입)
profile
Just Do It

0개의 댓글