๐ฑ ์ด๋ ธํ ์ด์ ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
์ด๋ฏธ ์ ์ธ๋์ด ์๋ ์ด๋ ธํ ์ด์ ์ ๋ณด๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก @Target, @Retention์ด ์ค์ ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ ์ด @Target, @Retention์ด ๋ญ๊น?
๐ฑ Meta Annotation์ด๋?
๋ฉํ ์ด๋ ธํ ์ด์ ์ ์ด๋ ธํ ์ด์ ์ ์ ์ํ ๋ ์ฌ์ฉ๋๋ ์ด๋ ธํ ์ด์ ์ด๋ค.
๋ฉํ ์ด๋ ธํ ์ด์ ์ ๋ค๋ฅธ ์ด๋ ธํ ์ด์ ์์ ์ ์ธ๋์ด ๊ทธ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ๋์์ ์ง์ ํ๋ค.
๐ซง @Retention
์ด๋ ธํ ์ด์ ์ ์ธ์ ๊น์ง ์ ์งํ ๊ฒ์ธ์ง ์ง์ ํ๋ค.
์์ค ์ฝ๋, ํด๋์ค ํ์ผ, ๋ฐํ์ ์ค ์ด๋ ์์ ๊น์ง ์ด๋ ธํ ์ด์ ์ ๋ณด๋ฅผ ์ ์งํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
1๏ธโฃ @Retention(RetentionPolicy.SOURCE)
์ปดํ์ผ ์ ๊น์ง๋ง ์ ์ง๋๋ ์ด๋ ธํ ์ด์ ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ์ต์ , ์ปดํ์ผ๋ฌ์ ์ํด ์ ๊ฑฐ๋๋ค.
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {
}
@Getter ์ด๋ ธํ ์ด์ ์ Getter ๋ฉ์๋๋ฅผ ์์ฑํ๊ธฐ ์ํด ์์ค ์ฝ๋ ์์ค์์๋ง ํ์ํ๋ค. ์ฆ, ์ปดํ์ผ ์์๋ง ํด๋น ์ด๋ ธํ ์ด์ ์ ๋ณด๊ฐ ํ์ํ๋ฉฐ, ๋ฐํ์์๋ ๋ ์ด์ ํด๋น ์ ๋ณด๊ฐ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ SOURCE ์ต์ ์ ์ฌ์ฉํ๋ค.
2๏ธโฃ @Retention(RetentionPolicy.CLASS)
์ปดํ์ผ๋ฌ์ ์ํด .class ํ์ผ์ ๊ธฐ๋ก๋์ง๋ง ๋ฐํ์์๋ ์ฌ๋ผ์ง๋ค.
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Repeatable(List.class)
@Documented
@Constraint(validatedBy = { })
public @interface NotNull {
}
@NotNull ์ด๋ ธํ ์ด์ ์ ํด๋น ์ด๋ ธํ ์ด์ ์ ์ ์ธํ ํ๋๊ฐ null์ด ์๋ ๊ฐ์ ๊ฐ์ ธ์ผ ํจ์ ๋ํ๋ธ๋ค.
์ด ์ด๋ ธํ ์ด์ ์ ํ๋์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ ํด๋์ค ํ์ผ์๋ง ์ด๋ ธํ ์ด์ ์ ๋ณด๊ฐ ์ ์ง๋์ด์ผ ํ๊ณ , ๋ฐํ์์๋ ํด๋น ์ด๋ ธํ ์ด์ ์ ๋ณด๊ฐ ๋ ์ด์ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ CLASS ์ต์ ์ ์ฌ์ฉํ๋ค.
3๏ธโฃ @Retention(RetentionPolicy.RUNTIME)
์ปดํ์ผ๋ฌ์ ์ํด .class ํ์ผ์ ๊ธฐ๋ก๋๊ณ , JVM์ ์ํด ์ด๋
ธํ
์ด์
์ด ์ ์ง๋๋ค.
์ฆ, Java๋ก ์์ฑํ ์ฝ๋๊ฐ ๋์๊ฐ๋ ๋์์๋ ๊ณ์ ์ ์ง๋๋ค๋ ์๋ฏธ์ด๋ค.
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { FIELD, METHOD, ANNOTATION_TYPE })
public @interface LastModifiedDate {
}
์คํ๋ง์์ ๋๋ถ๋ถ์ ์ด๋ ธํ ์ด์ ์ RUNTIME ์ต์ ์ ์ฌ์ฉํ๋ค. @LastModifiedDate ์ด๋ ธํ ์ด์ ์ ์ํฐํฐ์ ๋ง์ง๋ง ์์ ์ผ์ ๋ํ๋ด๋๋ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํฐํฐ๊ฐ ์์ ๋ ๋๋ง๋ค ํด๋น ํ๋์ ํ์ฌ ์๊ฐ์ ์๋์ผ๋ก ํ ๋นํด์ผ ํ๋ฏ๋ก RUNTIME ์ต์ ์ ์ฌ์ฉํ๋ค.
๐ซง @Target
์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋ ๋์์ ์ง์ ํ๋ค.
ํด๋์ค, ํ๋, ๋ฉ์๋ ๋ฑ์ ์ด๋ ์์์ ์ด๋ ธํ ์ด์ ์ ์ ์ฉํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
- @Target({ElementType.TYPE})
: ํด๋์ค, ์ธํฐํ์ด์ค, Enum ๋๋ Record - @Target({ElementType.FIELD})
: ๋ณ์ - @Target({ElementType.METHOD})
: ๋ฉ์๋ - @Target({ElementType.PARAMETER})
: ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ(ํด๋ผ์ด์ธํธ์์ ์ ๋ฌ ๋ฐ๋ API์ ํ๋ผ๋ฏธํฐ๋ค์ ์์ฃผ ์ฌ์ฉ๋จ) - @Target({ElementType.CONSTRUCTOR})
: ์์ฑ์ - @Target({ElementType.LOCAL_VARIABLE})
: ๋ณ์ ์ค ์ง์ญ ๋ณ์๋ง - @Target({ElementType.ANNOTATION_TYPE})
: ์ด๋ ธํ ์ด์ - @Target({ElementType.PACKAGE})
: ํจํค์ง. ํจํค์ง ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ ์ญํ - @Target({ElementType.TYPE_PARAMETER})
: ํ์ ๋ณ์(ex. ์ ๋ค๋ฆญ์ ์ ์ธํ๋ ํ์ ๋ฑ) - @Target({ElementType.TYPE_USE})
: ํ์ ๋ณ์ ๋ฟ ์๋๋ผ ๋ชจ๋ ํ์ - @Target({ElementType.RECORD_COMPONENT})
: ๋ ์ฝ๋ - @Target({ElementType.MODULE})
: ๋ชจ๋
๐ซง @Documented
ํด๋น ์ด๋ ธํ ์ด์ ์ด javadoc์ ํฌํจ๋๋๋ก ์ง์ ํ๋ค.
์ฆ, ํด๋น ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉ๋ฒ๊ณผ ์ค๋ช ์ด ๋ฌธ์ํ๋๋ค.
@Documented
@Retention(RUNTIME)
public @interface Nonnull {
}
๐ซง @Inherited
ํด๋น ์ด๋ ธํ ์ด์ ์ด ์์๋ ์ ์๋๋ก ์ง์ ํ๋ค.
์ฆ, ๋ถ๋ชจ ํด๋์ค์ ์ ์ธ๋ ์ด๋ ธํ ์ด์ ์ด ์์ ํด๋์ค์๋ ์ ์ฉ๋๋๋ก ํ๋ค.
@Inherited
@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Transactional {
}
'Back-end' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Security] ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ๊ตฌ์ฑ ์์ ์ดํด๋ณด๊ธฐ (0) | 2024.05.02 |
---|---|
Java Record๋ก DTO๋ฅผ ๋ง๋ค์ด๋ด ์๋ค (0) | 2024.05.01 |
[JPA] @SQLDelete์ ์์์ฑ ์ปจํ ์คํธ (0) | 2024.04.22 |
[JPA] CascadeType.REMOVE vs orphanRemoval = true (0) | 2024.04.21 |
[JPA] Cascade ์์์ฑ ์ ์ด (1) | 2024.04.19 |