[Spring] Spring Annotation (2)

이연우·2025년 7월 22일

TIL

목록 보기
26/100

🧩 Annotation 자세히 보기

1. @Component – 스프링 빈 등록 어노테이션

  • Spring Bean으로 등록하여 컨테이너가 객체 생명 주기를 관리하도록 함
    • 서블릿 컨테이너가 Servlet 객체를 관리하듯,
      Spring은 @Component로 선언된 객체를 관리함
    • 자동으로 싱글톤으로 관리됨
    • @Indexed 포함 → 컴포넌트 스캔 속도 향상

✍️ 예시 – Servlet 비교

@WebServlet(name="ExampleServlet", urlPatterns = "/example")
public class ExampleServlet extends HttpServlet {
    protected void service(HttpServletRequest req, HttpServletResponse resp) {
        // logic
    }
}

2. @Target – 어노테이션 적용 대상 지정

  • 사용 가능한 ElementType Enum
    (TYPE, METHOD, FIELD, PARAMETER, CONSTRUCTOR, …)
@Target(ElementType.TYPE) // 클래스, 인터페이스, 열거형 등

3. @Retention – 어노테이션 유지 범위 지정

유형설명
SOURCE컴파일 시 사라짐 (소스에만 존재)
CLASS.class 파일에 존재하지만 JVM에서는 무시 (기본값)
RUNTIME.class에 존재하고 JVM이 런타임에 읽음 (Spring에서 자주 사용)
@Retention(RetentionPolicy.RUNTIME)

4. @Documented – 문서화 표시

  • Javadoc 문서 등에 해당 어노테이션이 반영되도록 설정

🔁 다시 보는 @Controller VS @RestController

🧭 @Controller

@Controller
public class ExampleController {
    @RequestMapping("/view")
    public String view() {
        return "pageName"; // ViewResolver 처리 대상
    }
}

📌 메타 어노테이션 확인

  • @Target(ElementType.TYPE)
  • @Retention(RetentionPolicy.RUNTIME)
  • @Documented
  • @Component 포함 → Spring Bean 등록

🌐 @RestController

@RestController
public class ExampleApi {
    @RequestMapping("/api")
    public String data() {
        return "JSON or TEXT response";
    }
}
  • @Controller + @ResponseBody 조합
  • 모든 메서드 응답을 HTTP Body에 직접 전달

@RestController에 왜 @ResponseBody가 중복 선언되는지?

  • @RestController는 클래스 레벨(ElementType.TYPE)에만 적용
  • @ResponseBody는 클래스/메서드 둘 다 사용 가능
    → 메서드에도 명시적으로 쓸 수 있어야 하므로 둘 다 @Target 선언

0개의 댓글