스프링 빈 등록과 의존관계 설정 - 자바 코드로 직접 스프링 빈 등록하기

장서연·2022년 1월 2일
0

스프링 입문

목록 보기
15/25

회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 어노테이션을 제거하고 진행한다. 하나하나 직접 스프링에 등록해보는 방식을 써보겠다.

앞서 말했듯, 컴포넌트 스캔방식으로 자동으로 스프링에 등록하는 방법이 있고, 직접 설정파일에 등록할 수도 있다.

제거하면 당연히 아래처럼 스프링빈에 등록되어있지 않으므로 오류가 난다.

어떻게 직접 스프링빈을 등록할 수 있을까?

SpringConfig.java라는 파일을 만들면 된다

자바 코드로 직접 스프링 빈 등록하기

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }

}

이렇게 함으로써, memberService와 memberRepository가 스프링 컨테이너에 스프링빈으로 등록되었다.

참고

XML로 설정하는 방식도 있지만 최근에는 잘 사용하지 않으므로 패스

DI에는 필드주입, setter주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에 동적으로 변하는 경우는 거의(아예) 없으므로 생성자 주입을 권장한다.

실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 한다면 설정을 통해 스프링 빈으로 등록한다.

상황에 따라 구현 클래스를 변경해야 한다면
이게 무슨말인가?

비즈니스 요구사항에, "아직 데이터 저장소가 선정되지 않았다"는 가상의 시나리오를 설정했다. 그래서 일단 메모리로 만들고 나중에 교체하자고 그랬음.

그래서 인터페이스 설계를 했고, 구현체로는 MemoryMemberRepository를 현재 쓰고 있는 것이다.

나중에 DB가 정해지고 나면, MemoryMemberRepository를 실제 DB에 연결하는 리포지토리로 바꿀 것이다. 그런데, 기존의 운영중인 코드를 하나도 손대지 않고 바꿔치기할 수 있는 방법이 있는데 이를 위해 스프링 빈으로 등록한 것이다.

구현체를 바꿔치기 하기 위해!

어떻게 바꾸냐,
SpringConfig.java

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository(){
        // return new MemoryMemberRepository();
        return new DbMemberRepository(); // 이것만 바꿔주면됨!
    }

}

이것이 바로 직접 설정파일을 만들때의 장점!
컴포넌트 스캔을 사용하면 여러 코드를 바꿔야한다...

0개의 댓글