Development/Spring

Spring Bean과 의존성 주입

우봉수 2023. 3. 10. 22:34

스프링 Bean이 무엇이지?

  • 스프링 IoC 컨테이너가 관리하는 자바 객체
    • 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너
  • 가급적 스프링 빈에 모든 걸 등록해서 사용하는게 좋다

Spring 개발 패턴

  • 콘트롤러(외부요청 받기)
  • 서비스(비지니스 로직)
  • 레포지터리(데이터 저장)

스프링 빈을 등록하는 2가지 방법

  • 컴포넌트 스캔과 자동 의존관계 설정
  • 자바 코드로 직접 스프링 빈 등록하기

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

  • @Component 에노테이션이 있으면 스프링 빈으로 자동 등록된다.
  • @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.
  • @Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
    • @Controller
    • @Service
    • @Repository
    • @Autowired
      • 스프링 빈으로 등록된 클래스 대상으로만 실행됨
  • 스프링 빈에 등록될때 싱글톤 패턴으로 등록하고 공유하도록 되어진다.

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

  • @Configuration
  • @Bean
  • 상황에 맞추어 유연하게 바꾸는 것이 가능

DI 의존성 주입의 3가지 방법

  • 생성자 주입
package hello.hellospring.controller;

import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService){
        this.memberService = memberService;
    }
}
  • 필드 주입
package hello.hellospring.controller;

import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MemberController {

    @Autowired private final MemberService memberService;

}
  • Setter 주입
package hello.hellospring.controller;

import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MemberController {

    private MemberService memberService;

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