[Spring] 빈

zini9188·2023년 2월 8일
0

Spring

목록 보기
9/33

빈(Bean)이란?


스프링 컨테이너에 의해 생명주기가 관리되는 자바 객체를 의미한다.

  • 기존 자바에서는 Class를 생성하고 new 키워드로 객체를 생성하여 사용하였지만 스프링에서는 new 키워드로 객체를 생성하는 것이 아니라 스프링 컨테이너에 의해 생성 및 관리당하는 Bean을 사용한다.

  • IoC 컨테이너 안에 들어있는 객체를 필요할 때마다 IoC 컨테이너에서 가져와 사용한다.

  • 어노테이션인 @Bean이나 xml 설정으로 일반 객체를 빈으로 등록할 수 있다.

  • Bean은 ApplicationContext가 알고 있는 객체로 ApplicationContext가 생성하고 직접 관리해주는 객체를 의미

Bean Definition


  • 빈 설정 메타정보

  • 스프링은 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용한다.

  • 속성에 따라 컨테이너가 빈을 어떻게 생성하고 관리할지 결정한다.

  • 스프링 컨테이너는 설정 형식이 XML인지 Java 코드인지 모르고 BeanDefinition만 알면 된다.

  • @Bean 하나당 1개씩 메타 정보가 생성된다.

Component Scan


  • @Component가 붙은 모든 클래스를 스프링 빈으로 등록해준다.

  • @Autowired 기능으로 생성자 의존성 주입에 필요한 설정 정보 대신 의존 관계 자동 주입을 해준다.

@Configuration
@ComponentScan
public class AutoDependencyConfig{

}
  • 기존에 작성하던 DependencyConfig와 비교한다면 @Bean으로 등록한 클래스를 볼 수 없음

주의할 점

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration{ 
  • Component는 ElementType.TYPE 설정이 있어 Class 혹은 Interface에만 붙일 수 있다.

  • 컴포넌트 스캔 시 @Configuration 코드에 @Component 애너테이션이 붙어있어 자동으로 등록된다.

  • 기존에 작성한 AppConfig가 있다면 정상적인 작동이 되지 않는다.

basePackages

탐색할 패키지의 시작 위치를 지정하고, 해당 패키지부터 하위 패키지 모두 탐색한다.

@ComponentScan의 매개 변수로 basePackage =""을 선언할 수 있다.

기본은 @ComponentScan이 붙은 설정 정보 클래스의 패키지이다.

스프링 부트를 사용하면 @SpringBootApplication@ComponentScan이 들어있으므로 @SpringBootApplication을 프로젝트 시작 루트 위치로 두는 것이 좋다.

컴포넌트 스캔 기본 대상

@Component외에 @Controller, @Service, @Repository, @Configuration@Component의 상속을 받으므로 전부 컴포넌트 스캔의 대상이다.

  • @Component

    • 컴포넌트 스캔에서 사용된다.
  • @Controller & @RestController

    • 스프링 MVC 및 REST 전용 컨트롤러에서 사용된다.
  • @Service

    • 특별한 처리를 하지 않으나, 개발자들이 핵심 비즈니스 계층을 인식하는데 도움이 된다.
  • @Repository

    • 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외(DataAccessException)로 변환해준다.
  • @Configuration

    • 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다. (스프링 빈 스코프가 싱글톤이 아니라면 추가 처리하지 않음)

@Bean@Configuration


메서드가 스프링 컨테이너에서 관리할 새 객체를 인스턴스화, 구성 및 초기화한다는 것을 나타내는 데 사용한다

@Bean

  • 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우 사용

  • 빈을 등록하기 위해 인스턴스를 생성하는 메서드 위에 @Bean을 명시하면 된다.

  • 메서드 또는 어노테이션 단위에 붙임

@Configuration
public class AppConfig{
	@Bean
	public MemeberRepository memeberRepository(){
    	return new MemberRepository();
    }
    @Bean
    public MemberService memberService(){
    	return new MemberServiceImpl(memberRepository());
    }
}

@Component

  • 개발자가 직접 컨트롤이 가능한 클래스의 경우에 사용

  • 클래스 또는 인터페이스 단위에 붙임

  • 거의 사용하지 않지만 ApplicationContext를 호출하여 수동으로 설정 파일을 이용하여 빈을 수동 등록할 수 있다.

public class Main{
	public static void main(String[] args){
    	ApplicationContext beanFactory = new AnnotationConfigApplicationContext(AppConfig.class);
        AppConfig bean = beanFactory.getBean("appConfig", AppConfig.class);
    }
}

Bean Scope


bean definition을 만들 때 해당 bean definition에 의해 정의된 클래스의 실제 인스턴스를 만들기 위한 레시피를 만든다.

  • 빈이 존재할 수 있는 범위를 의미한다.

  • 특정 빈 정의에서 생성된 개체에 연결할 다양한 의존성 및 구성 값뿐만 아니라 특정 빈 정의에서 생성된 개체의 범위도 제어

  • 구성을 통해 생성하는 개체의 범위를 선택할 수 있어 강력하고 유연하다.

  • 사용자 정의 범위를 생성할 수 있다.

싱글톤 스코프

  • 싱글톤 스코프는 스프링 컨테이너 안에서 한 번만 생성되며 컨테이너의 종료와 함께 소멸한다.

  • 생성된 하나의 인스턴스는 싱글톤 빈 캐시에 저장되며 해당 빈에 대한 요청과 참조가 있을 때마다 캐시된 객체를 반환한다.

  • 기본적으로 모든 빈은 스코프가 명시적으로 지정되지 않으면 싱글톤이다.

프로토타입 스코프

  • 매번 동일하지 않은 새로운 빈이 필요한 경우에 사용

  • 스프링 컨테이너가 생성과 의존관계 주입, 초기화까지만 관여하고 이후 프로세스는 관리하지 않는다. 즉 프로토 타입 빈의 모든 책임은 클라이언트가 가지게 된다.

웹 관련 스코프

  • 싱글턴 스코프처럼 스프링 컨테이너가 생성부터 종료까지 관리해준다.

  • request, session, application, websocket 등의 스코프가 존재하고, 동작 과정은 비슷하다.

    • request
      • HTTP 요청 하나가 들어오고 나갈 때까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고 관리
    • Session
      • HTTP Session과 동일한 생명주기의 스코프
    • Application
      • Servlet Context와 동일한 생명주기의 스코프
    • Websocket
      • Web Socket과 동일한 생명주기의 스코프

profile
백엔드를 지망하는 개발자

0개의 댓글