반응형
공부 배경
- 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>
- @RequestBody의 Converter는 HTTP 프로토콜의 헤더
- 참고문헌
@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()); } }
https://www.baeldung.com/spring-enum-request-param@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToEnumConverter()); } }
- @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
반응형
'Tech > Spring' 카테고리의 다른 글
파라미터 바인딩 어노테이션 (0) | 2021.10.27 |
---|---|
ResponseEntity vs @ResponseStatus (0) | 2021.09.12 |
CORS.. 많이 듣긴했는데... (0) | 2021.08.08 |
Spring Transactional 어디까지 알고있니? (3) | 2021.08.08 |
SpringBoot를 우아하게(?) 종료시켜보자 (1) | 2021.08.08 |