IT Developer/Spring

Spring 기초 <35. Spring에서 커스텀 애너테이션(Custom Annotation) 만들기>

TEMA_ 2025. 4. 20. 13:25
반응형

스프링 Spring

35. Spring에서 커스텀 애너테이션(Custom Annotation) 만들기

 

안녕하세요! 태마입니다.

Spring 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

스프링 Spring

포스팅 시작하겠습니다 :)

 


 

1. 주제 간단 정리

 

1. 애너테이션(Annotation)이란?

애너테이션은 코드에 메타데이터를 추가하여, 컴파일러나 런타임 환경에서 특정 동작을 수행하도록 하는 기능
Spring에서는 @Service, @Transactional, @RestController 등의 애너테이션을 활용하여 기능을 적용 가능

📌 애너테이션의 주요 역할

역할설명
메타데이터 제공 코드의 의미를 명확히 설명
컴파일러 지시 코드의 검증 및 경고 제어
런타임 동작 리플렉션(Reflection)과 조합하여 동적 동작 수행
AOP(관점 지향 프로그래밍) 특정 로직을 공통화하여 코드 중복 제거

📌 애너테이션을 활용하면 "반복적인 코드를 줄이고, 유지보수를 쉽게 할 수 있음"


2. 애너테이션의 주요 종류

Java와 Spring에서 자주 사용하는 애너테이션 종류

📌 자주 사용되는 애너테이션 종류

애너테이션설명
@Override 부모 클래스의 메서드를 재정의할 때 사용
@Component Spring Bean으로 등록
@Service 비즈니스 로직을 담당하는 클래스에 사용
@Repository 데이터베이스 관련 클래스에 사용
@Transactional 트랜잭션 관리를 위해 사용
@RestController REST API 컨트롤러에 사용
@Autowired 의존성 주입(DI) 수행
@PostConstruct Bean 생성 후 실행되는 메서드 지정

📌 Spring에서는 애너테이션을 활용하여 의존성 주입, 트랜잭션 관리, AOP 등을 쉽게 적용 가능


✅ 여기까지 애너테이션의 개념과 필요성을 배웠습니다!
👉 "그렇다면, Spring Boot에서 커스텀 애너테이션을 어떻게 만들까?"
✅ 2부에서 Spring Boot에서 커스텀 애너테이션을 직접 만들어 활용하는 방법을 배워봅시다!

 

반응형

 


 

2. 상세 주제 정리

 

1. 기본적인 커스텀 애너테이션 만들기

Spring Boot에서 커스텀 애너테이션을 만들려면 @interface 키워드를 사용
애너테이션을 정의할 때 @Target, @Retention 등의 메타 애너테이션을 설정해야 함

📌 1️⃣ 커스텀 애너테이션 생성 (@LogExecutionTime)

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD) // 메서드에 적용
@Retention(RetentionPolicy.RUNTIME) // 런타임까지 유지
public @interface LogExecutionTime {
}

@Target(ElementType.METHOD): 이 애너테이션이 메서드에만 적용됨을 의미
@Retention(RetentionPolicy.RUNTIME): 런타임에도 애너테이션 정보가 유지됨


2. 커스텀 애너테이션을 AOP로 활용하기

커스텀 애너테이션을 적용하여 특정 기능(AOP)을 수행하도록 설정 가능

📌 1️⃣ AOP를 활용한 애너테이션 구현 (LogAspect.java)

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogAspect {

    @Around("@annotation(com.example.annotation.LogExecutionTime)")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object proceed = joinPoint.proceed();
        long executionTime = System.currentTimeMillis() - start;

        System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        return proceed;
    }
}

@Around("@annotation(LogExecutionTime)"): @LogExecutionTime이 적용된 메서드의 실행 시간을 측정
AOP를 활용하면 "공통 로직을 분리하여 코드 중복을 제거 가능"

📌 커스텀 애너테이션을 활용하면 "성능 모니터링을 쉽게 적용 가능"


3. 커스텀 애너테이션을 적용한 서비스 구현

이제 @LogExecutionTime 애너테이션을 서비스에 적용하여 실행 시간을 측정해보자

📌 1️⃣ 서비스 클래스에서 애너테이션 적용 (UserService.java)

import org.springframework.stereotype.Service;

@Service
public class UserService {

    @LogExecutionTime
    public void getUserData() {
        try {
            Thread.sleep(1000); // 1초 동안 실행
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("User data fetched.");
    }
}

@LogExecutionTime 애너테이션을 적용하면 실행 시간이 자동으로 로깅됨

📌 2️⃣ 컨트롤러에서 서비스 호출 (UserController.java)

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/fetch")
    public String fetchUser() {
        userService.getUserData();
        return "User data fetched.";
    }
}

이제 /users/fetch 엔드포인트를 호출하면 실행 시간이 자동으로 출력됨

📌 커스텀 애너테이션을 활용하면 "반복되는 로직을 공통화하여 코드의 가독성과 유지보수성을 향상 가능"


✅ 여기까지 Spring Boot에서 커스텀 애너테이션을 만들어 활용하는 방법을 배웠습니다!
👉 "그렇다면, Spring Boot에서 외부 API를 호출할 때 RestTemplate vs WebClient는 어떤 차이가 있을까?"
✅ 다음 회차에서 **Spring Boot에서 외부 API 호출 (RestTemplate vs WebClient 비교)**를 배워봅시다!

 



 

반응형