FrameWork/Spring&Spring-boot

Spring 기본5 - AppConfig 리팩토링

Surge100 2023. 11. 9. 13:27

AppConfig 리팩토링

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

 

*기대하는 그림*

구성 정보(AppConfig)에는 역할이 있고, 역할에 따른 구현을 어떻게 하는지가 한눈에 보여야 한다. 즉 각 역할들을 들어나게 하는 것이 중요하다.

⌨️ tip) 인델리제이 단축키
Ctrl + Alt + M - Extract Method

 

 

*리팩토링 전*

package com.hello.core;

import com.hello.core.discount.FixDiscountPolicy;
import com.hello.core.member.MemberService;
import com.hello.core.member.MemberServiceImpl;
import com.hello.core.member.MemoryMemberRepository;
import com.hello.core.order.OrderService;
import com.hello.core.order.OrderServiceImpl;

public class AppConfig {

    public MemberService memberService(){
        return new MemberServiceImpl(new MemoryMemberRepository());
    }

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

 

중복을 제거하고, 역할에 따른 구현이 보이도록 리팩토링 하자.

 

*리팩토링 후*

package com.hello.core;

import com.hello.core.discount.DiscountPolicy;
import com.hello.core.discount.FixDiscountPolicy;
import com.hello.core.member.MemberRepository;
import com.hello.core.member.MemberService;
import com.hello.core.member.MemberServiceImpl;
import com.hello.core.member.MemoryMemberRepository;
import com.hello.core.order.OrderService;
import com.hello.core.order.OrderServiceImpl;

public class AppConfig {

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

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

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

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

 

각 역활 즉 각 인터페이스에 type에 해당하는 구체 구현 객체(인스턴스)를 반환하는 메서드들이 만들어져서 메서드를 살펴보면 보다 역할에 따른 구현을 알아보기 용이하다.

 

  • new MemovyMemberRepository() 부분의 중복이 제거 되었다. 이제 MemoryMemberRepository를 다른 구현제로 변경할 때 한 부분만 변경하면 된다.
  • AppConfig를 보면 역할과 구현 클래스가 한눈에 들어온다. 애플리켕션 전체 구성이 어떻게 되었는지 빠르게 파악할 수 있다.

 

[출처 - 스프링 핵심 원리 - 기본편]

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com