[스프링부트] 4. 어노테이션

백하림's avatar
Mar 13, 2025
[스프링부트] 4. 어노테이션
💡

어노테이션이란?

  • 어노테이션(Annotation)은 메타 데이터를 제공하는 역할
  • 코드에 부가 정보를 추가하여 런타임 또는 컴파일 타임에 특정 기능을 수행

메인

package ex02; public class App { public static void main(String[] args) { Dispatcher ds = new Dispatcher(new UserController()); ds.routing("/userinfo"); } }
notion image

어노테이션 코드

package ex02; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) // 런타임시 혹은 컴파일시 @Target(ElementType.METHOD) // 메소드 위에만 붙일 수 있음, 클래스에 붙이고 싶으면 type public @interface RequestMapping { String value(); // 경로 값을 받을 변수 }
💡
  • @Retention(RetentionPolicy.RUNTIME): 런타임에도 유지되도록 설정
  • @Target(ElementType.METHOD): 메서드에만 적용 가능
  • String value();: 어노테이션의 값을 문자열로 받을 수 있도록 설정
  • @Target(ElementType.TYPE): 클래스에 적용 가능

어노테이션 찾기

package ex02; import java.lang.reflect.Method; public class Dispatcher { UserController con; public Dispatcher(UserController con) { this.con = con; } public void routing(String path) { // 요청된 URL 경로 Method[] methods = con.getClass().getMethods(); for (Method method : methods) { // 어노테이션 찾기 RequestMapping rm = method.getAnnotation(RequestMapping.class); if (rm == null) continue; // 어노테이션이 없으면 다음 메서드로 if (rm.value().equals(path)) { // URL과 일치하는지 확인 try { method.invoke(con); // 해당 메서드 실행 } catch (Exception e) { throw new RuntimeException(e); } } } } }
💡
  • getMethods()를 사용해 UserController의 모든 메서드를 가져옴
  • getAnnotation(RequestMapping.class)으로 어노테이션이 붙은 메서드인지 확인
  • method.invoke(con);을 이용해 해당 메서드를 실행함

메소드에 어노테이션 추가

package ex02; public class UserController { @RequestMapping("/login") public void login() { System.out.println("login call"); } @RequestMapping("/join") public void join() { System.out.println("join call"); } @RequestMapping("/logout") public void logout() { System.out.println("logout call"); } @RequestMapping("/userinfo") public void userinfo() { System.out.println("userinfo call"); } }
💡
각 메서드 위에 @RequestMapping("경로")를 추가하여 경로와 메서드를 연결함

정리

💡
  1. 어노테이션(@RequestMapping)을 직접 정의하여 메서드와 URL을 연결
  1. 리플렉션(Reflection)을 활용하여 런타임에 어노테이션을 분석하고 실행
  1. Dispatcher를 통해 URL에 맞는 메서드를 자동으로 실행

쉽게 말하자면…

💡
  1. @RequestMapping("/login") → "여기에 깃발을 세웠다!"
  1. 리플렉션 → "어디에 깃발이 있나? 아, 여기 있네!"
  1. 디스패처 → "이 깃발을 보고, 관련된 동작을 실행해야겠군!"
즉, 어노테이션은 마커, 리플렉션은 탐색자, 디스패처는 실행자라고 볼 수 있음 !
Share article

harimmon