스프링 | 스프링 부트

스프링 부트(입문) - 스프링 빈

Adose 2024. 8. 17. 15:44

📌  스프링 빈 

  • 스프링 빈을 등록하는 2가지 방법
    1. 컴포넌트 스캔자동 의존관계 설정
    2. 자바 코드로 직접 스프링 빈 등록하기
  • 스프링은 스프링 컨테이너에 스프링 빈을 등록할때, 기본적으로 싱글톤으로 등록한다. 
    • 싱글톤 : 특정 클래스의 인스턴스가 하나만 생성되고, 모든 요청에서 그 하나의 인스턴스를 공유하는 것을 말한다

컴포넌트 스캔과 자동 의존관계 설정 

  • 컴포넌트 스캔SpringBootApplication이 존재하는 패키지(ex. test1) 하위에 같이 있어야 가능하며, 해당 패키지를 벗어나서(ex. test2) class를 만든후 컴포넌트를 지정해놓으면, 객체가 생성되지 않기 때문에, 컴포넌트 스캔이 불가능 하다.  -> 
  • @Component 어노테이션이 있으면 스프링 빈으로 자동등록 된다. 
  • @Component를 포함하는 어노테이션은 다음과 같다.
    1. @Controller
    2. @Service
    3. @Repository
  • 예를들어 아래와 같이 @Controller를 사용하여 컴포넌트 스캔을 사용하여 스프링 빈으로 자동 등록하게 한다.
  • @Autowired를 사용하여 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈(ex. MemberService)을 찾아서 주입한다.
  • 아래 코드는 MemberController가 MemberService에 의존하고 있음을 나타내며, @AutoWired를 사용하여 자동으로 의존성 주입을 하게 해준다. 
  • @Autowired가 생성자에 생략되어도 자동으로 주입이 이루어진다.  -> 생성자가 하나일 때는 @Autowired를 생략할 수 있다. 
@Autowired 를 통한 DI(의존성 주입)는 `memberController` , `memberService` 등과 같이 스프링이 관리하는 객체(=스프링 빈)에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체(= new 로 생성한 객체)에서는 동작하지 않는다.

 

 

 

 

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

  • @Configuration을 사용하기 위한 class를 만들어준다. @Configuration은 하나 이상의 스프링 빈을 정의하고 설정하는 구성 클래스를 지정할 때 사용
  • @Configuration 붙은 클래스는 스프링 컨테이너에 의해 관리되며, 이 클래스 내에서 정의된 메서드들을 통해 스프링 빈이 생성되고, 그 빈들이 스프링 컨테이너에 등록됩니다.
  • @Configuration이 붙은 class에 @Bean을 직접 적어주고, 해당되는 의존관계도 설정해준다
  • 코드는 아래와 같다.
    1. MemberService메서드를 만들어 주고 @Bean을 붙여서 스프링 컨테이너에 등록한다. 
    2. memberService는 memberRepository를 의존하고 있기 때문에,  생성할때 빈으로 만든 memberRepository를 의존하도록 설정해준다. 

 

 

 

 

📌 의존성 주입(Dependency Injection, DI) 

  • DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지가 있다.   
  • 생성자 주입 : 생성자를 통해서 주입 
  • 필드 주입  : 아래 그림과 같이 @Autowired 를 붙여서 바로 주입 (별로 선호하지는 않는다)

 

  • setter 주입 : ctrl + n으로 setter를 만든 후, @Autowired를 붙인다.