본문 바로가기
Server/Spring

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

by print_soo 2024. 8. 25.

컴포넌트를 이용하는 방법은 자동으로 빈을 등록해주는 것이었다. 이번에는 자바 코드로 직접 빈을 등록해보자.

 

왜 자동이 있는데 수동으로 빈을 등록하는가?❓

-> 세밀한 제어, 외부 라이브러리 통합 등 복잡하고 특정한 요수사항을 처리할 수 있다는 점이 있다. 
-> 우리가 수동으로 빈을 등록하는 것을 채택한 가장 큰 이유는 나중에 Repository에서 DB로 쉽게 변경하기 위해서 이다. 

 

 

1. 자바를 작성할 config 파일 만들기

파일 경로: src/main/java/SpringConfig

 

해당 경로에 SpringConfig 파일을 만든다.

 


2. 코드 작성하기 

package section4.section4_spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import section4.section4_spring.repository.MemberRepository;
import section4.section4_spring.repository.MemoryMemberRepository;
import section4.section4_spring.service.MemberService;

@Configuration
public class SpringConfig {
    @Bean //빈을 등록할거야!
    public MemberService memberService() {
        return new MemberService(memberRepository()); //의존성 주입
    }
    
    //위 전체 작업은 객체를 생성하고 그 객체를 반환하는 메소드이다.

    @Bean //빈을 등록할거야!
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    //위 처럼 진행하면 스프링 컨테이너에 서비스와 레포지토리가 등록이 되고 서비스에 레포지토리가 주입된다.

}

 

 

  • @Configuration
    • 스프링에게 이 클래스가 설정 파일임을 알려주는 어노테이션이다. 
    • 이 클래스 내부에는 빈을 정의하는 메서드들이 있고, 스프링은 이 메서드들을 호출하여 빈을 생성하고 관리한다.
  • public ... () { ... }
    • 객체를 생성하고 객체를 반환한다.
    • 객체를 반환할 때 의존성 주입을 할 수 있다.

 

❓ 왜 Controller는 빈으로 등록하지 않는건가?

1. 유연한 구성과 관리: 컨트롤러는 주로 요청을 처리하는 역할을 하기에 복잡한 설정이 필요하지 않다. 
2. 특정 설정이 필요 없는 경우: 컨트롤러는 일반적으로 특정 설정이 필요하지 않고, MVC를 따르기 때문에 자동이 편리하다.
3. 의존성 주입과 관리 편의성: 컨트롤러는 주로 서비스 계층에 의존하므로, 자동으로 등록해도 충분히 관리가능하다.
4. 일반적인 패턴 따르기: 스프링에서는 컨트롤러를 자동으로 등록하는 것이 일반적인 패턴이다.

 

 

번외) Repository를 DB로 변경해보기

 

//[Repository]
@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

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

//[DB]
@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new DatabaseMemberRepository(dataSource()); //DB 변경 부분
    }
}