스프링 빈(Spring Bean)과 의존관계

YUNU·2023년 3월 17일
0

스프링

목록 보기
2/33

🌳스프링 빈(Spring Bean)

Spring이 관리하는 자바 객체를 의미
개발자가 직접 인스턴스를 생성, 호출, 삭제하는 것이 아니라 스프링 컨테이너를 통해 관리

Spring Container

: 객체간의 의존성을 낮추기 위해 사용

객체 관리를 주로 수행하며 빈의 생성, 관계, 사용, 생명 주기 등을 관장한다. 객체를 사용하기 위해 new생성자나 인터페이스 호출, 팩토리 호출 방식을 이용했지만 하나의 어플리케이션에는 이렇게 만들어진 무수한 객체가 존재하고 객체들은 서로 참조하고 있다. 참조의 정도가 심할 수록 의존성이 높다고 말하며 객체 지향 프로그래밍(OOP)에서 높은 의존성은 OOP의 특성과는 거리가 멀다. 따라서 의존성을 제어하기 위해 스프링 컨테이너를 사용한다.

<참고>
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱클톤으로 등록한다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스임

🌱스프링 빈 등록 방식

1. Component Scan과 자동 의존관계 설정

1-1. Component Scan

컴포넌트 스캔은 @Component 어노테이션을 통해 빈을 추가하는 방식이다. Class 위에 @Component를 붙이면 스프링이 알아서 스프링 컨테이너에 빈을 등록한다.
@Component는 Class 혹은 Interface에만 붙일 수 있다

❗ @Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.

  • @Controller
  • @Service
  • @Repository
1-2. Autowired

생성자에 @Autowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다. 만약 생성자가 1개만 있다면 @Autowired는 생략할 수 있음

// 예시코드
package hello.hellospring.controller;

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

@Controller
public class MemberController {

 private final MemberService memberService;
 
 @Autowired
 public MemberController(MemberService memberService) {
 
 this.memberService = memberService;
 
 }
 
}
// 코드 출처 : 인프런 스프링부트입문-김영한

2. 코드로 직접 스프링 빈 등록

Class에 @Configuration 어노테이션을 붙이고 빈을 등록하기 위해 인스턴스를 생성하는 메소드 위에 @Bean 어노테이션을 붙인다.
@Bean은 메소드나 어노테이션에만 붙일 수 있고, 클래스에는 붙일 수 없고, @Configuration 또한 @Component를 포함한다.

// 예시 코드
package hello.hellospring;
  
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.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();
 }
}
// 코드 출처 : 인프런 스프링부트입문-김영한

🍃@Component <--> @Bean

1. @Component

  • 개발자가 직접 컨트롤이 가능한 Class들의 경우에 사용
  • Class와 Interface 단위에 붙일 수 있음

2. @Bean

  • 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록할 경우에 사용
  • 메소드와 어노테이션 단위에 붙일 수 있음
profile
DDeo99

0개의 댓글