Spring Bean 등록 - @Component , @Bean , @ComponentScan , @Controller , @RestController, @Service , @Repository , @Cofiguration

이정수·2025년 10월 23일

Spring

목록 보기
13/19

Spring Bean으로 등록하는 어노테이션
@Component , @Bean

  • Spring BeanContext 자동 등록
    @ComponentScan

  • @Component이 내부에 선언되어 구체화된 목적을 더해 Spring Bean으로 등록하는 어노테이션
    어노테이션 내부에 @Component를 포함하여 자동으로 @ComponentScan에 의해 Spring Bean으로서 등록

    @Controller, @Service, @Repository, @Cofiguration

@Component :
。개발자가 직접 작성한 클래스Spring Bean으로 등록 시 선언하는 어노테이션
Spring Stereotype Annotation :
선언 시 @SpringBootApplication 등으로부터 @ComponentScan에 의해 자동으로 식별되어 Spring Context로 등록

。 모든 클래스에 선언이 가능
@Bean메소드레벨 , @Componen클래스레벨에서 선언

@Controller , @Service , @Repository, @Configuration어노테이션내부에 @Component가 포함되어 선언 시 @Component에 의해 Spring Bean으로 등록
@Component에서 따로 기능별로 역할구분하여 Spring에게 해당 어노테이션이 선언된 클래스의 목적을 암시적으로 명시하는 목적으로 구체화

  • Component Scan 수행 시 Spring Context에 등록되는 어노테이션 순서
    @Configuration -> @Controller -> @Service -> @Repository -> @Component 순으로 선언된 클래스Spring Bean으로서 등록
    단방향 의존성에 따라 고수준 클래스로서 Service 클래스 객체를 포함하는 Controller 클래스Service 클래스보다 먼저 Spring Bean으로 등록되어야한다.

@ComponentScan("패키지경로") :
어플리케이션 실행 시 선언한 클래스 기준 패키지 경로의 하위에 있는 Spring BeanSpring Context 에 자동으로 식별등록되도록하는 어노테이션

Spring Context 구현체( ex. AnnotationConfigApplicationContext )가 위치한 클래스에 선언 시 해당 구현체 내부로 포함

  • Spring 어플리케이션Spring Bean을 식별 및 등록하는 원리
    진입점 클래스@SpringBootApplication 안에 @ComponentScan이 포함
    @SpringBootApplication을 포함하는 패키지 경로 기준 하위 패키지 경로범위 내 모든 @Component파생형이 선언된 Spring Bean전역 Spring Context에 포함됨

    ex ) @SpringBootApplication를 포함하는 진입점 클래스package com.ktcloud.excercise;에 위치한 경우 package com.ktcloud.excercise; 의 하위 패키지Spring Bean들을 전역 SpringContext로 등록
@ComponentScan("com.ktcloud.excercise.step0")
@SpringBootApplication
public class ApplicationRunner {
	public static void main(String[] args) {
		SpringApplication.run(ApplicationRunner.class, args);
	}
}

@ComponentScan을 통해 다른 패키지 경로진입점 클래스에 선언하여 다른 패키지경로하위경로범위 상 모든 Spring Bean들을 전역 Spring Context에 등록

컨트롤러 어노테이션 ( @Controller, @RestController )
클래스Spring MVCController를 포함하는 Class 일 경우 선언하여 Spring Bean으로 등록하는 어노테이션
어노테이션 내부에 @Component를 포함
SpringWeb 요청응답을 담당하는 Spring Bean으로 지시

Spring MVC레이어드 아키텍처고수준 클래스이므로 Service Class를 의존
클래스Service 클래스 객체필드로 선언 및 의존성주입요청을 전달

컨트롤러 어노테이션이 선언된 클래스HTTP Request를 처리하기위해 URL 패턴을 정의하는 Controller 들을 포함한다.
▶ 각 Controller Method@RequestMapping, @GetMapping , ... 등을 선언

  • @Controller :
    클래스 내부 Controller가 기본적으로 View Resolver를 통해 HTML View를 반환을 담당 시 선언하는 어노테이션
    Controller에서 View 이외를 클라이언트에게 반환 시 따로 @ResponseBody를 선언해야함.

  • @RestController
    클래스 내부 ControllerREST API를 담당하는 경우에 선언하는 어노테이션
    @Controller + @ResponseBody

    。기본적으로 @ResponseBody를 포함하는 어노테이션으로 선언 시 Controller Method에 자동적용되어 모든 반환값Jackson을 통해 JSON, XML 등의 format으로 변환하여 반환

@Service :
Spring MVC에서 Business Logic을 담당하는 Service Class를 정의 시 선언하여 Spring Bean으로 등록하는 어노테이션
어노테이션 내부에 @Component를 포함
SpringBusiness Logic의 처리를 담당하는 Spring Bean으로 지시

Spring MVC레이어드 아키텍처Repository Class를 의존
클래스Repository 클래스 객체필드로 선언 및 의존성주입요청을 전달

@Repository :
Spring MVC에서 DB와의 상호작용을 담당하는 Repository Class의 경우 선언하여 Spring Bean으로 등록하는 어노테이션
어노테이션 내부에 @Component를 포함
SpringDAO(Data Access Obejct) 역할을 수행하는 Spring Bean으로 지시

@Component를 포함하는 어노테이션 중 가장 늦게 Spring Bean으로 등록

Spring MVC레이어드 아키텍처 상 가장 저수준 클래스이므로 의존하지 않는다.
▶ 단 JdbcJPA 사용 시 해당 구현체( ex. JdbcTemplate , ...)를 필드로 선언하여 의존성주입하여 DB와 상호작용하여 사용

@Repository가 선언된 경우 Spring Framework에서 자동으로 ExceptionDataAccessException으로 변환

@Configuration
외부 라이브러리 또는 classSpring Context에 의해 관리되는 Spring Bean으로 등록하는 어노테이션
어노테이션 내부에 @Component를 포함

@Component를 포함하는 어노테이션가장 먼저 Spring Context에 등록
@Configuration -> @Controller -> @Service -> @Repository -> @Component

설정을 주로 수행하는 Configuration Class로서 내부에 여러개의 @Bean method를 정의하여 직접 Spring Bean을 생성 및 등록하는 역할
▶ 1개 이상의 @Bean Method를 제공하는 Class는 반드시 @Configuration을 선언

。실무에서는 커스텀Spring Bean을 묶어주는 역할을 수행

XML 대신 외부 라이브러리 등을 Spring Bean으로 등록 시에도 활용

@Configuration(proxyBeanMethods=true)
full mode로서 내부 @Bean에서 SingletonSpring Bean을 반환
proxyBeanMethods=false인 경우 호출할때마다 새로운 Spring Bean을 생성

@Bean :
Configuration Class 내부에 Method 레벨에서 Method에 선언하여 메서드 반환값Spring Bean을 등록하는 역할을 수행
@Bean이 선언된 Method는 Spring Context에 의해 관리되는 Spring Bean으로 등록

。보통 외부 라이브러리Spring Bean 객체로 만들 때 사용.

  • @Bean(name = "nm") :
    Spring ContextSpring Bean의 이름은 카멜케이스로 작성됨
    ▶ 정의된 SpringBean의 명칭을 사용자 임의로 변경하여 설정.

  • @Bean의존성 주입 방식
    。해당 2가지의 기법으로 Autowiring이 가능.
    • method call
      。동일 Configuration Class@Bean 메소드를 직접 호출하여 의존성 주입

      @Configuration(proxyBeanMethods=true)인 경우 @Bean Method 호출 시 Spring BeanSingleton으로 주입
      proxyBeanMethods=false인 경우 일반 Java 메소드 호출과 동일
    // method call : 
    @Bean
    public Person person2MethodCall(){
      return new Person(name(),age(),address()); 
      }
    • method parameters
      Spring Context매개변수를 확인 후 알맞은 Spring Bean을 찾아서 주입
      ▶ 항상 Singleton으로 주입
    // method parameters : 
    @Bean
    public Person person3Parameters(String name , int age , Address address2){
      return new Person(name,age,address2); 
      }
profile
공부기록 블로그

0개의 댓글