Spring Annotation 정리

김현정·2025년 3월 18일
0

Annotation

자바에서 Annotation은 코드 사이에 주석처럼 쓰이며, 특별한 의미, 기능을 수행하도록 하는 기술이다. 추가적인 정보를 제공해주는 메타데이터

@Slf4j

Slf4j는 인터페이스이고 그 구현체로 Logback같은 라이브러리를 선택한다.

Slf4j는 Logback 라이브러리를 이용해 로그를 남기기 위한 공통 인터페이스이다.

application은 Slf4t를 이용하여 로깅 라이브러리가 어떤 것이든 같은 방법으로 로그를 남길 수 있게 된다.

장점 : 나중에 더 좋은 라이브러리가 생겨 교체하더라도, application의 코드를 변경할 필요가 없다

1. Logging

  • 로깅이란? 정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동.

  • Thread 정보, 클래스 이름과 같은 부가 정보를 함께 확인할 수 있다.

  • 실제 운영 환경에서는 System.out.println();을 사용하여 Console에 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용하여 로그를 출력한다.

  • Log Level : TRACE > DEBUG > INFO > WARN > ERROR

  • 오른쪽으로 갈수록 심각한 오류를 의미

@Controller VS @RestController

1. @Controller

  • API와 view를 동시에 사용하는 경우에 사용한다.
  • 대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환한다.
  • view(화면) return이 주목적이다.
  • 즉, Template Engine인 Thymeleaf, JSP 등을 사용하는 경우이다.

2. @RestController

  • Controller 중 view로 응답하지 않는, Controller를 의미
  • method의 반환 결과를 JSON 형태로 반환한다. (Data를 반환한다고 생각)
  • 현재는 대부분 @RestController를 사용하여 API가 만들어짐. (Restful API)
  • return 값으로 view를 찾는 것이 아니라 HTTP Message Body에 Data를 입력한다.
  • 이 Annotatio이 적혀있는 Controller의 method는 HttpResponse로 바로 응답이 가능하다.
  • @ResponseBody 역할을 자동적으로 해주는 Annotation이다.
  • @ResponseBody + @Controller = @RestController

@Component

@Component는 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotation이다.

  • 1개의 class 단위로 bean으로 등록할 때 설정한다.
@Component
public class Student {
	public Student() {
    	System.out.println("hi");
	}
}

@Component(value = "mystudent")
public class Student {
	public Student() {
    	System.out.println("hi");
	}
}
  • Component에 대한 추가 정보가 없다면 Class의 이름을 camelCase로 변경한 것이 Bean id로 사용된다.
  • 하지만 @Bean과 다르게 @Component는 name이 아닌 value를 이용해 Bean의 이름을 지정한다.
여기서 스프링 빈(Spring Bean)이란?

스프링 컨테이너가 관리하는 자바 객체를 빈(Bean)이라 한다.
애플리케이션의 구성 요소를 정의하는 객체이다.
지금까지는 사용자가 new 키워드를 통해 객체를 생성하고 메소드를 호출했다. 스프링에서는 new를 사용하지 않고 빈을 사용한다.

@Target

@Target은 Java Compiler가 Annotation이 어디에 적용될지 결정하기 위해 사용한다.

  • @Target(ElementType.---)
    - ElementType.PACKAGE : 패키지 선언
    - ElementType.TYPE : 타입 선언
    - ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
    - ElementType.CONSTRUCTOR : 생성자 선언
    - ElementType.FIELD : 멤버 변수 선언
    - ElementType.LOCAL_VARIABLE : 지역 변수 선언
    - ElementType.METHOD : 메소드 선언
    - ElementType.PARAMETER : 매개변수 선언
    - ElementType.TYPE_PARAMETER : 전달인자 타입 선언
    - ElementType.TYPE_USE : 타입 선언

@Retention

@Retention은 Annotation이 실제로 적용되고 유지되는 범위를 의미.

-Policy에 관련된 annotation으로, 컴파일 이후에도 JVM에서 참조가 가능한 RUNTIME으로 지정한다.

  • @Retention(RetentionPolicy.---)
    - RetentionPolicy.RUNTIME
    : 실제 런타임 시점의 코드에 반영되어 영향을 준다. 클래스 파일(.class)에 저장되고, JVM에 의해 런타임 시점에 읽을 수 있다.
    - RetentionPolicy.CLASS
    : 컴파일러가 클래스를 참조할 때까지 유효, 컴파일된 클래스 파일(.class)에 저장되지만, JVM이 실행 시 읽지 않는다. (주석과 같음)
    - RetentionPolicy.SOURCE
    : 컴파일 전까지 유효 (컴파일 이후에는 사라짐) 컴파일러에 의해 클래스 파일로 저장되지 않는다.

@Documented

Javadoc 등의 문서화 도구에 의한 문서화되어야 함을 나타낸다.

@RequestMapping

특정 URL로 Requset를 보내면 들어온 요청을 Controller 내부의 특정 Method와 Mapping 하기위해 사용한다.

  • Client로부터 요청이 왔을 때 어떤 Controller가 호출될지 Mapping하는것은 단순히 URL로 Mapping 하는것이 아니라 여러가지 요소(URL, Method 등)를 조합하여 Mapping한다.

  • 요청 URL을 어떤 Method가 처리할지 mapping해주는 Annotation이다.

  • 요청을 받는 형식(HTTP Method)인 GET, POST, PATCH, PUT, DELETE, HEAD를 정의하기도 한다.

  • 요청 받는 형식을 정의하지 않는다면, 자동적으로 GET으로 설정된다.

    1. 속성값들을 설정할 때 배열 형태로 다중 설정이 가능하다
      ex) @RequestMapping**({**”/example”, “/example2”, “/example3”**})**
  • method 속성으로 HTTP 메서드를 지정하면 지정된것만 허용한다.
    - @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping (일반적으로 이렇게 사용함)

    • @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping의 Target은 Method Level 이다.
  • 반면에 @RequestMapping의 Target은 class, method 레벨에 적용이 가능하다.

  • Restful API의 계층 구조

ex) users/{userId}, category/{categoryId}/product/{productId}

  • prefix로 선언할 URL을 class 레벨에 적용하는 것에 주로 사용된다.
@RequestMapping("/prefix")
@RestController
public class RequestMappingController {
	// Post, GET, Put, Patch, Delete 모두 가능
	@GetMapping(value = "/v3")
	public String exampleV3() {
		// logic
		return "this is sparta!";
	}

}

@PathVariable

HTTP 특성 중 하나인 비연결성을 극복하여 데이터를 전달하기 위한 방법 중 하나이다. URL로 전달 된 값을 파라미터로 받아오는 역할을 수행

  • 경로 변수를 중괄호에 둘러싸인 값으로 사용할 수 있다. ex)user/{id}

  • 기본적으로 @PathVariable로 설정된 경로 변수는 반드시 값을 가져야 하며 값이 없으면 응답 상태코드 404 Not Found Error가 발생한다.

  • 최근 Restful API를 설계하는 것이 API의 기준이 되며 해당 어노테이션의 사용 빈도가 높아졌다.
    - Restful API를 설계하게 되면 URL path 만으로 어떤 Resource을 사용하는지,
    HTTP Method 만으로 어떤 기능이 동작되는지 쉽게 알아볼 수 있다.

    - - Restful API 설계 예시
    - postId글의 comment 댓글 작성
        - POST + `posts/{postId}/comments`
    - postId글의 comment 댓글 전체 조회
        - GET + `posts/{postId}/comments`
    - **postId글의 commentId 댓글 단 건 조회**
        - GET + `posts/{postId}/comments/{commentId}`
    - **postId글의 commentId 댓글 수정**
        - PUT **+** `posts/{postId}/comments/{commentId}`
    - **postId글의 commentId 댓글 삭제**
        - DELETE + `posts/{postId}/comments/{commentId}`
        
  • @PathVariable 규칙
    - 파라미터 변수명과 PathVariable 변수명이 같으면 속성 값 생략 가능

    • @PathVariable 다중 사용 가능

Parameter 추가 매핑

  • 특정 파라미터와 매핑하는 방법
package com.example.springbasicannotation.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ParameterController {

    // parms 속성값 추가
    @GetMapping(value = "/users", params = "gender=man")
    public String params() {
        // logic
        String result = "params API가 호출 되었습니다.";
        return result;
    }

}
  • 실제 URL GET http://localhost:8080/users?gender=man 파라미터(?gender=man)가 있어야 호출된다.

  • 속성 작성 규칙

    1. params = "gender"
      • params의 key값은 커스텀이 가능하다
      • value는 없어도 된다.
    2. params = "!gender"
      • gender가 없어야 한다.
    3. params = "gender=man"
      • gender=man 이어야 한다.
    4. params = "gender!=man"
      • params의 value값이 man가 아니여야 한다.
    5. params = {"gender=man", "gender=woman"}
      • 배열로 속성 값을 여러 개 설정이 가능하다.

0개의 댓글