[자바]OCP와 연관된 관심사 분리

allnight5·2023년 2월 2일
0

자바

목록 보기
10/12

관심사를 분리하자
OCP를 지키기 위해서
구현 객체를 생성하고 연결 하는 책임을 가지는 별도의 설정 클래스를 만들자

어째서 분리하느냐?
현실로 예시를 들어보면
택배는 상차/하차, 운송, 발송/수신확인, 재고파악(갔다는데 안갔다던가) 이걸 한사람이 한다고 생각해보자.. 어떤가? 많은 일을 처리할 수 있겠는가? 그리고 계속 같은 사람이 할수있을까? 좀 쉬거나 아파서 빠지면 대체할수있어야한다.
그러니
택배 상차역할(인터페이스) 사람1(구현체), 사람4(구현체)
택배 하차역할(인터페이스) 사람2(구현체), 사람5(구현체)
택배 운송역할(인터페이스) 부산지점쪽(구현체), 미국행(구현체)
택배 수신역할(인터페이스) 부산에서온(구현체), 독일에서온XX택배(구현체)
택배 발송역할(인터페이스) 전주로보낸다(구현체), 상파올로로보낸다(구현체)
등등 이런식으로 관심사를 분리해줘야한다.

AppConfig등장

public class AppConfig {
    public MemberService memberService() {

        return new MemberServiceImpl(new MemoryMemberRepository());
    }

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

MemberServiceImpl.java

public class MemberServiceImpl implements MemberService{
    private final MemberRepository memberRepository;

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

여기서 끝이 아니라..
테스트에서는 이런식으로

    @BeforeEach
    public void beforeEach(){
        AppConfig appConfig = new AppConfig();
        memberService = appConfig.memberService();
        orderService = appConfig.orderService();
    }

혹은

    AppConfig appConfig = new AppConfig();
    MemberService memberService = appConfig.memberService();

이런식으로 해주고

public class OrderApp {
    public static void main(String[] args) {
        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        OrderService orderService = appConfig.orderService();

실제는 메인이나 사용하는 클래스에서 저런 내용을 넣어줘서
AppConfig를 사용하여 의존성 주입을 시켜줘야 사용이 가능하다

AppConfig 리팩토링

public class AppConfig {
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    private MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    public OrderService orderService(){
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    private DiscountPolicy discountPolicy() {
        return new FIxDiscountPolicy();
    }
} 
profile
공부기록하기

0개의 댓글