inblog logo
|
taker
    스프링부트

    어노테이션 이해하기

    김인범's avatar
    김인범
    Nov 14, 2024
    어노테이션 이해하기
    Contents
    코드소감

    어노테이션: 1차 개발자가 제작. 깃발 역할+기계가 보는 힌트

     
    1차 개발자가 어노테이션을 설정하는 파일 중 하나입니다.
    @Target(ElementType.METHOD) //@target || 클래스 위에는 TYPE || 메서드 위에는 METHOD @Retention(RetentionPolicy.RUNTIME) //@Retention public @interface RequestMapping { String value(); // value는 생략 가능하다. 작성도 가능 }
    • @Target 은 어노테이션을 적용할 대상을 설정+지정 합니다.
    💡
    ElementType 값
    .TYPE || 적용 대상: 클래스
    .FEILD || 적용 대상: 필드(멤버변수)
    .METHOD || 적용 대상: 메서드
    .PARAMETER || 적용 대상: 메서드의 매개변수
    .CONSTRUCTOR || 적용 대상: 생성자
    .LOCAL_VARIABLE || 적용 대상: 지역변수
    .ANNOTATION_TYPE || 적용 대상: 다른 어노테이션
    .PACKAGE || 적용 대상: 패키지 선언
    • @Retention 은 어노테이션이 어떤 시점까지 유지될지 결정해서 메모리와 성능을 최적화 하는 역할입니다.
    💡
    RetentionPolicy 유형
    .SOURCE
    컴파일러가 어노테이션을 소스 코드에서만 유지 / 컴파일 단계에서 제거
    EX) @Override
     
    .CLASS
    바이트코드(.class 파일)까지 유지 / 런타임에는 JVM에 의해 로드되지 않고 사용불가
     
    .RUNTIME
    런타임에도 유지 / 리플렉션을 통해 접근 가능
    런타임에 특정 동작을 트리거하거나 검증할 때 사용 주로 사용자 정의 어노테이션에 사용됨
    • 리플렉션: 기존 코드를 확인하는 행위
     

    코드

    어노테이션을 이해하기 위해 간단하게 작성한 코드입니다.
    • 1차 개발자가 어노테이션 기능을 만드는 코드
    /** * 1차 개발자 작성하는 코드 */ ---------------------------------------------------------------- @Target(ElementType.METHOD) //@target || 클래스 위에는 type || @Retention(RetentionPolicy.RUNTIME) //@Retention public @interface RequestMapping { String value(); // value는 생략 가능하다. 작성도 가능 } ----------------------------------------------------------------- public class Router { UserController uc; public Router(UserController uc) { this.uc = uc; } public void routing(String path){ // 1. 메서드 찾아내기 Method[] methods = uc.getClass().getMethods(); // uc에서 생성되는 메서드를 Method[]에 캡슐화 시킨다. // 2. 어노테이션 체크하기 for (Method m : methods) { RequestMapping rm = m.getAnnotation(RequestMapping.class); // 3. value 와 path 일치 확인해서 일치하면 invoke 하기 if(rm == null) break; if (rm.value().equals(path)){ try { m.invoke(uc); } catch (Exception e){ throw new RuntimeException("메서드 실행 중 오류가 발생했어요."); } } }
     
    • 1차 개발자가 만든 코드를 사용하기 위해 / 2차 개발자가 작성하는 코드
    /** * 2차 개발자가 작성하는 코드 */ public class UserController { @RequestMapping("/login") public void login(){ System.out.println("로그인"); } @RequestMapping("/join") public void join(){ System.out.println("회원가입"); } @RequestMapping("/logout") public void logout(){ System.out.println("로그아웃"); } @RequestMapping("/userinfo") public void userinfo(){ System.out.println("유저정보"); } } --------------------------------------------------- public class App { public static void main(String[] args) { Router router = new Router(new UserController()); Scanner sc = new Scanner(System.in); String path = sc.nextLine(); router.routing(path); } }
     
    실행 클래스 App 을 실행하면 router.routing(path); 메서드가 작동되고 콘솔 창에 UserController의 @RequestMapping 중 하나를 입력하면 mapping 되어있는 메서드의 기능이 실행됩니다.
    RequestMapping 을 통해 메서드를 찾아갈 수 있도록 1차 개발자가 만든 @interface RequestMapping 과 Router 클래스를 만들었기 때문입니다.
     

    소감

    어노테이션의 일부분이겠지만 작동하는 원리와 함께
    1차 개발자가 어떻게 2차 개발자가 만들 메서드를 프로그램이 파악할 수 있게 하여
    2차 개발자의 작업을 원활히 할 수 있게 만든 지에 대해서도 알게 되었습니다.
     
     
    Share article

    taker

    RSS·Powered by Inblog