Spring

인프런 워밍업클럽 1일차 과제

jmboy 2024. 2. 19. 16:57

진도표 1일차와 연결됩니다

우리는 최초로 API를 만들어 보았습니다. GET API를 만들기 위해 사용했던 어노테이션에 익숙하지 않다면 자바 어노테이션에 대해서 몇 가지 블로그 글을 찾아보세요! 다음 질문을 생각하며 공부해보면 좋습니다! 😊

 

[질문]

어노테이션을 사용하는 이유 (효과) 는 무엇일까?

  1. 어노테이션이란? 
    어노테이션의 구현된 정보에 따라 연결되는 방향이 결정된다. 따라서 비즈니스 로직에는 영향을 주진 않지만 해당 타겟의 연결 방법이나 소스코드의 구조를 변경할 수 있다. 

  2. 어노테이션의 용도? 
    1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공 (@Test)
      • 안정성 증가
    2. 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공
      • 불필요한 코드 반복을 줄여, 비즈니스 로직에 더 집중
    3. 실행시 특정 기능을 실행하도록 정보를 제공한다. 
      • 어노테이션이 지정된 대상에 대해 특정 작업을 수행시킴
  3. 어노테이션에는 무엇이?
    1. 내장 어노테이션
      1. @Override : 컴파일러에게 오버라이딩 하는것이라고 알림
      2. @Depricated : 앞으로 사용하지 않을 대상이란것을 알림
      3. @FunctionalInterface : 함수형 인터페이스라는것을 알림
      4. @SupperssWarning : 컴파일러가 경고 메세지를 나타내지 않는다.
      5. @sageVarars : 제네릭과 같은 가변인자의 매개변수를 사용할 때의 경고를 나타내지 않는다.
    2. 메타 어노테이션 ( 어노테이션을 정의하는데 사용 , 주로 커스텀 어노테이션에 적용 )
      • @Retention : 어노테이션이 유지되는 범위을 정하기 위해 사용
        • RetentionPolicy.SOURCE: 컴파일 전까지만 유효하며 컴파일 이후에는 사라짐
        • RetentionPolicy.CLASS: 컴파일러가 클래스를 참조할 때까지 유효함
        • RetentionPolicy.RUNTIME: Reflection을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조가 가능함
      • @Repeatable : 어노테이션을 반복해 적용할 수 있도록 한다. 
      • @Inherited : 어노테이션이 하위 클래스에 상속되도록 한다.
      • @Target : 적용대상을 지정하는데 사용
        • ElementType.PACKAGE : 패키지 선언시
        • ElementType.TYPE : 타입 선언시
        • ElementType.CONSTRUCTOR : 생성자 선언시
        • ElementType.FIELD : 맴버 변수 선언시
        • ElementType.METHOD : 메소드 선언시
        • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언시
        • ElementType.LOCAL_VARIABLE : 지역 변수 선언시
        • ElementType.TYPE_PARAMETER : 매개 변수 타입 선언시
      • @Documented : javadoc으로 작성된 문서에 포함시킨다. 
    3. 사용자 정의 어노테이션 
      1. 사용자가 직접 정의해 사용하는 어노테이션

 

 


  • 나만의 어노테이션은 어떻게 만들 수 있을까?

1. 어노테이션 생성

어노테이션은 다음과 같이 인터페이스 앞에 @를 붙여 생성할 수 있다.

public @interface RestControllerWithSwagger{
}

2. 메타 어노테이션 추가

앞서 다룬 어노테이션에 적용되기 위한 메타 어노테이션중 필요한것을 적용시키면 된다.

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target(ElementType.TYPE)
public @interface RestControllerWithSwagger {

}

@Retention(RetentionPolicy.RUNTIME) : 컴파일 이후에도 JVM에 의해 계속 참조가 가능하다

@Inherited : 하위 클래스에도 적용가능

@Documented : javadoc 에 의해 문서화가 된다. 

@Target(ElementType.TYPE) : 타입 선언시 어노테이션을 사용할 수 있다. 

 

3. 이외 다른 어노테이션 추가 및 변수 추가.

@Api
@RestController
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target(ElementType.TYPE)
public @interface RestControllerWithSwagger {
    String name() default "RestController";
    String value();
}

 

 

변수를 설정해 주면 어노테이션은 그저 값을 가지고 있을 뿐이다. 

 

https://hbase.tistory.com/169