본문 바로가기
코드로 배우는 스프링 부트 - 인프런

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

by step 1 2022. 8. 13.
반응형

기존 Repository, Service 클래스 내부에 어노테이션(

@Repository
@Autowired
@Service

)을 주석처리해주고 service 패키지 안에 SpringConfig 클래스를 생성해주어 스프링 빈 등록 코드를 작성한다.

package hello.hellospring.service;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 자바코드로 직접 스프링 빈 등록하는 방법
// 스프링 실행할때 자동 실행
@Configuration
public class SpringConfig {

//  스프링 빈 등록
    @Bean
    public MemberService memberService() {
        // @Autowired와 같이 동작
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        // 구현체를 리턴해줌
        return new MemoryMemberRepository();
    }
}

 

 

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

DI의 필드 주입방법 별로 좋지 않음: 스프링 뜰때만 실행되고 중간에 동작 방식이나 코드를 수정할 수 없다.
//    @Autowired private  MemberService memberService;
//  DI의 setter 주입방법: Controller에 setter가 퍼블릭으로 공객되고 만약 잘못 수정된다면 문제가 발생될 수 있다.
//    @Autowired
//    public void setMemberService(MemberService memberService){
//        this.memberService = memberService;
//    }
//  DI의 생성자 주입방법
@Autowired
public MemberController(MemberService memberService) {
    this.memberService = memberService;
}

 

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

 

현재 프로젝트는 DB를 어떤걸로 할지 정해진 상태가 아니기 때문에 자바 코드로 작성해서 나중에 리턴값만 수정하는 방법이 더 적당하다.

 

@Autowired 를 통한 DI는 helloConroller , memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다 -> 스프링 컨테이너에 등록된 객체(빈 등록)만 동작

 

 

반응형