본문 바로가기
Tech/Spring

Spring Framework에서 자주 쓰는 어노테이션 개념 정리

반응형

공부 배경

  • Spring Framework를 사용하게 되면 수 많은 어노테이션들을 이용해 자동으로 기능을 구성시키는 경우가 많은데,,,
    생각보다 동작 원리나 개념을 모르고 쓰는 경우가 있다.
  • 점진적으로 하나씩 살펴보려고 합니다.

@RequestBody, @ResponseBody

  • HTTP 요청 및 응답의 본문을 Java 클래스 개체로 변환하는 데 사용
  • HTTP message converters를 이용
    • 단순히 HTTP 요청 및 응답 본문에는 Java 객체의 형태(있는 그대로)로 포함될 수 없다
    • JSON,XML 또는 다른 형식의 데이터(MIME)만 가능
    • 결국 HTTP 요청 및 응답의 본문을 Java 클래스 개체로 변환하는 데 사용의 역할을 수행하는 변환기이다
  • Spring FrameWork가 HTTP Message Converters를 선택하는 방법
    • @RequestBody의 Converter는 HTTP 프로토콜의 헤더 Content-Type을 보고 결정
      If the Content-Type is application/json , then it will select a JSON to Java Object converter. 
      If the Content-Type is application/xml , then it will select a XML to Java Object converter.​


    • @ResponseBody의 Converter는 HTTP 프로토콜의 헤더 Accept을 보고 결정
      If the Accept is application/json , then it will select a Java Object to JSON converter. 
      If the Accept is application/xml , then it will select a Java Object to XML converter.​
    • XML 타입을 변환하기 위해서는 아래 의존성이 있는지 확인
    <dependency>
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>
  • 참고문헌
 

Spring MVC : What is @RequestBody and @ResponseBody ?

  @RequestBody and @ResponseBody annotations are used to convert the body of the HTTP request and response with java class objects. Both these annotations will use registered HTTP message conv…

springbootdev.com

 

 

@PathVariable, @RequestParam, @MatrixVariable

  • @PathVariable
    • 요청 URI 패턴의 일부를 핸들러 메서드 파라미터로 받을 수 있다.
    • 기존 필수 지정은 true이다. boolean required() default true 
    • 기본 사용법
      // Request
      // GET /member/1
      
      @Controller
      public class Controller {
      	
          @GetMapping("/member/{id}")
          public Member getMember(@PathVariable("id") Long id){
          	....
          }
      }
    • Optional 사용법 ( Spring 4.1 이상, JDK 8 이상 )
      처음 지정할 속성이 없을 경우 사용하면 좋을 것 같다
      @Controller
      public class Controller {
      
      	@GetMapping(value = { "/user", "/user/{id}" })
          public ResponseEntity<MemberResponse> getUser(@PathVariable("id") Optional<Long> id) {
              if(id.isPresent()) {
                // logic
              }
              // default logic
          }
      }


    •  Enum 사용법
      기본적으로 StringToEnumConverterFactory를 사용하여 명칭(name)이 정확하게 일치한 열거형 타입을 가져온다
      ( 안맞을시 MethodArgumentTypeMismatchException )
      @Controller
      public class Controller {
      	
          @GetMapping("/member/type/{type}")
          public ResponseEntity<MemberType> getMemberType(@PathVariable("type") MemberType type) {
              return ResponseEntity.ok(type);
          }
          
      }​


    • 커스텀 Enum을 매핑하려면 Converter를 Web 속성으로 추가해주면 된다
      public class StringToEnumConverter implements Converter<String, MemberType> {
          @Override
          public MemberType convert(String source) {
              return MemberType.valueOf(source.toUpperCase());
          }
      }​
      @Configuration
      public class WebConfig implements WebMvcConfigurer {
          @Override
          public void addFormatters(FormatterRegistry registry) {
              registry.addConverter(new StringToEnumConverter());
          }
      }​
      https://www.baeldung.com/spring-enum-request-param

 

  • @RequestParam
    • 요청에 들어있는 key-value 쌍 데이터를 메서드 파라미터로 받아올 수 있다.
    • URI 뒤로 연결되는 ?key=value&key=value 의 값들을 매핑한다
      // Request 
      // GET /member?id=member
      
      
      @Controller
      public Class Controller {
      
      	@GetMapping("/member")
          public ResponseEntity<Member> getMember(@RequestParam("id") Long id) {
          	...
          }
      
      }​

 

 

@ConditionalOnProperty, @EnableConfigurationProperties, @Import

  • springboot conditional 관련 어노테이션
  • @ConditionalOnProperty
    • 구성 속성의 존재, 값에 따라 조건부로 일부 bean을 생성할 때 사용
    • 예시
      • @ConditionalOnProperty(prefix = "condition", name = "service", havingValue="true")
      • 설정파일에 condition.service=true를 추가하게되면 해당 빈이 활성화(생성)됩니다
  • @EnableConfigurationProperties
    • 프로퍼티(속성) 정보를 읽어 설정 정보를 가진 빈으로 등록할 때 사용한다
    • 속성으로 정의되는 Class를 스프링컨텍스트가 Configuration으로 인식할 수 있도록 하는 어노테이션
    • @Configuration으로 등록하기 ( @ConfigurationProperties가 선언되있는 클래스 )
      • 해당 클래스에 @Configuration을 선언 후 @ComponentScan이 되는 경로에 위치
      • @EnableConfigurationProperties에 속성으로 정의하기
  • @Import
    • 구성되어 있는 스프링 컨텍스트에 속성으로 추가한 Configuration을 추가한다
    • 그냥 클래스를 import하면 프록시로 감싸진 빈이 아닌 그냥 클래스가 추가된다 ( 주의사항 )
728x90
반응형