쌓고 쌓다

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

프로그래밍/spring

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

승민아 2023. 5. 14. 21:39

 

앞전 게시글에서 작성한 컴포넌트 스캔 방식도 있고

이번 게시글에서는 스프링에 직접 스프링 빈을 등록하는 방식을 보인다.

 

SpringConfig

package hello.hellospring;

@Configuration
public class SpringConfig {

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

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

@Configuration 어노테이션을 사용한다.

스프링이 뜰 때 @Configuration을 읽고 스프링 빈에 등록을 한다.

@Bean은 스프링 빈을 등록하겠다는 의미로 이해하자.

 

MemberService는 스프링 빈에 등록되나 생성자로 MemberRepository가 필요하다.

MemberRepository는 인터페이스이기에 new가 안되므로 구현체를 new 하게 한다.

MemberRepository 메소드를 MemberService 생성자로 넣어주자.

 

 

MemberController

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

}

MemberController는 컴포넌트 스캔 방식으로 만들어 놓는다.

컴포넌트 스캔 방식이기에 @Autowired로 MemberService를 가져오게 한다.

이때 앞서 @Bean으로 등록했었기에 스프링 빈에 있는 MemberService를 가져온다.

 

최종적으로 아래의 그림이 완성된다.

인프런 - 김영한

 

DI에는 필드 주입, setter 주입, 생성자 주입 3가지 방법이 있다고 한다.

앞서 사용한 방법은 생성자 주입 방법이다.

의존관계가 동적으로 변하는 경우는 없어 생성자 주입을 권장한다.

 

필드 주입 방법

@Controller
public class MemberController {

    @Autowired
    private final MemberService memberService;
}

 

setter 주입 방법

@Controller
public class MemberController {

    private MemberService memberService;

    @Autowired
    public setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }

}

(final 빼야함)

 

MemoryMemberRepository를 사용했으나 추후에 DB를 선정하여 사용할 때

직접 설정 파일을 운영하고 있다면 아래와 같이 구현체만 바꿔주면 된다.

(컴포넌트 스캔 방식이라면 여러 코드를 바꿔야 한다..)

 

주의

@Autowired 를 통한 DI는 helloController , memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다.

스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.

 

MemberRepository가 빈에 등록되지 않았을 때.

MemberService memberService = new MemberService(생성자 넣고) 해도 안된다는 뜻임.

Comments