Spring

[Spring] AppConfig을 통한 관심사 분리와 리팩터링

lakelight 2022. 7. 11. 19:58
728x90
반응형

1. AppConfig를 통해서 구체 클래스를 선택합니다. 애플리케이션이 어떻게 동작할지에 대해 전체적인 구성을 책임집니다.

public class AppConfig {
    
    //멤버에 대한 서비스를 정의한 인터페이스에 객체 의존 관계 주입
    public MemberService memberService() {
        //MemberService 인스턴스를 생성하고 MySQL을 이용한 MemberRepository 객체의 의존성을 주입합니다.
        //다른 DB를 사용하고 싶다면 Repository 를 새로 생성해서 변경 가능합니다.
        return new MemberServiceImpl(new MySqlMemberRepository());
    }
    
    //투두에 대한 서비스를 정의한 인터페이스에 객체 의존 관계 주입
    public TodoService todoService(){
        //투두를 생성하는데 필요한 MySQL을 이용한 MemberRepository 객체의 의존성을 주입합니다.
        //다른 DB를 사용하고 싶다면 Repository 를 새로 생성해서 변경 가능합니다.
        return new TodoServiceImpl(new MySqlMemberRepository());
    }
    
}

2. AppConfig 리팩터링 - MySqlMemberRepository를 다른 구현체로 변경할 때 한 부분만 변경하면 됩니다.

public class AppConfig {

    //멤버에 대한 서비스를 정의한 인터페이스에 객체 의존 관계 주입
    public MemberService memberService() {
        //MemberRepository 중복 제거
        return new MemberServiceImpl(memberRepository());
    }

    //투두에 대한 서비스를 정의한 인터페이스에 객체 의존 관계 주입
    public TodoService todoService(){
        //MemberRepository 중복 제거
        return new TodoServiceImpl(memberRepository());
    }

    //멤버에 대한 리포지토리를 정의한 인터페이스에 객체 의존 관계 주입
    public MemberRepository memberRepository(){
        //MemberRepository를 따로 빼서 관리
        return new MySqlMemberRepository();
    }

}

3. AppConfig 스프링 기반으로 작성합니다. (Annotation 사용)

@Configuration //AppConfig에 설정을 구성한다는 의미입니다.
public class AppConfig {

    
    @Bean //스프링 컨테이너에 스프링 빈으로 등록합니다.
    public MemberService memberService() { //멤버에 대한 서비스를 정의한 인터페이스에 객체 의존 관계 주입
        //MemberRepository 중복 제거
        return new MemberServiceImpl(memberRepository());
    }

    
    @Bean //스프링 컨테이너에 스프링 빈으로 등록합니다.
    public TodoService todoService(){ //투두에 대한 서비스를 정의한 인터페이스에 객체 의존 관계 주입
        //MemberRepository 중복 제거
        return new TodoServiceImpl(memberRepository());
    }

    
    @Bean //스프링 컨테이너에 스프링 빈으로 등록합니다.
    public MemberRepository memberRepository(){ //멤버에 대한 리포지토리를 정의한 인터페이스에 객체 의존 관계 주입
        //MemberRepository를 따로 빼서 관리
        return new MySqlMemberRepository();
    }

}

 

추가 설명

전에는 필요한 인스턴스를 AppConfig를 사용해서 직접 조회해서 사용했지만,
이제는 스프링 컨테이너를 통해서 필요한 객체(Bean)을 찾아야 합니다. 

applicationContext.getBean() 메서드를 사용해서 찾을 수 있습니다.

스프링은 @Bean 어노테이션이 붙은 클래스 정보를 사용해서 Bean을 생성하고,
설정정보(AppConfig)를 참고해서 의존관계 주입(DI)을 합니다.

728x90
반응형