1. AppConfig의 역할 

- 구현체가 아닌 인터페이스에만 의존하게 하기 위해서 애플리케이션의 전체 동작 방식을 구성(config)하는 별도의 설정 클래스다. 

- 구현 객체를 생성하고, 객체들 간을 연결하는 역할을 함.

더보기

public class AppConfig {

 

    public MemberService memberService() {

           return new MemberServiceImpl(new MemoryMemberRepository());

    }

 

   public OrderService orderService() {

           return new OrderServiceImpl( new MemoryMemberRepository(), new FixDiscountPolicy());

   }

 

}

 

- 위 코드에서 ( MemberServiceImpl / MemoryMemberRepository / OrderServiceImpl / FixDiscountPolicy ) 구현 객체를 생성함.

- 또한, MemberServiceImpl -> MemoryMemberRepository 

           OrderServiceImpl -> MemoryMemberRepository , FixDiscountPolicy 

  이와 같이 생성한 객체 인스턴스의 참조를 생성자를 통해서 주입(연결)해준다.

 

더보기

public class MemberServiceImpl implements MemberService {

     private   final  MemberRepository memberRepository;

     

     public MemberServiceImpl(MemberRepository memberRepository) {

           this.memberRepository = memberRepository;

     }

 

    public void join(Member member) {

            memberRepository.save(member);

    }

 

    public Member findMember(Long memberId) {

            return memberRepository.findById(memberId);

    }

 

}

- 위 코드는 MemberServiceImpl은 MemoryMemberRepository를 의존하지 않고, MemberRepository  인터페이스에 의존한다. 즉, MemberServiceImpl의 입장에서는 어떤 구현 객체가 주입될지는 알 수 없고, MemberServiceImpl는 자기의 역할만 묵묵히 해낼 뿐임. 실행에만 집중하게 됨.

 

- MemberRepository 의 자리에 어떤 구현 객체가 들어올 지는 외부(설정 클래스 파일인 AppConfig)에서 결정됨.

 

2. AppConfig 실행 

더보기

public class MemberApp {

     public static void main(String[] args) {

 

             AppConfig appConfig = new AppConfig();

            MemberService memberService = appConfig.memberService();

            Member member = new Member(1L, "memberA", Grade.VIP);

            memberService.join(member);

            Member findMember = memberService.findMember(1L);

 

            System.out.println("new member = " + member.getName());

            System.out.println("find Member = " + findMember.getName());

 

      }

}

- MemberApp class에서 실행할 때, AppConfig 객체를 만들어서 설정 정보를 가져옴. 

 

3. AppConfig 리팩터링

더보기

public class AppConfig {

     public MemberService memberService() {

           return new MemberServiceImpl(memberRepository());

     }

 

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

     }

 

     public MemberRepository memberRepository() {

          return new MemoryMemberRepository();

     }

 

     public DiscountPolicy discountPolicy() {

          return new FixDiscountPolicy();

     }

 

}

- 기존의 코드 부분에서 중복된 부분을 제거하고, 수정 시 한 부분만 변경할 수 있게 작성함.

- 이렇게 하면 AppConfig의 역할과 구현 클래스가 한 눈에 들어옴.

+ Recent posts