본문 바로가기
Spring/Spring Framework

스프링 프레임워크 스테리오타입 어노테이션

by chogigang 2023. 2. 27.

스프링 빈을 생성할 때마다 @ Component 어노테이션을 추가 했었습니다.

이밖에도 사용할 수 있는 어노테이션은 많습니다.

 

@Component는 제네릭 어노테이션으로 모든 클래스에 적용할 수 있습니다.

특정 클래스에 대해 스프링 빈을 생성한다면 @Component를 추가할 수 있습니다.

 

이것이 모든 스프링 스테레오타입 어노테이션의 이본입니다.

 

@service

일반적으로 어노테이션된 클래스가 비즈니스 로직을 가지고 있다는 것을 가르킵니다.

즉 클래스가 비즈니스 로직을 가지고 있다면 @Component 대신 @Service를 사용할 수있습니다.

 

@Controller

클래스가 controller인 경우 가령 웹 컨트롤러 라면 자주 사용할 어노테이션은 @Controller 입니다

웹 애플리케이션과 REST API에서 컨트롤러를 정의하는 데 쓰입니다.

 

 

@Repository

빈이 데이터베이스에 데이터 저장이나 데이터 검색, 데이터 조작 등을 요청하는 경우가 있습니다

이때 클래스에 @Component대신 @Repository 어노테이션을 추가할 수 있습니다.

 

 

가능한 가장 정확한 어노테이션을 사용할 것을 추천드립니다.

위 모든 경우에 해당하지 않는다면 제네릭 어노테이션인 @Component 을 사용합니다

 

가능한 정확한 어노테이션을 사용해야 하는이유

 

1.정확한 어노테이션을 사용하면 의도에 대해 더 많은 프레임워크에 제공할 수 있기 때문입니다.

특정 클래스가 무엇을 하는지에 대한 더 많은 정보를 제공합니다

 

2.추후에 AOP, 즉 관점 지향 프로그래밍을 사용하여 어노테이션을 감지하고 추가 행동을 덧붙일수 있기 때문입니다.

스프링 프레임워크가 자동으로 하는일을 예로 @Repository 어노테이션을 갖고 있다면 JDBC 예외 전환 기능에서

자동으로 와이어링하게 됩니다.

 

 

 

 

@Configuration 클래스가 1개 이상의 @Bean 메소드를 선언하고 스프링 컨테이너로 처리되어 빈 정의를 생성  많은 메소드를 정의할 수 있으며, 이메소드에 @Bean어노테이션을 추가할 수있습니다.
스프링은 자동으로 모든 값에 대한 빈을 생성하는데, 이빈은 메소드에 의해 반환됩니다.
@ComponentScan 특정 패키지를 정의하여 컴포넌트를 스캔할 수 있습니다.
스프링 프레임워크는 어디에서 모든 컴포넌트를 정의하고 있는지 알아야 합니다 이것이 바로 @ComponentScan 을통해 할수 있는 일입니다 패키지를 지정하지 않으면 이 이노테이션ㅇㄹ 선언한 클래스의 패키지에서 스캔이 이루어지게 됩니다.그리고 하위 패키지에서도 스캔을 합니다
@Bean  
@Component 어노테이션된 클래스가 Component라는 것을 나타냅니다
@Component클래스가 @ComponentScan의 일부라면 
스프링 빈은 이에 대해 생성될 겁니다.
@Service @Component의 한종류로 어노테이션된 클래스가 비즈니스 로직을 가지고 있다는 것을 나타냅니다.
@Controller @Component 한 종류로 어노테이션된 클래스가 Controller임을 나타냅니다. Controller의 예로는 웹 컨트롤러가 있습니다
대체로 이것은 웹 애플리케이션과  REST API에서 컨트롤러를 정의하는 데 쓰입니다.
@Repository @Component의 한 종류입니다. 어노테이션된 클래스가 데이터베이스에서 데이터 검색 또는 데이터 조작에 쓰인다는 것을 가리킵니다.
@Primary 여러 후보가 단일 값 의존성을 자동 와이어링할 자격이 있는 경우 bean에 우선권을 부여해야 한다는 사실을 나타냅니다.
우선권을 부여할때 쓰는 어노테이션 입니다.
@Qualifier 와이어링 시 후보 빈에 대한 Qualifier로서 필드 또는 매개변수에서 쓰입니다. Qualifier는 모든 컴포넌트에 추가할수 있으며
Qualifier를 이용하여 자동 와이어링을 할 수 있습니다.
매우 구체적으로 하나의 빈을 적용시킵니다.
@Lazy 일반적으로 스프링 빈은 이른 시기에 초기화 됩니다 컨텍스트가 실행되자마자 초기화 됩니다 하지만 초기화를 지연해야 하는경우,@Lazy 어노테이션을 활용합니다.
@Scope(value=
ConfigurableBeanFactory.SCOPE_PROTOTYPE)
프로토타입 유효범위
특정 컴포넌트에서 프로토타입 유효 범위를 정의하는 방법입니다 이 특정 방식은 빈을 프로토타입으로 정의합니다.
프로토 타입이란 빈을 참조할 때마다 새 인스턴스가 생성 됩니다. 하지만 휴효 범위 기본값은 싱글톤 입니다.
@Scope 어노테이션을 갖고 있지 않거나 싱글톤 유효 범위로 값을 사용하여 @Scope 어노테이션을 지정하는 경우
IoC 컨테이너당 특정 인스턴스를 단 하나만 갖게 됩니다.
빈을 100번 참조하더라도 유효 범위가 싱글톤이라면 동일한
인스턴스가 사용될 겁니다.
@PostConstruct 의존성 주입이 완료되어 초기화가 수행된 후 실행되는 메소드를 식별합니다 결국 초기화를 수행해야 하는 경우, 모든 의존성 빈으로 주입됩니다 데이터베이스에서 값을 몇개 검색하는 경우, 모든 의존성이 준비되자마자 @PostConstruct를 사용할 수 있습니다.
@PreDestroy 콜백 알림을 수신하는 메소드를 식별합니다 이 콜백 알림은
인스턴스가 컨테이너에 의해 제거되고 있다는 신호를 알려줍니다. 일반적으로 특정 빈이 보유하고 있는 리소스를 해제하는 데 사용됩니다. 컨테이너 또는 스프링 IoC 컨텍스트에 의해 빈이 제거되기 전에 @PreDestroy로 어노테이션된 메소드를 호출하는 건데 헤제할 리소스가 있거나 정리를 해야 하는 경우 ,
@PreDestroy로 어노테이션된 메소드에서 구현하는 것이 가장좋습니다
@Named CDI 어노테이션을 구현합니다 @Named는 CDI 어노테이션으로@Component와 유사합니다.
@Inject @Inject는 @Autowired와 매우 유사합니다.