Spring/Spring Study

[Inflearn] AppConfig

모모토 2021. 6. 28. 16:12
반응형

※ 본 포스팅은 Inflearn - 김영한 강사님의 '스프링 핵심 원리 - 기본편' 을 참고,공부하여 만들었습니다.

 

AppConfig

애플리케이션의 전체 동작 방식을 구성(config)하기 위해, 구현 객체를 생성하고, 연결하는 책임을 가지는 별도의 설정 클래스

 

먼저 코드를 살펴보자

 

이전 포스팅에선 이미 코드를 바꿔서 포스팅 하였지만 AppConfig를 쓰지않았다면 아래와 같이 코딩을 하였을것이다.

 

public class MemberServiceImpl implements MemberService {

	private final MemberRepository memberRepository = MemoryMemberRepository();

// ... 생략 ...

}

MemberServiceImpl은 회원의 정보가 필요하기때문에 필연적으로 MemberRepository에 의존해야한다.

 

하지만 만약 데이터베이스를 바꿔야하는 상황이 온다면?

 

그땐 그러면 저 코드를 수정하면 그만일것이다.

 

자 앞으로 우린 '코드를 수정' 하는 행위를 최대한 지양해야하는 마인드를 가지고 코딩에 임해야한다.

 

MemberServiceImpl 은 MemberRepository와 의존적인 관계라는것만 인지하고

 

그후엔 자기 할일을 하기만하면 되도록 설계해야한다

 

데이터베이스가 오라클이던 MySQL이던 상관없이 MemberService는 자신의 할일만 묵묵히 할 수 있도록 설계해야한다.

 

그래서 필요한것이 AppConfig이다.

 

그럼 이제 코드를 바꿔보자

 

public class MemberServiceImpl implements MemberService {

	private final MemberRepository memberRepository;
    
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    
// ... 생략 ...

}

 

MemberServiceImpl은 MemberRepository에 의존적이고 생성자를 통해서 객체를 받도록 하였다. 

 

어떤 객체가 들어올지는 모른다. 어떤 객체를 주입할지는 AppConfig 가 관리한다.

 

public class AppConfig {//나의 애플리케이션의 전반적인 구성과 설정을 책임!

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

 

AppConfig 는 MemberServiceImpl에 MemoryMemberRepository를 생성하여 주입한후 반환할것이다. 

 

따라서 이제 MemberServiceImpl 에 주입할 객체는 AppConfig에서 관리하므로 MemberServiceImpl은 실행만 한다.

 

DB의 교체로 인한 수정이 필요가 없어진다.

 

MemberApp을 만들어 실행해보자

 

public class MemberApp {
    public static void main(String[] args) {
        AppConfig appConfig = new AppConfig(); 
        MemberService memberService = appConfig.memberService(); //MemberService 에 의존
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Member findMember = memberService.findMember(1L);
        System.out.println(findMember.getName());
        System.out.println(member.getName());
        }
    }

 

AppConfig 객체를 생성하여 memberService() 를 호출하면 이미 MemoryMemberRepository도 주입된 상태로 불러온다.

 


AppConfig를 이용하여 좀 더 객체지향적인 설계를 해보았다. 주문기능과 회원관리기능은 각자의 역할에만 집중하고 수정을 최소한으로 하도록 하기위해 객체의 생성 및 연결을 총체적으로 관리해주는 AppConfig를 만들어보았다.