Spring 기초 <35. Spring에서 커스텀 애너테이션(Custom Annotation) 만들기>
스프링 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 비교)**를 배워봅시다!