어노테이션이란?
어노테이션이란 클래스, 메소드, 변수 등 코드의 특정 부분에 메타 데이터를 추가하는 방법입니다. 주석처럼 사용하며 Bean 주입, 클래스 역할 정의, lombok 을 수행해 자동으로 getter나 setter를 생성하기도 합니다. 특별한 의미를 부여하거나 기능을 부여하는 등 다양한 역할을 수행합니다.
어노테이션을 사용하면 설정을 간소화할 수 있으며 코드가 어떤 역할을 하는지 명확하게 표현할 수 있습니다. 이를 통해 코드량이 감소하고 유지보수하기 쉬워지며 생산성이 증가됩니다.
메타 데이터 : 이 데이터가 어떤 데이터인지 정보를 제공하는 데이터
어노테이션의 사전적 의미는 주석이라는 뜻입니다. 사전적 의미가 주석인 것답게 코드 상에서도 주석처럼 사용하며 클래스, 메소드, 변수 위에 @어노테이션 붙이는 형식으로 사용합니다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CshelperApplication {
public static void main(String[] args) {
SpringApplication.run(CshelperApplication.class, args);
}
}
어노테이션 사용하기 위한 순서
- 어노테이션을 정의한다.
- 클래스에 어노테이션을 배치한다.
- 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하여 기능을 실현한다.
@interface 키워드를 사용하여 직접 어노테이션을 만들 수도 있습니다. 이를 사용자 어노테이션이라 하며 사용자가 지정한 규칙이나 메타데이터를 코드에 포함시킬 수 있습니다.
어노테이션 특징
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공
- 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공
- 실행시(런타임시) 특정 기능을 실행하도록 정보를 제공
컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공
어노테이션은 컴파일러에게 코드가 특정 규칙을 준수하도록 지시합니다. 예를 들어 @Override 어노테이션은 메소드가 상위 클래스나 인터페이스에 존재하는지 확인합니다. 없다면 컴파일러는 에러를 발생시켜 개발자의 실수를 알립니다. 이러한 방식으로 어노테이션은 컴파일 타임에 코드의 정확성을 보장하는데 도움을 줍니다.
소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
어노테이션은 빌드 과정 중에 코드를 자동으로 생성하거나 수정하는데 사용될 수 있습니다. 예를 들어 Lombok 라이브러리의 @Getter, @Setter 어노테이션은 해당 필드에 getter, setter 메소드를 컴파일 시점에 자동으로 생성합니다. 반복적인 코드를 작성하는 수고를 줄일 수 있으며 코드의 간결성을 향상시켜 가독성을 높입니다.
실행시 특정 기능을 실행하도록 정보 제공
일부 어노테이션은 런타임에 특정 기능을 수행할 수 있습니다. @Autowired는 런타임에 의존성 주입을 수행합니다. 스프링 컨테이너는 @Autowired가 적용된 필드에 자동으로 적절한 빈을 주입합니다. 런타임에 어노테이션을 처리하는 것은 복잡한 설정을 간소화하는데 도움을 줍니다.
어노테이션 장점
어노테이션의 주요 장점은 코드의 간결성과 가독성을 높여주는 것입니다.
- 설정 간소화 : 어노테이션을 사용하면 작동 방식, 구성 요소 간의 관계, 의존성 관리 등을 쉽게 설정할 수 있습니다. @Autowired는 의존성 자동 주입, @Transactional 트랜잭션 관리를 설정합니다.
- 의도 명확 : 개발자의 의도를 코드에 명확하게 표현할 수 있습니다. @Service, @Repository 같은 어노테이션은 해당 클래스의 역할을 명확하게 표현합니다.
- 코드 생성 : 생성자, 메소드를 자동으로 생성합니다. 반복적이고 템플릿화된 코드를 줄일 수 있어 코드의 간결성을 향상시키고, 가독성을 높이며, 유지보수를 용이하게 합니다. @Getter, @Setter 메소드를 @NoArgsConstructor, @AllArgsConstructor 생성자를 생성합니다.
이 외에도 테스트를 용이하게 하는 @MocBean, 환경을 구성하는 @Profile 등이 있으며 다양한 역할을 수행합니다.
어노테이션 단점
어노테이션의 주요 단점은 숨겨진 동작과 복잡성 증가입니다.
- 불투명한 프로세스 : 어노테이션은 때로는 프로그램의 실제 동작을 숨깁니다. 예를 들어 @Transactional 어노테이션은 트랜잭션 관리를 자동화하지만, 이로 인해 실제로 어떤 일이 발생하는지 명확하게 파악하기 어려울 수 있습니다.
- 디버깅 어려움 : 어노테이션으로 인해 발생하는 문제는 종종 런타임에만 나타나며 이는 오류의 원인을 찾고 해결하는 것을 어렵게 만듭니다.
이를 해결하기 위해 어노테이션의 내부 작동 원리를 이해하고 로깅을 통해 디버깅을 용이하게 하는 방법이 있습니다.