본문 바로가기

[Kotlin&Spring] 5기 내일배움캠프

[Kotlin&Spring] 5기 SchedulingApp 트러블슈팅 Annotation

트러블슈팅으로 어떤 부분을 기록해야할지 많은 고민이 된다

왜냐하면 Spring과 이번 과제는 처음부터 끝까지 모두 처음 배우게 된 내용이었다

Spring 공부 시작이 어려웠던 이유는 어노테이션으로 많은 부분 표현이 되어있는데 어노테이션 개념을 잘 몰랐었다

다행이도 어노테이션에 대해서 배우고 공부하게 되니까 많은 부분이 따라와줬고 오늘은 어노테이션을 정리해보고자한다

 

어노테이션(Annotation)은 @로 작성되는 요소를 말한다

어노테이션은 클래스나 인터페이스를 컴파일하거나 실행할 때 어떻게 처리해야 할 지를 알려주는 설정 정보이다

어노테이션은 크게 3가지 용도로 사용된다

1. 컴파일 시 사용하는 정보 전달

2. 빌드 툴이 코드를 자동으로 생성할 때 사용하는 정보 전달

3. 실행 시 특정 기능을 처리할 때 사용하는 정보 전달

 

어노테이션도 하나의 타입이므로 어노테이션을 사용하기 위해서는 먼저 아래와 같이 정의부터 헤야한다

public @interface AnnotaionName {
	String property1();
    int proprety2() default 1;
}

 

property1은 default 값이 없기 때문에 반드시 값을 기술해야 하고 property2는 기본 값이 있기 때문에 생략 가능하다

실제 어노테이션 사용 예시는 아래와 같다

@AnnotationName(property1="value");
@AnnotationName(property1="value", property2="intValue");

 

또한 속성을 기본 속성인 value 로 가질 수 있다

public @interface AnnotaionName {
	String value();
    int property2() default 1;
}

 

value 속성을 가진 어노테이션을 코드에서 사용할 때는 값만 기술할 수 있고, value 속성에 자동으로 대입된다

하지만 value 속성과 다른 속성의 값을 동시에 주고 싶다면 value 속성 이름을 반드시 언급해야 한다

@AnnotationName(value);
@AnnotationName(value="value", property2="intValue")

 

어노테이션을 적용할 수 있는 대상의 종류는 ElementType enum 으로 정의되어 있다

java.lang.annotation.ElementType

적용 대상을 지정할 때에는 @Target 어노테이션을 사용한다

@Target은 value로 ElementType의 배열을 가져 적용 대상을 여러개로 지정할 수 있다

@Target({ElementType.TYPE, ElementType.METHOD})
public @interface AnnotationType {
}

 

어노테이션은 @AnnotationName을 언제까지 유지할 것인지를 지정할 수 있다

유지 정책은 RetentionPolicy enum 으로 정의되어 있다

java.lang.annotation.RetentionPolicy

RetentionPolicy.SOURCE 의 경우 컴파일 시점에 적용되고 컴파일된 후 제거된다

CLASS는 컴파일된 class파일을 메모리로 로딩할 때(클래스 로더에 의해) 적용되고 메모리로 로딩된 후에 제거된다

RunTime은 Runtime 시점에 적용되며 실행이 끝날 때까지 유지된다

유지 정책을 지정할 때에는 @Retention 어노테이션을 사용한다

@Retention은 value로 RetentionPolicy enum 값을 갖는다

사용예시는 아래와 같다

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName {
}

 

어노테이션은 리플렉션(reflection)을 이용해서 적용 대상으로부터 어노테이션의 정보를 얻어낼 수 있는데, 아래의 메소드로 가능하다

 

자바는 클래스와 인터페이스의 패키지, 타입, 맴버 정보 등의 메타 정보(Metadata)를 Class 객체로 관리한다

리플렉션(reflection)이란, 런타임 시점에서 클래스의 정보를 조회하고 객체를 동적으로 조작하는 기능이다

나는 클래스로더의 기능과 착각했는데 클래스 로더는 .java 파일이 컴파일된 .class 파일을 JVM 메모리에 로드한다

리플렉션의 기능은 클래스 정보를 조회하고, 필드, 메서드, 생성자의 정보를 가저오며 객체를 동적으로 생성한다(newInstance())

리플렉션만 객체를 생성하는 기능이 있고, 실행 시점이 클레스로더는 JVM이 클래스를 사용할 떄, 리플렉션은 런타임 시점이라는 차이가 있다

또한 리플렉션은 Spring의 의존성 주입에서 사용된다고 한다

 

자바의 Lombok 라이브러리는 어노테이션으로 반복적인 메서드를 자동으로 생성해 코드를 간결하게 한다

롬복의 @Getter, @Setter 등은 컴파일 시점에서 자동으로 getter 와 setter 메서드를 생성해준다

 

이번 과제는 첫 단계부터 매우 난이도 있어 보여 겁을 먹었다

그러나 겁내지 말고 일단 하면 되는 것 같다

성실하게 꾸준히 하면 꼭 그만큼 성과가 있을 것이다

처음에 자바를 배울 때 어려웠듯이 결국 스프링도 하다보면 익숙해질 것이라고 믿는다

다음 과제는 좀 더 완성도 있게 해보고 싶다! 화이팅 ~