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와 유사함 |
'Java' 카테고리의 다른 글
[SpringBoot] Spring Boot 등장 배경 (1) | 2023.12.21 |
---|---|
[SpringFramework] 개념 및 용어 정리 (0) | 2023.12.20 |
[SpringFramework] PostConstruct & PreDestroy, CDI Jakart Contexts & Dependency Injection (0) | 2023.12.18 |
[SpringFramework] Lazy Initialization vs. Eager Initialization, Bean Scopes (0) | 2023.12.17 |
[SpringFramework] Bean 우선순위 부여(@Primary, @Qualifier) (0) | 2023.11.29 |