개발놀이터

스프링 MVC 기본기능 핵심정리 본문

Spring/Spring

스프링 MVC 기본기능 핵심정리

마늘냄새폴폴 2021. 8. 19. 14:30

*로깅
롬복의 @Slf4j어노테이션 사용 or private final Logger log = LoggerFactory.getLogger(getClass());

올바른 로그 사용법
log.info("username={}", username);


*요청 매핑 @RequestMapping(value = "/hello-basic" method = "RequestMethod.GET")
이거 두개를 합친것이 바로 @GetMapping


*@ResponseBody 이거 쓰면 return 값을 문자열로 반환했을 때 HTTP메시지 바디에 꽂혀서 전송됨


*@PathVariable 경로 변수 
/username/{username} 이런식으로 URL을 템플릿화 시켜서 보냄 가져오는 방법
public String getPathVariable(@PathVariable("username") String data) 이렇게 하면 data에 저 {username} 에 해당하는 값 넣을 수 있음
매개변수명과 경로변수명이 같으면 생략해서 사용 가능
public String getPathVariable(@PathVariable String username) 이런식으로 생략가능


*특정 헤더 조건 매핑
@GetMapping("/mapping-header", headers = "mode=debug") key = mode, value = debug인 헤더가 없으면 오류 띄운다


*미디어 타입 조건 매핑
@GetMapping("/mapping=consume", consume = "application/json") 미디어타입이 안맞으면 오류 띄운다


*HTTP 요청의 Accept헤더를 기반으로 미디어 타입을 매핑
@PostMapping("/mapping-produce", produce = "text/html") 미디어타입이 text/html이 아니면 오류 띄운다


*쿼리 파라미터는 GET, POST, HTTP message body이 세개만 동작 (클라이언트 -> 서버로 요청 데이터 전달할 때)
GET, POST는 request.getParameter로 꺼내올 수 있음 @RequestParam 쓰면 더 간결하게 꺼내올 수 있음
public String requestParam(@RequestParam("username") String memberName) 이렇게 선언하고 memberName으로 사용하면 됨 String memberName = request.getParameter("username")과 같은 의미
매개변수의 변수명과 파라미터의 이름이 같으면 생략할 수 있음 public String requestParam(@RequestParam String username) 이런식으로 가능
매개변수타입이 String, int, Integer등 단순한 타입이면 @RequestParam 생략가능, 하지만 안하는게 더 명시성 좋음


*파라미터를 Map으로 조회하기
public String requestParamMap(@RequestParam Map<String, Object> paramMap) 이렇게 하고 paramMap.get("username") 이런식으로 꺼내서 쓸 수 있음 파라미터 이름을 key로 같는 Map 생성


*요청 파라미터에 객체를 집어 넣는 방법 @ModelAttribute
public String modelAttribute(@ModelAttribute HelloData helloData) 이렇게 @ModelAttribute 어노테이션을 사용하면 객체를 요청 파라미터에 집어넣을 수 있음 이렇게 넣으면 파라미터에 들어온 username이 @ModelAttribute를 만나면 helloData.setUsername("userA"); 이걸 처리해 줌 따라서 메서드에서는 helloData.getUsername()으로 값을 꺼내서 사용 할 수 있음 @ModelAttribute는 생략 가능, 하지만 생략하지 않는게 명시성에 더 좋음


*HTTP 요청 메시지 - HTTP message body에 데이터를 직접 담아서 요청
1. response를 사용하는 방법 //잘 사용 안함
2. InputStream을 사용하는 방법 //잘 사용 안함
3. HttpEntity or ResponseEntity를 사용하는 방법 //꽤 사용 함 헤더정보 읽을 때
4. @RequestBody를 사용하는 방법 //자주 사용 함

3. HttpEntity or ResponseEntity 사용하는 방법
public String requestBodyString(HttpEntity<String> httpEntity) 이렇게 하고 String messageBody = httpEntity.getBody(); 이렇게 선언하면 HTTP 메시지 바디에 있는 단순 텍스트가 messageBody에 저장됨

4. @RequestBody 사용하는 방법
public String requestBodyString(@RequestBody String messageBody) 이렇게 선언하면 바로 messageBody에 HTTP 메시지 바디에 있는 단순 텍스트가 저장됨 바로 꺼내 쓰면 됨


*HTTP 요청 메시지 - JSON
1. InputStream 사용해서 읽기 //잘 안쓴다
2. objectMapper 사용해서 읽기 //잘 안쓴다
3. @RequestBody 사용해서 읽기 //자주 쓴다
4. HttpEntity 사용해서 읽기 //종종 쓴다
5. @RequestBody 사용해서 읽고 json으로 응답하기 //자주 쓴다

3. @RequestBody 사용해서 읽기
public String requestBodyJson(@RequestBody HelloData helloData) 이렇게 하면 json으로 온 {"username":"userA", "age":"20"} 이런 형태의 데이터가 
helloData.setUsername("userA"), helloData.setAge(20) 이런식으로 들어감 HelloData에 JSON의 키값이 되는 프로퍼티에 해당하는 getter, setter가 있어야 함

4. HttpEntity 사용해서 읽기
public String requestBodyJson(HttpEntity<HelloData> httpEntity) 이런식으로 선언한 후에 HelloData helloData = httpEntity.getBody(); 이런식으로 객체를 생성해서
helloData.getUsername(), helloData.getAge() 이런식으로 뽑아 쓰면 됨

5. @RequestBody 사용해서 읽고 json으로 응답하기
위의 3번과 똑같은 방식으로 사용하면 되지만 반환타입을 String에서 HelloData로 바꿔준 후에 helloData.setUsername("userB"), helloData.setAge(30); 이렇게 지정한 후에
return helloData이렇게 바꿔주면 json으로 응답이 가능하다. 상대방은 {"username":"userB", "age":"30"}인 json데이터를 받게 된다.