Java

[SpringFramework] Spring Annotations

ride-dev 2023. 12. 20. 16:02

Spring 스테레오타입 어노테이션 

@Component

Spring Bean을 만들 때마다 @Component를 추가했습니다.

제네릭 어노테이션이며 모든 클래스에 적용가능합니다.

특정 클래스에 Spring Bean을 생성하려는 경우에 @Component를 사용할 수 있습니다.

모든 Spring 스테레오타입 어노테이션의 기초입니다.

@Component의 특수화(Specializations)

@Service

보통 어노테이션한 클래스에 비즈니스 로직이 있음을 나타냅니다.

클래스에 비즈니스 로직이 있다면 @Component 대신 @Service를 사용할 수 있습니다.

@Controller

어노테이션한 클래스가 Controller임을 나타냅니다.

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

@Repository

어노테이션한 클래스가 Bean이 DB와 통신하는 경우, 데이터를 저장, 검색, 조작할 때 사용됨을 나타냅니다.

 

이외에도 @Component를 특수화한 어노테이션이 많으며,

@Service, @Controller, @Repository는 스테레오타입 어노테이션입니다.

 

권장

@Component의 특수화 어노테이션은 @Component와 동일한 수행을 하지만

최대한 구체적인 어노테이션을 사용하는 것이 좋습니다.

(@Component의 특수화 어노테이션을 사용하는 것이 좋습니다)

비즈니스 로직을 포함한 클래스를 만들 때는 @Service를,

웹 컨트롤러 클래스를 만들 때는 @Controller를,

DB 통신 클래스를 만들 때는 @Repository를 사용하고

해당하지 않을 때는 제네릭 어노테이션인 @Component를 사용합니다.

구체적으로 사용하는 이유

개발자가 의도한 것을 프레임워크에 명시적으로 나타낼 수 있습니다.

(특정 클래스의 역할에 대한 정보를 표기하는 것입니다)

나중에 AOP(관점 지향 프로그래밍)을 사용하여 어노테이션을 감지하고

그 위에 부가적인 동작을 추가할 수 있습니다.

예컨대 @Repository가 있다면 Spring Framework에서 자동으로 JDBC 예외 변환 기능에 연결합니다.

Spring Annotations 정리

Annotation
어노테이션
Description
설명
@Configuration 클래스가 @Bean메서드를 하나 이상 선언함을 나타냄
Spring 컨테이너에서 처리하여 Bean 정의를 생성
@Configuration을 추가하면 Java 설정파일을 만드는 것을 의미함
Java 설정파일에서는 메서드를 몇 개든 정의할 수 있고 이러한 메서드에 @Bean 어노테이션을 추가할 수 있음
그러면 메서드로 반환되는 모든 값에 Spring이 Bean을 자동으로 생성함
@ComponentScan 컴포넌트를 스캔할 특정 패키지를 정의함
Spring Framework에서는 모든 컴포넌트가 정의된 위치를 알아야 함
패키지를 지정할 수 있으며, 지정하지 않으면 이 어노테이션을 선언한 클래스의 패키지에서(하위도 포함) 스캔함

@Component 클래스가 컴포넌트임을 나타냄
클래스가 ComponentScan에 속한다면 Spring Bean이 생성됨
@Service 클래스의 비즈니스 로직이 있음을 나타내는 @Component의 종류 중 하나임
@Controller 클래스가 컨트롤러임을 나타내는 @Component의 종류 중 하나임
웹 컨트롤러를 예시로 들 수 있음
일반적으로 웹 애플리케이션과 REST API에서 컨트롤러를 정의하는 데 사용됨 
@Respository 클래스가 DB에서 데이터를 검색하거나 조작하는 데 사용되는 것을 나타내는 @Component의 종류 중 하나임

 

Annotation
어노테이션
Description
설명
@Primary 여러 Bean이 단일 값 의존성에 자동 연결될 후보일 때 Bean에 우선순위를 부여하는 것을 나타냄
후보가 여러 개일 때 특정한 Bean에 우선순위를 두려면 @Primary를 사용
일반적인 우선 순위를 정할 때 사용
@Qualifier 자동 연결 시 후보 Bean의 한정자로 필드나 매개 변수에서 사용됨
@Primary보다 구체적임
특정한 한정자로 Bean을 자동 연결하고자 할 때 사용
@Lazy Spring Bean은 일반적으로 즉시 초기화이며(@Eager)컨텍스트가 실행되는 대로 초기화됨
@Lazy는 Bean을 지연 초기화하려 할 때 사용함
@Scope(value=
ConfigurableBeanFactory
.SCOPE_PROTOTYPE)
특정 컴포넌트에 스코프를 정의할 수 있음
Bean을 참조할 때마다 인스턴스가 새로 만들어짐
기본적인 스코프는 싱글톤이며(SINGLETON) IoC 컨테이너에 특정 Bean의 인스턴스 하나씩만 주어짐
(Bean을 참조할 때마다 동일한 인스턴스를 재사용)

 

Annotation
어노테이션
Description
설명
@PostConstruct 의존성 주입이 수행된 이후, 초기화를 위해 실행될 메서드를 나타냄
모든 의존성을 Bean에 주입한 후 초기화하려는 경우,
모든 의존성이 준비되는 대로 DB에서 몇 가지 값을 가져오려는 경우에 사용함
@PreDestroy 컨테이너에서 인스턴스를 삭제하는 과정을 거치고 있음을 알려주는 콜백 알림을 수신하는 메서드를 나타냄
보통 특정한 Bean에서 보유하고 있는 리소스를 해제하는 데 사용
컨테이너나 Spring IoC컨텍스트에서 Bean이 삭제되기 전에 @PreDestroy가 붙은 메서드를 호출함
(리소스를 해제해야 하거나 정리해야 한다면 사용)
@Named Jakarta CDI 어노테이션으로 @Component와 유사함
@Inject Jakarta CDI 어노테이션으로 @Autowired와 유사함

 

728x90