본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JAVA

JAVA 스터디 18 - 애노테이션

반응형

annotation 이란 ? 

 

-프로그래밍 언어에 영향을 미치지 않으며 ,유용한 정보를 특정 프로그램에게 제공하는 것.

 

annotation의 특징

 

-'@' 로시작된다.

-컴파일 된 프로그램의 동작을 변경하지 않는다.

-메타 데이터를 프로그램 요소(인스턴스 변수 , 생성자 ,메서드 ,클래스 등..)에 연결하는 방법을 제시한다.

-코드 라인 수를 줄이고 , 선언으로 해결 한다

-소스코드의 비지니스 로직에는 영향을 주지 않지만 ,해당 타겟에 영향을 주거나 소스코드의 구조를 변경할 수 있다.

-소스 코드에 메타데이터를 삽입하는 것이기 때문에 가독성 뿐만 아니라 ,전체적인 소스코드를 구성하는데 도움된다.

 

 

annotation 정의하는 방법

 몇가지 meta annotation을 활용하여 custom한 annotation을 구현할 수 있다. 

 

@Target : Annotation을 적용할 대상을 지정한다.

 

value 값으로 ElementType에 enum 상수인 다음의 값들을 사용할 수 있다 

 

 ElementType.ANNOTATION_TYPE : annotation에 적용된다.

 ElementType.CONSTRUCTOR : 생성자에 적용

 ElementType.FIELD : 필드 또는 프로퍼티에 적용

 ElementType.LOCAL_VARIABLE : 지역 변수에 적용

 ElementType.METHOD : 메소드 레벨 annotation에 적용

 ElementType.PACKAGE : 패키지 선언에 적용

 ElementType.PARAMETER : 메소드의 파라미터에 적용

 ElementType.TYPE : 클래스의 요소에 적용

 

 

@Retention : Annotation 정보가 언제까지 유지될지를 지정한다.

 

value 값으로는 RetentionPolicy에 enum 상수인 아래의 값들이 사용된다.

 

RetentionPolicy.SOURCE : 소스에서만 사용됨

RetentionPolicy.CLASS : 소스와 클래스에서 사용됨

RetentionPolicy.RUNTIME : 소스 ,클래스 ,실행시에 사용됨

 

@Documented : Annotation을 JavaDoc에 포함시킴

 

@inherited : 부모 Annotation을 상속 받는다.

 

@Repeatable : 반복적으로 어노테이션을 선언할 수 있게 한다.

 

-애너테이션의 메서드는 추상 메서드이며 , 에너테이션을 적용할 때 지정  

 

@interface TestInfo{

     int  count()  default 1; // default 값을 줄 수도 있다. 

     String tesedBy();

     String[] testTools();

     TestType testType  // enum Type{FIRST.FINAL} 

     DateTime testDate(); // 자신이 아닌 다른 애너테이션을 포함 할 수 있다. 

}

 

 

애너테이션의 사용

 

@TestInfo(count = 3 testedBy="ugo", testTools={"JUnit,"AutoTester"},

               testType = TestType.FIRST,

               testDate= @DateTime(yymmdd="210326", hhmmss="235959")

 )

public class NewClass{.....}

 

Custom Annotation 정의

public @interface CustomAnnoTest {

}

 기본 어노테이션 형식이다. 이 형식에 위의 메타 어노테이션을 붙혀 본인이 원하는 어노테이션을 만들 수 있다.

import java.lang.annotation.*;


@Retention(RetentionPolicy.RUNTIME)
@Inherited // 부모 어노테이션을 상속한다.
@Documented// javaDoc 에 등록 되도록 한다
@Target(ElementType.TYPE)
public @interface CustomAnnoTest {
    int count();
    String usedBy();
}

 

  예시를 위해 간단한 어노테이션을 만들었다 . 위의 CustomAnnoTest 어노테이션의 특징은 아래와 같다

 

@Target(ElementType.TYPE) 로 클래스의 요소에 해당 어노테이션이 지정될 것이다.

@Retention(RetentionPolicy.RUNTIME)를 통해  어노테이션에 대한 정보는 RUNTIME 동안 유지될 것이다.

@RestController 가 포함 되있음으로 해당 기능을 함께 수행할 것이다.

 

 

package com.ugo.annotationtest;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@CustomAnnoTest(count = 10 , usedBy = "ugo")
@RestController
public class TestController {
    //CustomAnnoTest 어노테이션에는 RestController가 포함 되어있다.

    @GetMapping("/home")
    public String home(){
        //애너테이션 값의 호출
        Class<TestController> testControllerClass = TestController.class;
        CustomAnnoTest annotation = testControllerClass.getAnnotation(CustomAnnoTest.class);
        System.out.println(annotation.count());
        System.out.println(annotation.usedBy());
        return "HOMEEEE";
    }
}

위의 어노테이션을 사용하는 컨트롤러를 생성하고 프로그램을 작동시켜 접근해보았다. 

 

 

@RestController가 정상적으로 작동 된 것을 확인할 수 있다. 

애노테이션에 지정된 값을 불러와 출력했다.

위와 같이 여러곳에서 반복적으로 사용되는 어노테이션 그룹을  한 어노테이션에 묶어 사용하는 방식과 

속성을 저장해서 파라미터처럼 속성값을 받아 사용할 수도 있다.지금은 기본적인 어노테이션 동작방식만 익히고

필요할때 다시 찾아보려한다. 

 

Annotation Processor

 어노테이션 프로세싱은 컴파일 시간에 어노테이션들을 스캐닝하고 프로세싱하는 javac에 속한 빌드툴이다. 특정 어노테이션들을 위해 어노테이션 프로세서를 만들어서 등록할 수 있다. Annotation Processor를 이용하여 컴파일 단계에서 소스를 조작할 수 있다.

 Lombok,JPA 등 많은 라이브러리에서 사용되고 있는 기능이다 , 컴파일 단계의 모든 소스를 조작할 수 있는 것은 아니고 , 새로 작성되는 파일에만 소스를 조작할 수 있고 기존  파일들은 건드릴 수 없다 . 

반응형

'JAVA' 카테고리의 다른 글

JAVA 스터디 21 - Predicate의 결합  (0) 2021.03.27
JAVA 스터디 20 - 람다식 (Lamda Expression)  (0) 2021.03.27
JAVA 스터디 17 - ENUM  (0) 2021.03.25
JAVA 스터디 15 - 예외처리  (0) 2021.03.24
JAVA 스터디 14 - 인터페이스  (0) 2021.03.24