그동안 아무생각 없이 마냥 편리하게 사용해왔던 기능이 있다. @를 붙여서 사용하는 어노테이션이다.
처음 어노테이션을 접했을 때 정말 말도 안 된다고 생각했다. 구현하기 까다롭고 헷갈리는 것들이 단 한 줄의 코드 추가만으로 구현할 수 있게 되다니, 이 얼마나 좋은 기능인가.
그러다보니 지금까지 아무 생각없이 사용해오기만 했다.
하지만 이제는 자바와 스프링에 대해서 어느정도 감도 잡았으니 제대로 알고 사용해야 되겠다는 생각이 들어, 이번 포스팅의 주제는 어노테이션으로 정했다.
이 말도 안 되는 기능은 도대체 어떻게 작동되는 것이며, 쓰이는 곳은 얼마나 많을까?
@Bean , @GetMapping , @Transactional ...@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyAnnotation() {
String value() default "default value";
int number() default 0;
}
@interface@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE})ElementType.METHOD : 메서드에 이 어노테이션 사용 가능ElementType.TYPE : 클래스에 이 어노테이션 사용 가능String value()int number()🤔
String value(),int number()에서 사용되는( )는 무엇일까?
String value(String args) , String value(args) 처럼 ( ) 안에 값 하드코딩 불가능@MyAnnotation(value = "Class Annotation", number = 20)
public class MyClass {
@MyAnnotation(value = "Method Annotation", number = 10)
public void myMethod() {
System.out.println("메서드가 실행되었습니다.");
}
}
@Target 으로 지정한 클래스와 메서드에 어노테이션 사용 가능value 속성이 어노테이션에 하나만 존재할 경우, 옵션 값으로 지정 시 value = ?? 에서 value = 을 생략할 수 있음RetentionPolicy 를 RUNTIME으로 지정해주었기 때문public class AnnotationProcessor {
public static void main(String[] args) throws Exception {
Class<MyClass> myClass = MyClass.class;
if (myClass.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = myClass.getAnnotation(MyAnnotation.class);
System.out.println("value : " + annotation.value());
System.out.println("number : " + annotation.number());
}
Method method = myClass.getMethod("myMethod");
if (method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
System.out.println("value : " + annotation.value());
System.out.println("number : " + annotation.number());
}
}
}
1) Class Annotation 읽어오기
Class<MyClass>MyClass 클래스 정보를 가져옴isAnnotationPresent(MyAnnotation.class)MyClass 에 MyAnnotation 어노테이션이 붙어있는지 확인getAnnotation(MyAnnotation.class)MyClass 의 어노테이션 속성에 들어있는 메타데이터 값을 가져옴2) Method Annotation 읽어오기
myClass.getMethod("myMethod")myClass 에 정의된 myMethod 메서드 정보를 가져옴isAnnotationPresent(MyAnnotation.class)method 에 MyAnnotation 어노테이션이 붙어있는지 확인getAnnotation(MyAnnotation.class)method 의 어노테이션 속성에 들어있는 메타데이터 값을 가져옴@Override 가 지정된 메서드는 반드시 부모에 존재해야 하므로, 오타 등의 문제를 방지public Parent {
public void print();
}
public Child extends Parent {
@Override
public void print();
}
@Deprecated
public class DeprecatedClass {}
@SuppressWarnings("unchecked")
public class NoWarningClass {}
@Comonent
public class Component {}
@Component 의 일종@Controller
public class AppController {}
@Component 의 일종@Service
public class AppService {}
DB 와 관련된 작업을 하는 클래스에 사용JpaRepository 를 상속받는 경우, @Repository 는 생략 가능JpaRepository 는 @Repository 를 상속받은 인터페이스이기 때문JpaRepository 를 상속받은 인터페이스나 클래스는 자동으로 @Repository 로 인식됨@Repository
public class NewRepository {}
public interface AppRepository extends JpaRepository(App, Long) {}
IoC (의존성 역전) 을 구현하는 핵심 방법 중 하나new() 로 개발자가 객체를 직접 생성하지 않고, 스프링이 자동으로 객체 생성 후 주입@Controller
public class AppController {
@Autowired
private AppService appService;
}
@Controller
@RequestMapping("/api")
public class AppController {
@RequestMapping("/print", method = RequestMethod.GET)
public void print() {
System.out.println("Hi")
}
}
@GetMapping , @PostMapping 등을 사용하여 method = 지정을 생략할 수 있음☑️ 보일러 플레이트 코드를 줄이고 유지보수성 및 생산성의 향상을 도와주는 어노테이션
@Getter
@Setter
@Entity
public class Student {
private String name;
private int age;
}
getName() , setName(...) 메서드를 통해 필드 값 조작 가능@Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor 를 결합한 어노테이션@Data
public class Student {
private String name;
private int age;
}
public class MyClass {
@SneakyThrows
public void excMethod() {
throw new Exception("error");
}
}
try-catch 나 throws 를 사용하지 않고도 코드 처리 가능DB 작업의 원자성을 보장All Commit or RollbackProxy 객체를 사용한 Dirty Checking으로 인해 성능 향상@Transactional // 이 클래스 내 모든 작업은 하나의 트랜잭션으로 처리
public class Job {}
JSON 같은 RESTFul 응답을 반환하는 컨트롤러 지정@Controller 와 @ResponseBody 를 결합한 형태@RestController
public class RestController {}
📋 그 외에도 많은 어노테이션들이 존재하며, 필요에 따라 찾아가면서 학습하는 것을 권장
참고) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/