ACHO.pk devlog

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

프레임워크/Springboot

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

Acho 2023. 1. 21. 23:32

인프런 김영한 강사님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술"의 강의를 듣고 학습하였습니다.


① 자바 코드로 직접 스프링 빈 등록하기 회원 서비스와 회원 레포지토리의 @Service, @Repository, @Autowired 어노테이션을 제거하고 진행한다.

Membercontroller는 그대로 둔다(@Controller와 @Autowired)

 

 

② src/main/java/Springboot.study/ 패키지 하위에 SpringConfig 클래스를 생성한다.

 

 

SpringConfig 클래스에 코드를 작성한다.

package Springboot.study;

import Springboot.study.repository.MemberRepository;
import Springboot.study.repository.MemoryMemberRepository;
import Springboot.study.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

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

  ▹ @Bean : 스프링 빈을 등록하는 어노테이션


 MemberService() 를

return new MemberService();

위 로직을 호출해서 스프링 빈에 등록을 해준다. 리턴값에 MemberService 생성자이기 때문에 값을 넣어줘야한다.

 


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

MemoryMemberRepository 구현체이기 때문에 new 연산자가 붙을 수 있음. MemberRepository는 인터페이스이기 때문에 안된다.

 


MemberService는 MemberRepository를 연결시켜줘야하기 때문에 리턴값인 MemberService 생성자에 memberRepository()를 넣어줘야한다. 

return new MemberService(memberRepository());

이렇게 되면, MemberService가 뜰 때, MemberService와 MemberRepository를 스프링 빈에 등록하고, 스프링 빈에 등록되어 있는 memberrepository를 MemberService에 넣어준다.

 


 

 

참고

DI에는 생성자를 통해서 MemberService가 MemeberController에 주입이 되는 것처럼 .. 생성자 주입

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

 

필드에다 @Autowired를 하는 필드 주입

@Autowired private MemberService memberservice;

 

setter 주입

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

memberservice를 호출할 때 public으로 되어 있어야한다. 

 

의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다. 

 

 

 

주의

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

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

 

 

 

 

Comments