어노테이션(Annotation)이란? 🤔
어노테이션(annotation)은 '주석'을 의미하는 용어로, 주로 @xxx 형태로 작성됩니다. 외부 소프트웨어나 프레임워크에 특정 처리를 전달하기 위해 사용되며, 코드를 좀 더 명확하고 유지보수하기 쉽게 만들어 줍니다. 이번 글에서는 어노테이션의 다양한 사용 사례와 '가려쓰기' 개념에 대해 알아보겠습니다.
인스턴스 생성 어노테이션의 '가려쓰기'
앞서 DI 컨테이너에서 인스턴스를 생성하는 어노테이션에 대해 이야기했습니다. 이번에는 인스턴스 생성과 관련된 네 가지 어노테이션을 '가려 쓰기' 하는 방법을 설명하려 합니다.
'가려쓰기'란 네 종류의 어노테이션이 모두 인스턴스 생성을 위한 것이지만, 사용되는 위치에 따라 적절하게 구분해 사용하자는 의미입니다. 이때 사용되는 위치를 이해하려면 '레이어'라는 개념을 알아야 합니다.
레이어란?
'레이어'란 말 그대로 프로그램의 계층을 의미합니다. 시스템을 계층 구조로 나누는 다양한 방법이 있지만, 여기서는 도메인 주도 설계(Domain-Driven Design)에서 사용되는 세 가지 레이어로 나누어 설명하겠습니다.
| 레이어 | 개요 |
|---|---|
| 애플리케이션 레이어 (Application Layer) | 클라이언트와의 데이터 입출력을 제어하는 레이어를 의미합니다. |
| 도메인 레이어 (Domain Layer) | 애플리케이션의 중심이 되는 레이어로서, 주요 비즈니스 로직을 처리합니다. |
| 인프라스트럭처 레이어 (Infrastructure Layer) | 데이터베이스에 대한 접근과 데이터 영속성을 담당하는 레이어입니다. |
인스턴스 생성 어노테이션
각 레이어별로 사용되는 주요 어노테이션을 정리하면 다음과 같습니다.
📌 주요 어노테이션
| 어노테이션 | 개요 |
|---|---|
@Controller |
애플리케이션 레이어의 컨트롤러에 부여됩니다. 클라이언트 요청을 처리하고, 적절한 응답을 반환합니다. |
@Service |
도메인 레이어의 비즈니스 로직 처리 클래스에 부여됩니다. 업무 로직을 수행합니다. |
@Repository |
인프라스트럭처 레이어의 데이터베이스 액세스 클래스에 부여됩니다. 데이터베이스와의 상호작용을 처리합니다. |
📌 보조 어노테이션
| 어노테이션 | 개요 |
|---|---|
@Component |
@Controller, @Service, @Repository 외의 클래스에 부여됩니다. 하위 로직을 처리하거나 유틸리티 클래스 등을 나타냅니다. |
커스텀 어노테이션 만들기
개발자는 필요에 따라 커스텀 어노테이션을 정의할 수도 있습니다. 커스텀 어노테이션은 java.lang.annotation 패키지의 Annotation 인터페이스를 상속하여 만듭니다. 이를 정의할 때는 전용 자바 파일을 생성하며, @interface 키워드를 사용합니다.
예를 들어, 다음과 같이 간단한 커스텀 어노테이션을 작성할 수 있습니다:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
String value() default "";
}
@Target: 어노테이션을 적용할 위치를 지정합니다. 예를 들어,ElementType.METHOD는 메서드에만 어노테이션을 적용할 수 있다는 의미입니다.@Retention: 어노테이션의 유지 정책을 지정합니다.RetentionPolicy.RUNTIME은 런타임까지 어노테이션이 유지되어야 한다는 의미입니다.
이처럼 커스텀 어노테이션을 사용하면, 코드의 가독성을 높이고 특정 기능을 쉽게 재사용할 수 있는 이점이 있습니다.
'🌱 Spring > Spring Boot' 카테고리의 다른 글
| [Spring] Spring Security (1) | 2024.10.16 |
|---|---|
| [Spring] Spring Batch - Batch와 Job, Step (1) | 2024.10.16 |
| [Spring] Spring MVC (0) | 2024.10.16 |
| [Spring] Spring AOP (0) | 2024.10.16 |
| [Spring] Spring IoC(Inversion of Control)와 DI(Dependency Injection) (0) | 2024.10.16 |
