Search

1일차) 어노테이션

주제

어노테이션을 사용하는 이유 (효과) 는 무엇일까?
나만의 어노테이션은 어떻게 만들 수 있을까?

 주요 내용

키워드

어노테이션
자주 사용하는 어노테이션
리플렉션

 추가 질문

질문 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

equalshashCode 메소드를 자동으로 생성한다.
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