[Spring]Annotation 정리

손홍서·2022년 5월 25일
0

Spring

목록 보기
1/24
post-thumbnail

요청매핑

Mapppiing Controller

@Controller: 뷰를 반환하는 컨트롤러, 뷰를 찾고 뷰를 랜더링
@RestController: String을 반환, 반환값을 HTTP 메세지 바디에 바로 입력
@RequestMapping("/url-example")

  • '/url-example' url호출이 오면 이 메서드가 실행되도록 매핑
  • 다중 설정 가능 ex. @RequestMapping(value = {"/url-example1", "url-example2"})
  • @RequestMapping을 사용하면 method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 호출된다. ex. @RequestMapping(value = "/url-example", method = RequestMethod.GET)
    • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping
    • 이들을 사용하면 method 속성 작성할 필요없음

경로변수

@PathValiable: 리소스 경로에 식별자를 넣는 스타일

@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
	...
}

@PathVariable의 이름과 파라미터 이름이 같으면 생략 가능하고 다중으로 사용 가능하다.

@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long
orderId) {
	...
}

특정 파라미터 조건 매핑

파라미터의 값에 따라 메서드를 실행할 수 있음
예시

  • params="mode"
  • params="!mode"
  • params="mode=debug"
  • params="mode!=debug"
  • params = {"mode=debug","data=good"}
@GetMapping(value = "/mapping-param", params = "mode=debug")
public String mappingParam() {
	...
}

특정 헤더 조건 매핑

파라미터와 비슷하지만 헤더에 적용되는 매핑

@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
 	...
}

미디어 타입 조건 매핑 - HTTP 요청 Content-Type, consume

HTTP 요청의 Content-Type 헤더를 기반으로 매핑

@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {
	...
}

미디어 타입 조건 매핑 - HTTP 요청 Accept, produce

HTTP 요청의 Accept 헤더 기반으로 매핑

@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
	...
}

HTTP 요청 - 기본 헤더 조회

애노테이션 기반의 스프링 컨트롤러가 HTTP 헤더 정보를 조회하는 방법
애노테이션 기반 컨트롤러는 다양한 파라미터를 제공하기때문에 헤더 정보 조회를 쉽게 할 수 있다.

@RequestMapping("/headers")
public String headers(HttpServletRequest request,
  HttpServletResponse response,
  HttpMethod httpMethod,
  Locale locale,
  @RequestHeader MultiValueMap<String, String>
  headerMap,
  @RequestHeader("host") String host,
  @CookieValue(value = "myCookie", required = false)
  String cookie
) {
	...
}

++ MultiValueMap
MAP과 유사한데, 하나의 키에 여러 값을 받을 수 있다.
HTTP header, HTTP 쿼리 파라미터와 같이 하나의 키에 여러 값을 받을 때 사용한다.
++ @Slf4j
lombok이 제공하는 에노테이션 로그를 선언해준다. 하위 코드 자동생성

private Logger log = LoggerFactory.getLogger(getClass());

HTTP 요청 파라미터 - 데이터 조회

클라이언트에서 서버로 요청 데이터를 전달할 때 방법
1. Get - 쿼리 파라미터
2. Post - HTML Form
3. HTTP message body에 데이터 직접 담아서 요청(json)

  • HTTP API에서 주로 사용
  • Post, Put, Patch

사실 1, 2는 형식이 같아 구분없이 조회 가능하다. 이들을 요청 파라미터 조회라 한다.

요청 파라미터 조회

@RequestParam

@RequestMapping("/request-param-v2")
public String requestParamV2(
 @RequestParam("username") String memberName,
 @RequestParam("age") int memberAge) {
	...
}

// HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
@RequestMapping("/request-param-v3")
public String requestParamV3(
 @RequestParam String username,
 @RequestParam int age) {
 	...
}

@RequestParam의 속성

1. required
기본값은 true이다.
만약 username이 요청파라미터에 없으면 오류가 난다. 하지만 age는 없다고 하여도 오류가 나지 않는다
하지만 이름만 넣어도(ex. ?username= ) 빈 문자로 통과가 된다.

@RequestMapping("/request-param-required")
public String requestParamRequired( 
  @RequestParam(required = true) String username,
  @RequestParam(required = false) Integer age) {
  log.info("username={}, age={}", username, age);
  return "ok";
}

2. defaultValue
파라미터에 값이 없는 경우 defaultValue 를 사용하면 기본 값을 적용할 수 있다.
빈 문자에 설정한 기본 값이 적용된다.

@RequestMapping("/request-param-default")
public String requestParamDefault(
 @RequestParam(defaultValue = "guest") String username,
 @RequestParam(defaultValue = "-1") int age) {
 log.info("username={}, age={}", username, age);
 return "ok";
}

파라미터를 Map으로 조회하기 - requestParamMap

//MultiValueMap을 사용한 다중 값 가능
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
	log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
	return "ok";
}

@ModelAttribute

주로 개발을 하면 요청 파라미터를 받아와 객체를 생성하고 그 객체에 값을 넣어준다.(set)
하지만 이 과정을 간단히 할 수 있다.

@ResponseBody
@RequestMapping("/model-attribute")
public String modelAttribute(@ModelAttribute HelloData helloData) {
	log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
	return "ok";
}
  1. HelloData 객체를 생성한다
  2. 요청 파라미터 이름으로 HelloData 객체의 프로퍼티(getter,setter)를 찾고 setter를 통해 파라미터 값을 바인딩한다.

++ @Data
@Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor 를
자동으로 적용해준다.

@Data
public class HelloData {
 private String username;
 private int age;
}

요청 메세지 조회

@RequestBody

단순 텍스트

@RequestBody 를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다. 참고로 헤더 정보가
필요하거나 상태코드를 지정하고싶으면 HttpEntity 를 사용하면 된다. 헤더 정보 같은 경우는 @RequestHeader 를 사용하여도 된다.
이렇게 메시지 바디를 직접 조회하는 기능은 요청 파라미터를 조회하는 @RequestParam ,
@ModelAttribute 와는 전혀 관계가 없다.

  • 요청 파라미터를 조회하는 기능: @RequestParam, @ModelAttribute
  • HTTP 메세지 바디를 직접 조회하는 기능: @RequestBody
@PostMapping("/request-body-string")
public String requestBodyString(@RequestBody String messageBody) {
 log.info("messageBody={}", messageBody);
 return "ok";
}

JSON

HttpEntity , @RequestBody 를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가
원하는 문자나 객체 등으로 변환해준다.
문자 뿐만 아니라 JSON도 객체로 변환해준다.
@RequestBody를 생략해서는 안된다. 생략한다면 단순타입(int,String,Integer)은 @RequestParam이 적용되고 그 외는 @ModelAttribute가 적용되어버린다!

@PostMapping("/request-body-json")
public HelloData requestBodyJson(@RequestBody HelloData data) {
  log.info("username={}, age={}", data.getUsername(), data.getAge());
  return data;
}

응답 매핑

서버에서 응답 데이터를 만드는 방법

  1. 정적 리소스
  • ex. 정적 HTML, css, js...
  • 경로: src/main/resources/static
  1. 뷰 템플릿
  • ex. 동적 HTML
  • 경로: src/main/resources/templates
  1. HTTP 메세지 사용
  • HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에
    JSON 같은 형식으로 데이터를 실어 보낸다.

뷰 템플릿

@RequestMapping("/response/hello") //매핑되는 뷰 템플릿 상세 경로
 public void responseViewV3(Model model) {
 	model.addAttribute("data", "hello!!"); 
 }

HTTP 메세지

@ResponseStatus(HttpStatus.OK) // 응답코드 설정 가능
@ResponseBody //@RestController 어노테이션 사용하면 생략가능
@GetMapping("/response-body-json")
public HelloData responseBodyJson() {
  HelloData helloData = new HelloData();
  helloData.setUsername("userA");
  helloData.setAge(20);
  return helloData; // HTTP 메세지 컨버트를 이용해 json형식으로 변환되어 리턴된다.
}

이 포스트의 대부분의 내용은 인프런의 김영한 강사님의 '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 바탕으로 정리한 내용입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

profile
Hello World!!

0개의 댓글