본문 바로가기

Spring

[Spring] 어노테이션(Annotation)

 


 

어노테이션(Annotation) 정의

메타 데이터를 코드에 명시적으로 추가하여 개발자가 코드의 의미나 동작을 프레임워크에 전달 할 수 있게 해주는 도구입니다.

(`@` 기호로 시작하며, 클래스, 메서드 변수, 매개변수, 패키지 등에 추가할 수 있습니다.)

 


 

어노테이션 사용 방법

@Setter
@Getter
public Class Human {
    private String name;
    private int old;
    
    public Human(String name, int old) {
        this.name = name;
        this.old = old;
    }
}

Lombok 어노테이션인 `@Setter`, `@Getter` 입니다.

  • `@Setter` : 각 필드에 대해 setter 메서드(예: `setName()`, setOld()`)를 자동 생성합니다.
  • `@Getter` : 각 필드에 대해 getter 메서드(예: `getName()`, getOld()`)를 자동 생성합니다.

👍 이 어노테이션은 컴파일 시점에 실제로 메서드를 코드에 추가해주는 역할을 하며, 코드 작성량을 줄이고 가독성을 높여줍니다.

 


 

어노테이션의 역할 5가지

1. 컴파일러에게 정보 제공
컴파일 경고나 오류를 제어하거나, 의도를 명확하게 해줍니다.

더보기

예시

@Override
public void run() { ... }

`@Override` : 부모의 메서드를 재정의한 것이라는 것을 알려줍니다. 잘못 오버라이딩 시, 컴파일 오류를 발생시켜줍니다.

 

2. 코드 자동 생성 / 축소

Lombok 등의 라이브러리가 어노테이션을 분석해 `getter/setter`, 생성자 등을 자동으로 생성해줍니다.

더보기

예시

@Getter
@Setter
public class User { private String name; }

 

3. 프레임워크에게 객체 역할을 알려줌 (빈 등록, 주입 등)

Spring에서 어노테이션을 통해 객체를 자동 등록하고 의존성을 주입해줍니다.

더보기

예시

@Service
public class UserService { }

@Autowired
private UserService userService;

 

4. 런타임 처리용 메타데이터 제공

리플렉션(Reflection)을 통해 어노테이션 정보를 읽고 동적으로 동작합니다.

더보기

예시

@RequestMapping("/login")
public String login() { ... }

Spring MVC가 이 메서드를 /login 요청에 연결합니다.

 

5. 검증, 보안, 트랜잭션 등 부가 기능 명시

JSR-303, Hibernate Validator, Spring Security 등에서 사용합니다.

더보기

예시

@NotNull
private String username;

@Transactional
public void saveUser() { ... }

 


 

어노테이션 종류

1. 내장 어노테이션 (Built-in Annotation) : 자바 언어 자체에서 제공하는 기본 어노테이션 입니다.

더보기
어노테이션 설명
`@Override` 메서드가 부모 클래스의 메서드를 오버라이드한다는 것을 명시
`@Deprecated` 더 이상 사용하지 말아야 할 요소에 표시
`@SuppressWarnings` 컴파일러 경고를 숨길 때 사용
`@FunctionalInterface` 함수형 인터페이스임을 명시

2. 메타 어노테이션 (Meta-Annotation) : 사용자 정의 어노테이션을 설정하거나 정의할 때 사용하는 어노테이션입니다.

더보기
어노테이션 설명
`@Target` 어노테이션이 적용될 수 있는 위치 지정 (예: 메서드, 필드, 클래스 등)
`@Retention` 어노테이션의 유지 범위 지정 (SOURCE, CLASS, RUNTIME)
`@Documented` Javadoc에 표시되도록 설정
`@Inherited` 자식 클래스가 부모 클래스의 어노테이션을 상속받을 수 있도록 설정

 

 

예시

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value();
}

3. 사용자 정의 어노테이션 (Custom Annotation) : 개발자가 직접 만드는 어노테이션입니다.

더보기

예시

public @interface MyCustomAnnotation {
    String role() default "user";
}
  • AOP(Aspect-Oriented Programming) 같은 기술과 결합하여 다양한 기능을 구현할 수 있습니다.

 

4. 라이브러리/프레임워크 어노테이션 : Spring, Lombok, JPA, Jakarta EE 등에서 제공하는 어노테이션입니다.

더보기
종류 예시 어노테이션 설명
Spring `@Controller`, `@RequestMapping` 등 의존성 주입, 웹 개발
Lombok `@Getter`, `@Setter`, `@Data` 등 코드 자동 생성
JPA `@Entity`, `@Id`, `@OneToMany` 등 ORM 매핑
Validation `@NotNull`, `@Email`, `@Size` 등 입력 검증