TIL

171일차(모험 80일차) - 스터디 3

haedal-uni 2022. 3. 3. 23:27
728x90

[add] AppConfig 리팩터링 [#6] #10

현재 AppConfig를 보면 중복이 있고, 역할에 따른 구현이 잘 안보인다

 

 

new가 2번 나와서 중복이다.

이런 것을 리팩토링 할 때 잡아준다.


 


MemoryMemberRepository에 커서를 갖다댄 후에 ctrl + alt + m
단축키를 누르면 Extract method가 실행된다.

return타입은 구체클래스를 선택하면 안되고 인터페이스를 선택한다.
(MemberRepository ⭕, MemoryMemberRepository ❌)

처음에 ctrl + alt + m을 아무리 입력해도 강의와 같이 Extract method가 실행되지 않았다.
그래서 일단 ctrl + alt + m을 실행시키고 보기가 나오는데 보기 중 하나를 엔터 클릭했더니
코드가 추가되면서 톱니바퀴가 나왔다.

 

 


More options를 클릭해보니 강의와 같이 Extract method가 나왔다.

* 참고로 예시 사진은 FixDiscountPolicy()

 


인터페이스로 수정하고 refactor 후 replace를 하면 잘 나온다.



 

 

// 애플리케이션의 전체를 설정하고 구성한다.
public class AppConfig {

    // → 생성자 주입
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
        // MemberServiceImpl을 만들고 내가 만든 MemberServiceImpl은 MemoryMemberRepository를 사용할 것이다.
    }

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


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

    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }

}


이제 메소드 명을 보면 역할이 다 드러나는 것을 볼 수 있다.
MemberService는 MemberServiceImpl을 쓴다.

 

 


MemberRepository 대한거는 MemoryMemberRepository를 쓸 것이다.
만약 나중에 JdbcMemoryMemberRepository로 바뀌면

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


에서 

    private MemberRepository memberRepository() {
        return new JdbcMemoryMemberRepository();
    }

    private MemberRepository memberRepository() {
        return new MemoryMemberRepository();  ← 이 코드만 바꾸면 된다. 
    }

 

 


 

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


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

    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }


orderService도 보면은 orderService 구체적인 것은 memberRepository() 쓰는거 가져온다.


 

 


어플리케이션에서 결정한 discountPolicy()를 가져올 것이다. 
discountPolicy는 Fix니깐 Fix를 가져온다.


 


memberRepository는 MemoryMemberRepository니깐 MemoryMemberRepository 객체가 들어온다.





정리


new MemoryMemberRepository() 이 부분이 중복 제거되었다. 

이제 MemoryMemberRepository 를 다른 구현체로 변경할 때 한 부분만 변경하면 된다.

AppConfig 를 보면 역할과 구현 클래스가 한눈에 들어온다. 

애플리케이션 전체 구성이 어떻게 되어있는지 빠르게 파악할 수 있다.

중복도 제거가 되었다.

728x90