
1. 어노테이션 이란
Annotation은 사전적 의미로는 주석이라는 뜻입니다.
프로그래밍에서 주석은 개발자가 코드를 더 직관적으로 이해하고 다른 사람에게 설명하기 쉽도록 상세한 정보를 제공하는 코드 내 설명문입니다. 주석은 코드의 목적, 동작 방식, 주의사항 등을 문서화하는 데 사용됩니다. 어노테이션은 주석과 외형적으로 유사해 보일 수 있지만, 그 본질적인 역할과 용도가 매우 다릅니다. 주석이 개발자와 같은 사람에게 코드에 대한 설명과 문서화된 정보를 제공하는 것이 목적이라면, 어노테이션은 프로그램 실행 과정에서 특정 동작이나 처리를 지시하는 메타데이터로서 프로그램에 직접적인 정보를 전달하는 도구입니다.
2. 어노테이션역할
- 컴파일러에게 문법 에러를 체크하도록 정보를 제공합니다.
- 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공합니다.
- 런타임에 특정 기능을 실행하도록 정보를 제공합니다.
어노테이션은 @ 기호를 사용하여 작성하며, 지정된 대상 프로그램에만 영향을 미치는 특징이 있습니다. 이러한 어노테이션은 그 용도와 특성에 따라 크게 세 가지 카테고리로 구분됩니다: 자바 언어에서 기본적으로 제공하는 표준 어노테이션, 다른 어노테이션을 정의하고 설명하는 데 사용되는 메타 어노테이션, 그리고 개발자가 직접 필요에 따라 정의하여 사용하는 사용자 정의 어노테이션입니다.
3. 어노테이션의 종류
어노테이션은 크게 세 가지 종류로 나눌 수 있습니다
- 표준 어노테이션
- 메타 어노테이션
- 사용자 정의 어노테이션
1) 표준 어노테이션
자바에서 기본적으로 제공하는 어노테이션입니다:
- @Override: 메서드가 오버라이딩되었음을 나타냅니다.
- @Deprecated: 더 이상 사용되지 않을 대상임을 알립니다.
- @FunctionalInterface: 함수형 인터페이스임을 나타냅니다.
- @SuppressWarnings: 컴파일러의 특정 경고 메시지를 억제합니다.
- @SafeVarargs: 제네릭 타입의 가변인자 매개변수 사용 시 경고를 억제합니다.
2)메타 어노테이션
어노테이션을 정의하는 데 사용되는 어노테이션입니다:
- @Target: 어노테이션의 적용 대상을 지정합니다.
- @Retention: 어노테이션의 유지 기간을 지정합니다.
- @Documented: Javadoc 문서에 어노테이션 정보를 포함시킵니다.
- @Inherited: 어노테이션이 하위 클래스에 상속되도록 합니다.
- @Repeatable: 어노테이션을 반복해서 적용할 수 있게 합니다.
3)사용자 정의 어노테이션
개발자가 직접 정의하여 사용하는 어노테이션입니다.
. 이는 특정 목적에 맞게 커스텀하여 만들 수 있습니다.어노테이션은 그 용도에 따라 다음과 같이 분류할 수도 있습니다:
- Marker Annotation: 멤버 변수가 없는 단순 표식용 어노테이션.
- Single Value Annotation: 단일 멤버 변수를 갖는 어노테이션.
- Full Annotation: 둘 이상의 멤버 변수를 갖는 어노테이션.
이러한 어노테이션들은 코드에 메타데이터를 추가하여 컴파일러나 런타임 환경에 추가 정보를 제공하고, 코드의 가독성과 유지보수성을 향상시키는 데 도움을 줍니다.
아래의 표와 같이 어노테이션은 많은 종류를 가지고 있습니다.
어노테이션 | 설명 |
@SuppressWarnings | 컴파일러가 일반적으로 경고하는 내용 중 이 내용은 제외시킬 때 사용 |
@Entity | 퍼시스턴스화 될 클래스를 선언 |
@Table | DB에 있는 테이블과 맵핑 |
@Data | 각 필드의 setter, getter가 자동 생성 |
@EqualsAndHashCode | Equals 와 hashCode 함수를 만들어 줌 |
@JsonIgnoreProperties | 클래스 내에 없는 필드가 json에 존재할 때 에러 방지 설정 |
@GeneratedValue | primary 컬럼에 고유값을 자동으로 생성 부여 |
@Id | 이 클래스의 어느 속성이 유일한 식별자 인지를 가리킴 |
@Enumerated | Java Enum class를 표현 |
@Column | 컬럼 길이, 널 값, 제약과 같은 세부사항을 지정할 수 있게 함 |
@Repository | 해당 클래스에서 발생하는 DB 관련 예외를 spring의 DAOException으로 전환 |
@Service | 비즈니스 로직이 들어가는 Service로 등록이 됨 |
@Autowired | Spring의 의존관계(DI)를 자동으로 설정, 타입(by type)으로 연결 |
@Qualifier | 동일한 타입의 빈 객체들 중에서 특정 빈을 사용하도록 설정 |
@PostConstruct | 의존하는 객체를 설정한 이후에 초기화 작업을 수행할 메서드에 수행 |
@PreDestory | 컨테이너에서 객체를 제거하기 전에 호출 될 메서드에 적용 |
@Target | 어디에 어노테이션을 넣을 수 있는지를 서술 |
@Retention | 지속성을 설정, 어떻게 저장할 것인지 |
@Documented | 어노테이션이 기본으로 javadoc 및 유사한 툴에 의해 문서화 되는 것을 나타냄 |
@AllArgsConstructor | 모든 인자의 생성자를 자동으로 생성 |
@NoArgsConstructor | 인자가 없는 생성자를 생성 |
@MappedSuperclass | 해당 어노테이션이 정의된 class를 상속받은 entity에는 해당 컬럼이 자동으로 생성/매핑 |
@JsonSerialize | Annotation use for configuring serialization aspects, by attaching to "getter" methods or fields, or to value classes |
@Value | 프로퍼티값을 파라미터에 적용 |
@Configuration | 스프링 IoC 컨테이너가 해당 클래스를 빈 정의의 소스로 사용 |
@EnableAsync | 스프링 XML 설정의 <task:annotation-driven>을 대신해서 자바에 설정 |
@EnableScheduling | 스프링 스케줄 task 실행을 할 수 있게 함 |
@EnableTransactionManagement | 스프링 XML 설정의 <tx:annotation-driven/>을 대신해서 자바에 설정 |
@PropertySource | Property 파일을 Environment로 로딩 |
@EnableJpaRepositories | JPA repositories를 할 수 있게 함 |
@EnableAspectJAutoProxy | 스프링 XML 설정의 <aop:aspectj-autoproxy/>을 대신해서 자바에 설정 |
@ComponentScan | 스프링 XML 설정의 <context:component-scan>을 대신해서 자바에 설정 |
@Resource | 어플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용, 이름(by name)으로 연결 |
@Bean | 스프링 XML 설정의 <bean />과 동일한 기능을 제공 |
@EnableTransactionManagement | 스프링의 annotaion-driven 트랜잭션 관리기능을 할 수 있게 함 |
@MapperScan | Mybatis의 mapper 등록을 자바에 설정 |
@ControllerAdvice | 예외 발생시 작업을 처리할 수 있게 함, 스프링 프레임워크 3.2에서 추가 |
@Controller | Spring MVC의 Controller 클래스 선언을 단순화 시켜줌 |
@RequestMapping | Url을 class 또는 method와 맵핑 시켜주는 역할 |
@ResponseBody | HTTP body 부분만 전달 XML, JSON으로 출력 할 때 사용 |
@Api | Api가 어떤 역할을 하는 지 표시 |
@ApiOperation | Api의 기능을 표시 |
@ApiParam | Api에서 사용할 파라미터를 표시 |
@Aspect | Spring은 자동적으로 @Aspect 어노테이션을 포함한 클래스를 검색하여 Spring AOP 설정에 반영 |
@Pointcut | pointcut은 결합점(Join points)을 지정하여 충고(Advice)가 언제 실행될지를 지정하는데 사용 @Pointcut 어노테이션을 사용 |
@Before | 메소드가 수행 전에 수행 된다.Before advice는 @Before 어노테이션을 사용 |
@After | 메소드 수행 후 무조건 수행된다. After (finally) advice는 @After 어노테이션을 사용 |
@AfterThrowing | 메소드가 수행 중 예외사항을 반환하고 종료하는 경우 수행된다. After throwing advice는 @AfterThrowing 어노테이션을 사용 |
@RestController | @Controller + @ResponseBody |
@JsonInclude | @JsonInclude(JsonInclude.Include.NON_EMPTY) 필드가 empty이거나 null 일 때 json으로 변환되지 않도록 함 |
@Transactional | DB 트랜잭션관리를 위해 사용 @Transactional 을 붙였는 데 사용하지 못하는 경우, 1. innoDB 가 아닌 경우, 2. interface 가 없는 경우, 3. method 에 사용하였는 데, 해당 method를 같은 class 내부에서 호출하는 경우, 2, 3번 -> @Transactional을 사용하면 해당 class를 spring에서 다시 proxy 형태로 실행/관리 하기 때문. |
4. 예시
@Data
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
@Column(length = 100, unique = true)
public String email;
@Column(length = 256)
public String password;
@Column(length = 30)
public String nickname;
@Column
public Instant createdAt;
@PrePersist
public void prePersist(){
createdAt = Instant.now();
}
1) @Data
- 설명: Lombok 라이브러리의 어노테이션으로, 클래스에 대해 getter, setter, toString(), equals(), hashCode(), requiredArgsConstructor() 메서드를 자동 생성합니다.
- 주요 이점:
- 반복적인 코드를 줄여줌.
- 코드 가독성과 유지보수성 향상.
- 주의사항: 모든 필드에 대해 자동으로 생성되므로, 민감한 데이터(password 등)의 getter나 setter를 직접 제어하려면 별도의 처리가 필요합니다.
2) @Entity
- 설명: 이 클래스가 JPA 엔터티임을 선언합니다. 즉, 이 클래스는 데이터베이스 테이블과 매핑됩니다.
- 주요 역할:
- 해당 클래스의 인스턴스는 JPA에서 관리되는 객체가 됩니다.
- 데이터베이스 작업(삽입, 업데이트, 삭제, 조회 등)을 JPA가 처리할 수 있도록 지원합니다.
3) @Table(name = "users")
- 설명: 엔터티가 매핑될 데이터베이스 테이블의 이름을 지정합니다.
- 사용 이유:
- 클래스 이름과 테이블 이름이 다를 경우 명시적으로 매핑할 수 있습니다.
- 예시:
- java 코드 복사 @Table(name = "users") // 데이터베이스 테이블 이름은 "users"
4) @Id
- 설명: 해당 필드가 엔터티의 기본 키(primary key)임을 지정합니다.
- 필수 조건:
- 모든 엔터티에는 반드시 하나의 @Id 필드가 있어야 합니다.
5) @GeneratedValue(strategy = GenerationType.IDENTITY)
- 설명: 기본 키 값이 자동으로 생성되도록 설정합니다.
- 전략 설명:
- GenerationType.IDENTITY: 데이터베이스가 기본 키 생성을 담당합니다(예: MySQL의 AUTO_INCREMENT).
- 다른 전략:
- AUTO: JPA 구현체가 자동으로 생성 전략을 선택.
- SEQUENCE: 데이터베이스 시퀀스를 사용하여 키 생성.
- TABLE: 별도의 테이블을 생성하여 키 관리.
6) @Column
- 설명: 필드와 데이터베이스 테이블의 컬럼을 매핑합니다.
- 속성 설명:
- length: 문자열의 최대 길이 지정.
- unique: 컬럼 값의 고유 여부 지정.
7) @PrePersist
- 설명: 엔터티가 persist(저장)되기 전에 실행될 콜백 메서드를 지정합니다.
- 사용 이유:
- 데이터 저장 전 특정 로직(예: 생성 시간 설정)을 실행하고 싶을 때 사용합니다.
전체 어노테이션 활용
이 코드는 JPA와 Lombok을 활용해 데이터베이스와 객체를 효율적으로 매핑하고, 추가 로직(@PrePersist)으로 데이터 무결성을 유지합니다. 추가적으로 Lombok 어노테이션을 활용해 코드를 간결하게 작성했습니다.
'Basic' 카테고리의 다른 글
83. [ Backend ] 개발 환경과 도구 선택 (1) | 2025.01.16 |
---|---|
80. [Backend] 대규모 언어 모델(LLM)과 파인튜닝 (2) | 2025.01.16 |
44. Back-end : 좋은 네이밍의 습관 10 (네이밍 컨벤션) (1) | 2025.01.03 |
39. [ JAVA ] 데이타 교환형식 (1) | 2024.12.21 |
24. [ Back-end ] 코드 표기법 (1) | 2024.12.12 |