주제
어노테이션을 사용하는 이유 (효과) 는 무엇일까?
나만의 어노테이션은 어떻게 만들 수 있을까?
주요 내용
키워드
어노테이션
자주 사용하는 어노테이션
리플렉션
추가 질문
질문 1
•
어노테이션의 적용 대상은 어떻게 설정할까?
질문 2
•
어노테이션의 유지 기간
어노테이션
자바 언어에서 추가적인 메타데이터를 제공하는 데 사용되는 기호다.
어노테이션은 주로 컴파일러에게 코드에 대한 정보를 제공하거나 런타임 시 동적으로 처리되도록 한다.
어노테이션은 "@"로 시작하며, 클래스, 메소드, 변수 등에 적용될 수 있다
어노테이션을 사용하는 이유
주 목적은 코드의 가독성을 높이고 유지보수를 용이하게 해준다.
예를 들어, @Override 어노테이션을 사용하면 메소드가 부모 클래스의 메소드를 재정의한다는 것을 나타내주고 컴파일러가 해당 어노테이션을 통해서 확인하도록 돕는다.
또한, 어노테이션은 프레임워크 및 라이브러리와 통합되어 특정 기능을 자동화하거나 처리 흐름을 간소화한다.
나만의 어노테이션은 어떻게 만들 수 있는가?
@Target(ElementType.METHOD) // 적용 대상 지정
public @interface MyAnnotation {
}
Java
복사
이렇게 정의한 어노테이션은 메소드에 적용될 수 있다.
public class MyClass {
@MyAnnotation("Test Value")
public void myMethod() {
}
}
Java
복사
어노테이션의 적용 대상은 어떻게 설정
어노테이션의 적용 대상은 @Target 어노테이션을 사용하여 설정할 수 있다.
이 어노테이션은 ElementType 배열을 인자로 받아, 어노테이션이 적용될 수 있는 대상(클래스, 메소드, 필드 등)을 지정한다.
예를 들어, @Target(ElementType.METHOD)는 해당 어노테이션이 메소드에만 적용될 수 있음을 의미한다.
어노테이션의 유지 기간
어노테이션의 유지 기간은 어노테이션이 언제까지 유효한지를 결정한다.
RetentionPolicy를 사용하여 설정할 수 있고,
SOURCE(컴파일 시 제거),
CLASS(클래스 파일에 포함),
RUNTIME(런타임에 사용 가능)
세 가지로 구분된다.
어노테이션 종류
롬복 어노테이션
@Getter / @Setter:
클래스의 모든 필드에 대해 자동으로 Getter와 Setter 메소드를 생성한다.
@ToString
클래스의 필드들을 기반으로 toString 메소드를 자동으로 생성한다.
@EqualsAndHashCode
equals와 hashCode 메소드를 자동으로 생성한다.
callSuper 옵션을 통해 부모 클래스의 필드들도 고려할지 여부를 결정할 수 있다.
@Data
•
@Getter
•
@Setter
•
@ToString
•
@EqualsAndHashCode
•
@AllArgsConstructor
등을 모두 포함한다.
주로 DTO 클래스나 엔티티 클래스에서 사용된다.
@NoArgsConstructor
기본 생성자를 자동으로 생성한다.
access 옵션을 통해 생성자의 접근 수준을 지정할 수 있다.
@AllArgsConstructor
클래스의 모든 필드를 파라미터로 받는 생성자를 자동으로 생성한다.
@RequiredArgsConstructor
final 또는 @NonNull로 지정된 필드에 대해 파라미터로 받는 생성자를 자동으로 생성한다.
@Builder
빌더 패턴을 사용해 객체를 생성하는 메소드를 자동으로 생성한다.
특정 필드에 어떤 값을 채울지 명확하게 설정할 수 있다.
컨트롤러에서 자주 사용하는 어노테이션
@Controller
스프링 MVC 컨트롤러를 정의하며, 주로 요청을 처리하고 뷰를 반환하는 역할을 한다.
@RestController
@Controller와 @ResponseBody의 기능을 함께 제공하며, 메소드의 반환 값을 바로 JSON 형태로 응답한다.
@RequestMapping
특정 URL에 대해 어떤 메소드가 처리할지 매핑해주는 어노테이션이다.
메소드나 클래스에 적용되며, 요청 타입(GET, POST 등)도 함께 지정할 수 있다.
@GetMapping / @PostMapping / @PutMapping / @DeleteMapping
각각 @RequestMapping에 대한 특정 요청 타입(GET, POST, PUT, DELETE)에 대한 단축키 역할을 한다.
@ResponseBody
컨트롤러의 메소드가 반환하는 값을 HTTP 응답의 본문으로 직접 반환하도록 한다.
@PathVariable
URL 경로에서 특정 값을 메소드 파라미터로 바인딩한다.
서비스에서 자주 사용하는 어노테이션
@Service
비즈니스 로직을 수행하는 클래스에 사용되는 어노테이션이다.
@Repository
DAO 클래스로 사용되는 어노테이션이며, 데이터베이스에 접근하는 메소드들을 포함한 클래스를 지정한다.
@Transactional
메소드나 클래스의 DB 트랜잭션을 관리하는 어노테이션으로, 트랜잭션 내 모든 작업이 성공적으로 완료되어야만 커밋이 이루어지고, 그렇지 않으면 롤백한다.
@Cacheable
메소드 호출 결과를 캐시에 저장하여, 동일한 호출에 대한 중복 작업을 피하도록 한다.
@CacheEvict
캐시에서 데이터를 제거하는 데 사용된다.
@Autowired
클래스, 메소드, 또는 필드에 의존성을 자동으로 주입하여 빈을 주입할 수 있게 한다.
레파지토리에서 자주 사용하는 어노테이션
@Repository
해당 클래스가 DAO(데이터 접근 객체)임을 나타내며, 데이터베이스에 접근하는 메소드들을 포함하고 있다는 것을 나타낸다.
이 어노테이션은 DAO 메소드에서 발생하는 예외를 스프링의 DataAccessException으로 처리해 주기도 한다.
@Transactional
데이터베이스 작업을 수행하는 메소드나 클래스에 적용되어, 트랜잭션이 성공적으로 완료되면 커밋하고 실패하면 롤백하도록 관리한다. 데이터베이스 작업의 일관성과 무결성을 보장할 수 있다.
@Query
JPA 레파지토리 인터페이스에서 사용되며, 직접 작성한 JPQL 쿼리를 통해 데이터를 조회하거나 조작할 수 있게 해준다. 복잡한 쿼리를 명시적으로 정의하고 실행할 수 있다.
@Modifying
@Query 어노테이션과 함께 사용되어, 쿼리 결과에 따라 데이터베이스의 변경을 수행할 수 있도록 한다.
주로 업데이트, 삭제, 삽입 작업에 사용된다.
@PersistenceContext
EntityManager를 주입하여 데이터베이스에 대한 조작을 수행할 수 있게 해준다.
EntityManager를 통해 데이터베이스에 대한 CRUD 작업을 직접 수행할 수 있다.
그 외 어노테이션들
@Scope
스프링 빈의 범위를 지정하는 어노테이션이다.
기본값은 싱글톤(singleton)으로 설정되어 있으나, 프로토타입(prototype), 요청(request), 세션(session) 등의 범위로도 설정할 수 있다.
예를 들어, @Scope("prototype")은 새로운 인스턴스가 매번 생성되도록 한다.
@Async
비동기적으로 실행될 메소드를 지정하는 어노테이션이다.
이 어노테이션이 있는 메소드는 별도의 스레드에서 실행되어 호출자가 결과를 기다리지 않고 계속해서 수행될 수 있다.
@Primary
동일한 타입의 여러 빈이 있을 때 우선적으로 사용될 빈을 지정하는 어노테이션이다.
특정 빈이 주입되는 상황에서 우선순위를 지정할 수 있다.
@Conditional
특정 조건이 만족될 때만 빈을 등록하는 데 사용되는 어노테이션이다.
@ConditionalOnClass, @ConditionalOnMissingClass 등의 다양한 조건을 설정할 수 있다.
@Scheduled
정해진 주기에 따라 메소드를 실행하게 하는 어노테이션이다.
cron 표현식을 이용하여 실행 주기를 설정할 수 있으며, 주기적으로 실행해야 할 작업에 유용하게 사용된다.
@Import
다른 구성 클래스를 현재 설정에 포함시키는 어노테이션이다.
구성 클래스를 모듈화하고 프로젝트의 복잡성을 줄일 수 있다.
@Profile
스프링 빈이 특정 프로파일에서만 활성화되도록 지정하는 어노테이션이다.
환경에 따라 서로 다른 빈을 등록할 수 있다.
예를 들어, @Profile("dev")는 개발 환경에서만 해당 빈이 활성화되도록 한다.
참고
챗GPT