이전 포스팅에서 어노테이션의 개념을 알아보았다. 이번 포스팅에서는 어노테이션의 속성을 다루어보겟다.
어노테이션의 속성
어노테이션은 '특정한 로직'이 처리되어야 하는 대상에 남기는 '표시'이다. '표시'를 남길 때, 단순히 '@' 하나로만 남기면 구체적인 정보를 제공할 수 없다. 조금 더 세밀한 작업을 위해서는 구체적인 데이터를 담아야 하는데, 어노테이션의 속성이 그 역할을 한다. 속성은 추상메소드로 구현된다. 속성명은 메소드명이고 반환타입이 속성에 들어갈 데이터 타입이다.
@Enumerated
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Enumerated {
EnumType value() default EnumType.ORDINAL; // value 속성
}
@Enumerated는 JPA에서 DB 테이블에 데이터를 저장할때 열거형 타입으로 저장해야함을 '표시'하는 어노테이션이다. 만약 단순히 열거형 타입임만 표시한다면 정보가 부족하다.
EnumType.java
public enum EnumType {
ORDINAL,
STRING;
private EnumType() {
}
}
EnumType은 두 가지 종류가 있다. ORDINAL과 STRING이 있다. 어떤 열거형 타입인지도 '표시'해주어야 한다.
@Enumerated는 EnumType value() default EnumType.ORDINAL 이다. value 메소드는 EnumType 타입 데이터를 반환하고 디폴트로 EnumType.ORDINAL 를 반환한다. 그럼 반환할 수 있도록 어노테이션을 표시해보자.
어노테이션을 표시하는 방법은 아래와 같다.
엔티티클래스
@Entity
@Data
public class Member {
@Id
public String name;
@Enumerated(EnumType.STRING)
public Gender gender;
}
@어노테이션 ( 속성명1 = 데이터, 속성명2 = 데이터, ... )
일단 value는 기본속성이다. 그래서 속성명을 생략하면 자동으로 value로 인식한다. @Enumerated(value=EnumType.STRING)로 해도 되고 @Enumerated(EnumType.STRING)로 해도 된다.
@Enumerated는 JPA에서 DB 테이블에 성별을 저장할때 열거형 타입으로 저장해야함을 '표시'하는 어노테이션이다. 추가로 EnumType은 STRING으로 지정하여 정수가 아닌 문자열 형태로 저장하도록 '표시' 하였다. 이렇듯, 특정한 로직이 추가적으로 처리가 되어야 할 때, 추상메소드를 만들어 어노테이션의 속성을 추가하면 다양한 표시를 남길 수 있다.
@Override
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Override 같이 추가 표시가 필요 없는 경우, 추상메소드가 없기도 하다.
@OneToMany
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OneToMany {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default FetchType.LAZY;
String mappedBy() default "";
boolean orphanRemoval() default false;
}
@OneToMany 처럼 다양한 속성을 가지기도 한다. @OneToMany를 표시해보자.
@Entity
@Data
public class Parent {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> children;
}
@OneToMany에 추상메소드명과 타입에 맞는 데이터가 들어가 있다. mappedBy()의 반환타입은 문자열이니 "parent"가 들어갔고 cascade()의 반환타입은 CascadeType[]이므로 CascadeType.ALL이 들어갔다. 표시가 되지 않은 속성은 디폴트값이 반환된다.
이처럼 어노테이션 속성을 이용하면 세밀한 '표시'가 가능해져 다양한 로직을 처리할 수 있게 된다.
'JAVA > JAVA Basic' 카테고리의 다른 글
[JAVA] Garbage Collector 동작원리 (0) | 2024.02.23 |
---|---|
[JAVA] JDK 동작원리 (0) | 2024.02.22 |
[JAVA] 어노테이션( Annotation )이란? (0) | 2023.05.29 |
[ JAVA ] InputStreamReader : 인코딩 (0) | 2021.07.12 |
[ JAVA ] 기반 스트림, 보조 스트림 (0) | 2021.07.12 |