진도표 1일차와 연결됩니다
우리는 최초로 API를 만들어 보았습니다. GET API를 만들기 위해 사용했던 어노테이션에 익숙하지 않다면 자바 어노테이션에 대해서 몇 가지 블로그 글을 찾아보세요! 다음 질문을 생각하며 공부해보면 좋습니다! 😊
[질문]
- 어노테이션을 사용하는 이유 (효과) 는 무엇일까?
- 나만의 어노테이션은 어떻게 만들 수 있을까?
어노테이션을 사용하는 이유 (효과) 는 무엇일까?
어노테이션(Annotation)은 주석이다. 코드 사이에서 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록한다.
일종의 프로그램에게 정보를 제공해주는 데이터를 위한 데이터인 메타데이터이다.
따라서 코드량이 감소하고 유지보수하기 쉽고, 생산성이 증가한다.
어노테이션에는 어떤 종류가 있을까?
그렇다면 어노테이션은 어떻게 쓰일까? 어떤 종류가 있고 어떻게 사용할 수 있는지 알아보았다.
(수정중)
나만의 어노테이션은 어떻게 만들 수 있을까?
커스텀 어노테이션은 메타 어노테이션을 사용하여 다음과 같은 구조를 가진다.
메타 어노테이션이란 커스텀 어노테이션을 구성할 때 시점, 위치 등을 지정하기 위한 어노테이션이다.
@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명]{
public 타입 elementName() [default 값]
...
}
아래는 메타 어노테이션 종류이다.
@Retention : 컴파일러가 어노테이션을 다루는 방법을 기술, 어느 시점까지 영향을 미치는지를 결정
RetentionPolicy.SOURCE : 컴파일 전까지만 유효
RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
RetentionPolicy.RUNTIME : 컴파일 이후 런타임 시기에도 JVM에 의해 참조가 가능(리플렉션)
@Target : 어노테이션 적용할 위치 선택
ElementType.PACKAGE : 패키지 선언
ElementType.TYPE : 타입 선언
ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElementType.CONSTRUCTOR : 생성자 선언
ElementType.FIELD : 멤버 변수 선언
ElementType.LOCAL_VARIABLE : 지역 변수 선언
ElementType.METHOD : 메서드 선언
ElementType.PARAMETER : 전달인자 선언
ElementType.TYPE_PARAMETER : 전달인자 타입 선언
ElementType.TYPE_USE : 타입 선언
@Documented : 해당 어노테이션을 Javadoc에 포함시킴
@Inherited : 어노테이션의 상속을 가능하게 함
@Repeatable : Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 함
PersonInfo.java
클래스 생성시 mention이라는 인삿말을 넣어주기 위한 어노테이션 생성
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonInfo {
String mention() default "안녕하세용 ㅎ";
}
Person.java
어노테이션 값에 예의바르게 인사하는 인삿말을 전달
@PersonInfo(mention = "반가워요.")
public class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Trash.java
어노테이션 값에 예의없게 대하는 인삿말을 전달
@PersonInfo(mention = "뭘 봐")
public class Trash {
private String name;
private int age;
public Trash(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
PersonService.java
Person과 Trash 인스턴스를 생성하여 런타임 시 어노테이션을 읽어 mention을 출력
import java.lang.annotation.Annotation;
public class PersonService {
public static void main(String[] args) {
PersonService p = new PersonService();
p.printPerson(new Person("kim", 20));
p.printTrash(new Trash("park", 28));
}
public void printPerson(Person p) {
Annotation[] annotations = Person.class.getDeclaredAnnotations();
for(Annotation annotation : annotations) {
if (annotation instanceof PersonInfo) {
PersonInfo personInfo = (PersonInfo) annotation;
System.out.println(p.getName() + "(" + p.getAge() + ") 가 말합니다 : " + personInfo.mention());
}
}
}
public void printTrash(Trash p) {
Annotation[] annotations = Trash.class.getDeclaredAnnotations();
for(Annotation annotation : annotations) {
if (annotation instanceof PersonInfo) {
PersonInfo personInfo = (PersonInfo) annotation;
System.out.println(p.getName() + "(" + p.getAge() + ") 가 말합니다 : " + personInfo.mention());
}
}
}
}
'spring' 카테고리의 다른 글
[인프런 워밍업 클럽 6차 과제-5/11] 백엔드 (0) | 2024.05.11 |
---|---|
[인프런 워밍업 클럽 4차 과제-5/7] 백엔드 (1) | 2024.05.07 |
[인프런 워밍업 클럽 3차 과제-5/3] (0) | 2024.05.03 |
[쿠석쿠석 프로젝트] 코드리뷰 #1 데이터베이스 구조 설계 (0) | 2024.04.04 |
[스프링 부트] 회원 관리 세팅 및 테스트 케이스 작성 - 정리 (1) | 2024.03.14 |