Loading the catalog…
Loading the catalog…
Spring을 사용하다 보면 @Component , @Service , @Bean , @RestController , @SpringBootApplication 같은 어노테이션을 자주 사용한다. 처음에는 각각 별개의 기능처럼 보이지만, 실제로는 Java의 메타 어노테이션을 기반으로 만들어지고, Spring이 이를 해석해 Bean 등록, 의존성 주입, 트랜잭션 처리 같은 기능을 수행한다. 이번 글에서는 어노테이션을 하나씩 외우기보다 전체 구조를 기준으로 정리한다. 1. 어노테이션이란 어노테이션은 코드에 부가적인 정보를 붙이는 메타데이터 다. 예를 들어: @Component public class ChatModerationMetrics { } @Component 자체가 객체를 생성하는 것은 아니다. Spring이 실행 과정에서 @Component 를 읽고 해당 클래스를 Bean 등록 대상으로 판단한다. 구분 의미 Annotation 코드에 부가 정보를 붙이는 메타데이터 Spring 어노테이션 정보를 읽고 해석 결과 Bean 등록, 의존성 주입, 트랜잭션 처리 등 전체 흐름은 다음과 같다. Annotation → 메타데이터 제공 → Spring이 읽음 → 특정 동작 수행 즉 어노테이션 자체가 기능을 실행하는 것이 아니라, Spring이 어노테이션을 읽고 기능을 수행한다 고 보면 된다. 2. 메타 어노테이션 메타 어노테이션은 어노테이션에 붙이는 어노테이션 이다. 새로운 어노테이션을 만들 때 해당 어노테이션을 어디에 사용할 수 있는지, 언제까지 유지할지 같은 규칙을 정한다. 어노테이션 역할 @Target 어디에 붙일 수 있는지 지정 @Retention 언제까지 유지할지 지정 @Documented Javadoc에 포함할지 지정 @Inherited 부모 클래스의 어노테이션을 상속할지 지정 @Repeatable 같은 어노테이션을 여러 번 사용할 수 있게 함 예를 들어: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { } 여기서 @Target , @Retention 은 MyAnnotation 자체의 규칙을 정의한다. 2-1. @Target @Target 은 어노테이션을 어디에 사용할 수 있는지 지정한다. @Target(ElementType.TYPE) ElementType 사용 위치 TYPE 클래스, 인터페이스, enum METHOD 메서드 FIELD 필드 PARAMETER 메서드 파라미터 CONSTRUCTOR 생성자 ANNOTATION_TYPE 다른 어노테이션 예를 들어: @Target(ElementType.METHOD) 이라면 해당 어노테이션은 메서드에 사용할 수 있다. 2-2. @Retention @Retention 은 어노테이션 정보를 언제까지 유지할지 정한다. RetentionPolicy 의미 SOURCE 소스 코드에만 존재 CLASS 컴파일된 .class 파일까지 유지 RUNTIME 프로그램 실행 중에도 유지 Spring은 실행 중에 어노테이션 정보를 읽어야 하기 때문에 RUNTIME 을 사용하는 경우가 많다. @Retention(RetentionPolicy.RUNTIME) 2-3. @Documented @Documented 는 해당 어노테이션 정보를 Javadoc에 포함하도록 한다. @Documented 애플리케이션 기능보다는 문서 생성과 관련된 설정이다. 2-4. @Inherited @Inherited 는 부모 클래스에 선언된 어노테이션을 자식 클래스에서도 상속받을 수 있도록 한다. @Inherited 클래스 상속 관계를 기준으로 동작한다. 2-5. @Repeatable @Repeatable 은 동일한 어노테이션을 하나의 대상에 여러 번 선언할 수 있도록 한다. 개념적으로: @SomeAnnotation @SomeAnnotation public class Example { } 처럼 사용할 수 있다. 3. Spring에서 Bean을 등록하는 어노테이션 Spring을 사용할 때 가장 중요한 개념 중 하나가 Bean 등록이다. Bean을 등록하는 대표적인 방법은 크게 두 가지다. 방식 대표 어노테이션 클래스 자체를 Bean 후보로 등록 @Component 계열 메서드가 반환한 객체를 Bean으로 등록 @Bean 3-1. @Component @Component 는 클래스를 Spring의 Bean 등록 대상으로 표시한다. 구조를 단순화하면 다음과 같다. @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Component { String value() default ""; } 구성 의미 @Target(TYPE) 클래스 같은 타입에 사용 @Retention(RUNTIME) 실행 중에도 유지 @Documented Javadoc에 포함 Spring은 Component Scan 과정에서 @Component 가 붙은 클래스를 찾아 Bean으로 등록한다. @Component 발견 → 객체 생성 → Spring Container에 Bean 등록 → 다른 Bean에서 주입 가능 3-2. @Service , @Repository , @Controller @Service , @Repository , @Controller 도 Bean 등록 대상이다. 이 어노테이션들은 내부적으로 @Component 를 포함한다. 예를 들어 @Service 는 개념적으로 다음과 같다. @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Service { } 관계는 다음과 같다. @Component ↑ ├─ @Service ├─ @Repository └─ @Controller 어노테이션 주로 사용하는 역할 @Component 일반적인 Spring Bean @Service 비즈니스 로직 @Repository 데이터 접근 계층 @Controller Web 요청 처리 Bean 등록이라는 공통 기능은 같지만, 클래스의 역할을 명확하게 표현하기 위해 구분해서 사용한다. 3-3. 왜 @Service 에도 @Target , @Retention 이 또 있을까? @Component 에도 @Target , @Retention 이 있는데 @Service 에도 다시 선언되어 있어서 처음에는 중복처럼 보일 수 있다. 하지만 각각 다른 어노테이션의 규칙이다. 위치 의미 @Component 의 @Target @Component 를 어디에 붙일 수 있는지 @Service 의 @Target @Service 를 어디에 붙일 수 있는지 @Component 의 @Retention @Component 의 유지 기간 @Service 의 @Retention @Service 의 유지 기간 즉 각각 자기 자신의 규칙을 가진다. @Target @Retention ↓ @Component 그리고: @Target @Retention @Component ↓ @Service @Service 안의 @Component 는 Spring Bean 후보라는 의미를 가져오는 역할 이고, @Target , @Retention 은 @Service 자체의 사용 규칙을 정한다. 3-4. @Configuration @Configuration 은 설정 정보를 정의하는 클래스에 사용한다. @Configuration public class AppConfig { } 이 클래스 안에서는 주로 @Bean 을 사용해 Bean을 직접 등록한다. 개념적으로: @Configuration → Spring 설정 클래스 → 내부의 @Bean 메서드를 처리 라고 보면 된다. 3-5. @Bean @Bean 은 메서드가 반환하는 객체를 Spring Bean으로 등록한다. 예를 들어: @Configuration public class AppConfig { @Bean public SomeService someService() { return new SomeService(); } } 여기서는 SomeService 클래스에 @Component 를 붙이지 않아도 Bean으로 등록된다. 구분 @Component @Bean 붙는 위치 클래스 메서드 등록 대상 해당 클래스의 객체 메서드 반환 객체 등록 방식 Component Scan 설정 클래스 처리 주로 사용 직접 만든 클래스 외부 라이브러리 객체, 직접 설정이 필요한 객체 즉: @Component → 이 클래스 자체를 Bean으로 관리해 @Bean → 이 메서드가 반환한 객체를 Bean으로 관리해 라는 차이다. 4. 합성 어노테이션 여러 어노테이션의 의미를 조합해 하나의 어노테이션으로 만든 것을 합성 어노테이션(Composed Annotation) 이라고 한다. 4-1. 합성 어노테이션이란 Spring에서는 여러 기능을 반복해서 선언하지 않도록 어노테이션을 조합해 사용한다. 예를 들어: @Controller @ResponseBody 를 매번 같이 사용할 수 있지만, 이를 합쳐 @RestController 로 제공한다. 4-2. @RestController @RestController 는 개념적으로 다음 두 어노테이션의 조합이다. @RestController = @Controller + @ResponseBody 구성 역할 @Controller Controller 역할 및 Bean 등록 @ResponseBody 반환값을 HTTP Response Body에 작성 그래서 REST API Controller에서는 보통 @RestController 를 사용한다. 4-3. @SpringBootApplication @SpringBootApplication 도 대표적인 합성 어노테이션이다. 주요 구성은 다음과 같다. @SpringBootApplication ↓ @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan 어노테이션 역할 @SpringBootConfiguration Spring Boot 설정 클래스 @EnableAutoConfiguration 자동 설정 활성화 @ComponentScan Component Scan 활성화 그래서 애플리케이션 시작 클래스에 @SpringBootApplication 하나만 선언해도 여러 기능이 동시에 활성화된다. 5. Bean 등록 이후에 사용하는 주요 어노테이션 Bean을 등록한 이후에는 Bean 간 연결이나 동작 제어를 위해 다른 어노테이션을 사용한다. 5-1. @Autowired @Autowired 는 Spring Bean 사이의 의존성을 주입할 때 사용한다. 예를 들어: @Autowired private SomeService someService; 처럼 사용할 수 있다. 현재는 생성자 주입을 많이 사용하기 때문에 생성자가 하나라면 @Autowired 를 생략하는 경우도 많다. 핵심은: 필요한 Bean을 찾아 → 해당 위치에 주입 하는 역할이다. 5-2. @Transactional @Transactional 은 메서드나 클래스에 트랜잭션 경계를 설정한다. @Transactional public void save() { } Spring은 해당 메서드 호출을 감싸 트랜잭션을 시작하고, 정상 종료 시 Commit, 예외 발생 시 Rollback 등을 처리한다. 어노테이션 역할 @Autowired Bean 의존성 주입 @Transactional 트랜잭션 경계 설정 이 어노테이션들은 @Component 처럼 Bean 자체를 등록하는 어노테이션은 아니다. 이미 등록된 Bean의 동작을 설정하는 데 사용한다. 6. 전체 구조 정리 전체 구조를 단순하게 정리하면 다음과 같다. Java Annotation │ ├─ Meta Annotation │ ├─ @Target │ ├─ @Retention │ ├─ @Documented │ ├─ @Inherited │ └─ @Repeatable │ └─ Spring Annotation │ ├─ Bean 등록 │ ├─ @Component │ │ ├─ @Service │ │ ├─ @Repository │ │ └─ @Controller │ │ │ ├─ @Configuration │ └─ @Bean │ ├─ 합성 Annotation │ ├─ @RestController │ │ ├─ @Controller │ │ └─ @ResponseBody │ │ │ └─ @SpringBootApplication │ ├─ @SpringBootConfiguration │ ├─ @EnableAutoConfiguration │ └─ @ComponentScan │ └─ Bean 동작 제어 ├─ @Autowired └─ @Transactional 핵심만 다시 표로 정리하면 다음과 같다. 구분 핵심 Annotation 코드에 부가 정보를 붙이는 메타데이터 Meta Annotation 어노테이션 자체의 규칙 정의 @Component 클래스를 Bean 등록 대상으로 지정 @Bean 메서드 반환 객체를 Bean으로 등록 @Configuration Bean 설정 클래스 합성 어노테이션 여러 어노테이션의 의미를 조합 @Autowired Bean 의존성 주입 @Transactional 트랜잭션 경계 설정 어노테이션을 볼 때는 다음 순서로 확인하면 이해하기 쉽다. 1. 어디에 붙는가? 2. 언제까지 유지되는가? 3. 어떤 어노테이션을 포함하고 있는가? 4. Bean 등록과 관련된 것인가? 5. 이미 등록된 Bean의 동작을 제어하는 것인가?
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
[Spring] 어노테이션 구조 정리: 메타 어노테이션부터 Bean 등록, 합성 어노테이션까지. Spring을 사용하다 보면 @Component , @Service , @Bean , @RestController , @SpringBootApplication 같은 어노테이션을 자주 사용한다. 처음에는 각각 별개의 기능처럼 보이지만, 실제로는 Java의 메타 어노테이션을 기반으로 만들어지고, Spring이 이를 해석해 Bean 등록, 의존성 주입, 트랜잭션 처리 같은 기능을 수행한다. 이번 글에서는 어노테이션을 하나씩 외우기보다 전체 구조를 기준으로 정리한다. 1. 어노테이션이란 어노테이션은 코드에 부가적인 정보를 붙이는 메타데이터 다. 예를 들어: @Component public class…
Open source