본문 바로가기

웹 개발/스프링

[스프링] 스프링 핵심 2 - Annotation

0. Annotation, 어노테이션이란

Annotation은 JEE5부터 새로 추가된 문법 요소로 사전적으로 "주석"이란 의미를 지니고 있다. 의미대로 자바 코드에서 주석처럼 달아 특별한 의미를 부여한다. "@"를 사용하며 "At"이라 읽는다.

 

1. Annotation 등장 배경

기존 자바 웹 어플리케이션들은 선언적 프로그래밍 방식을 사용한다. "선언적"은 프로그램의 전체와 각 레이어 별로 구성, 설정값들을 외부 XML 설정 파일에 명시하는 방식을 의미한다. 변경될 수 있는 데이터들을 최대한 외부 설정 파일로 분리하기 때문에 만약 변경하는 요구사항이 들어온 경우에도 컴파일 없이도 쉽게 적용할 수 있었다. 이를 통해 '유연성'이란 장점을 얻었으나 프로그램 자성을 위해 매번 많은 설정파일을 작성해야 함으로 규모가 커질수록 설정의 양이 많아져 구조화에대한 필요성이 커졌다. 또 다른 단점은 도메인 데이터 처리 정보가 Model, 서비스, XML 설정 파일에 분리되어 있는 탓에 이를 확인할 때 각각의 모든 파일들을 살펴봐야 했다.

 

 

2. Annotation의 강점

어노테이션은 위의 문제를 해결하기위해 등장했다. Model 클래스에 적용할 외부 데이터에대한 유효성 검사 조건을 명시함으로써 코드가 깔끔해지고 유효 조건도 쉽게 파악할 수 있었다. 

XML 설정은 여전히 유연성을 확보해준다는 장점을 가지고 있기 때문에 빌드된 코드에 컴파일 없이 수정을 적용하기 용이하다. 따라서 어플리케이션에 대한 전체적 설정이나 디플로이 환경에 따라 변경되는 사항들에 XML 설정을 활용하는 것이 좋다. 

 

 

3. Annotation의 용도

어노테이션은 크게 문서화, 컴파일러 체크, 코드 분석을 위한 용도로 사용된다. @기호가 붙은 심볼을 사용해 패키지, 클래스, 메소드, 프로퍼티, 변수에 명시할 수 있다. 어노테이션이 붙은 소스를 컴파일 시 수집해 API 문서화를 할 수도 있다. (JavaDoc이라는 좋은 문서화 도구가 있기 때문에 "문서화"는 어노테이션의 사용법 중 가장 비중이 낮다.)  또한 컴파일 타임에 에러를 발생시켜주어 개발자에게 위험 요소를 경고해 줄 수 있다. 가장 많이 사용되는 것은 코드 분석, "메타데이터" 로써의 용도이다. 데이터를 위한 데이터로서 어노테이션의 효용을 가장 느낄 수 있다. 

 

4. Annotation 분류 

- Marker 어노테이션 : 멤버변수가 없다. 단순한 표식으로 사용되며 의미를 전달하는 용도이다.

- Single-Value 어노테이션 : 멤버로 단일 변수만을 가진다. 값을 명시해 데이터를 전달할 수 있다.

- Full 어노테이션 : 멤버로 둘 이상의 변수를 갖는 어노테이션으로 데이터를 값-쌍 형태로 전달한다.

 

5. Built-In 어노테이션

자바 SDK 에서 제공하는 어노테이션. @Override, @Deprecated, @SupressWarning 등이 있다.

@Override : 현재 명시된 메소드는 슈퍼클래스의 메소드를 오버라이드하고 있음을 컴파일러에 명시한다. 

@Deprecated : 마커 어노테이션으로서 차후의 버전에서 지원되지 않을 수 있기 때문에 더이상 사용되지 말아야할 메소드를 나타낸다. 

@SupressWarning : 경고를 제거해준다. 

 

6. Custom 어노테이션

어노테이션을 interface 키워드 앞에 @를 붙여 표시함으로서 임의로 정한 어노테이션을 사용할 수 있다.

// 여전히 작업 중임을 나타내기위해 정의한 마커 어노테이션
public @interface InProgress {}

// 단일 멤버추가
public @interface TODO {
    String value();
}
// 사용
@TODO("Figure out the amount of interest per month")
public void calculateInterest(float amoung, float rate) {
    // ...
}

// 디폴트 값 설정
public @interface Group TODO {

    public enum Severity { CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION };
    
    Severity severity() default Severity.IMPORTANT;
    String item();
    String assignedTo();
    String dateAssigned();
    
}
// 사용
@GroupTODO(
    item="Figure out the amount of interest per month",
    assignedTo="Brett McLaughlin",
    dateAssigned="08/04/2004"
)
public void alculateInterest(float amoung, float rate) {
    // ...
}

 

7. 메타 어노테이션 

어노테이션에서 사용되는 어노테이션으로서 해당 어노테이션의 동작 대상을 결정합니다. 

- @Target 메타 어노테이션 : 어노테이션이 적용되는 동작, 엘리먼트를 지정합니다.

- @Retention 메타 어노테이션 : 자바 컴파일러가 어노테이션을 다루는 방법과 관련되어 있습니다. 소스파일, 클래스파일, 런타임 중 어느 시점에 어노테이션을 보유할지를 결정합니다.