JAVA/JAVA Basic

[JAVA] 어노테이션( Annotation )의 속성

IT록흐 2023. 5. 29. 23:57
반응형

 

 

 

[JAVA] 어노테이션( Annotation )이란? (1)

어노테이션(Annotation)은 무엇일까? 어노테이션은 '주석'이다. JVM이 읽는 주석이다. 주석이 필요한 이유가 무엇일까? 철학책과 과학책이 있다. 과학책은 과학코너로 철학책은 철학코너로 분류하고

lordofkangs.tistory.com

 

이전 포스팅에서 어노테이션의 개념을 알아보았다. 이번 포스팅에서는 어노테이션의 속성을 다루어보겟다.

 

 

어노테이션의 속성

 

어노테이션은 '특정한 로직'이 처리되어야 하는 대상에 남기는 '표시'이다. '표시'를 남길 때, 단순히 '@' 하나로만 남기면 구체적인 정보를 제공할 수 없다. 조금 더 세밀한 작업을 위해서는 구체적인 데이터를 담아야 하는데, 어노테이션의 속성이 그 역할을 한다.  속성은 추상메소드로 구현된다. 속성명은 메소드명이고 반환타입이 속성에 들어갈 데이터 타입이다. 

 

@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이 들어갔다. 표시가 되지 않은 속성은 디폴트값이 반환된다. 

 

이처럼 어노테이션 속성을 이용하면 세밀한 '표시'가 가능해져 다양한 로직을 처리할 수 있게 된다. 

 

 

 

 

반응형