스프링MVC-기본 기능

KJH·2023년 1월 13일
0

SpringMVC1

목록 보기
7/8
post-thumbnail

프로젝트 생성


build.gradle 파일로 프로젝트 열기

Welcome Page
스프링 부트에 Jardmf tkdydgkaus /resources/static/index.html/ 자동 처리


로깅

로깅 라이브러리
스프링 부트를 사용하면, spring-boot-logging이 함께 포함됨
기본적으로 SL4J (인터페이스) 의 구현체 Logback을 사용

trace>debug>info>warn>error 5레벨 있으며
로깅을 사용해서 특정 수준 이상의 로그만 볼 수 있음
application.properties에서 설정 가능

효율

  • log.debug("data"+data)
    • debug레벨을 실행하지 않을 때도, 문자열 합치는 연산 실행 => 쓸모없는 자원낭비
  • log.debug("data={}.data") (파라미터로 넘기기)
    • 실행하지 않으면 아무 리소스 소비 없음 => 효율적

로그는 시간, 레벨, PID, 쓰레드명, 클래스명, 메세지 형식으로 출력됨


요청 매핑

  • @RestController

    • 뷰를 렌더링하지 않고, 반환값이 HTTP메세지 바디에 바로 입력됨
  • `@RequestMapping("hello-basic")

    • /hello-basic URL이 호출되면, 이 메소드 실행
    • 배열로 넣을수도 있음 {?,?}
    • 메소드 속성을 지정하지 않으면, 전부 가능 (post,get ....)
  • @PathVariable("userId")
    URL경로를 템플릿화

    @GetMapping("/mapping/{userId}")
      public String mappingPath(@PathVariable("userId") String data){
      log.info("mappingPath userId={},",data);
       return "ok";

    /mapping/userA 경로가 호출되었을 때
    "userA"를 data로 받음

  • params = "mode=debug"

    • 쿼리 파라미터에 mode=debug가 있어야 호출됨
  • headers="mode=debug

    • 헤더에 mode=debug 가 있어야 호출
  • 미디어 타입 조건 매핑 (consume="application/json)

    • 컨텐츠가 json 타입이여만 호출

기본, 헤더 조회

  • HttpServletRequest
  • HttpServletResponse
  • HttpMethod : Http메서드 조회
  • Locale 로케일 정보 조회
  • @RequestHeader MultiValueMap<String, String> headerMap
    • 모든 헤더 정보를 맵으로 (Multivalue=중복허용)
  • @RequestHeader("host") String host : 특정 헤더 조회
  • @CookieValue(value = "myCookie", required = false) String cookie : 쿠키

@RequestParam

요청 파라미터를 편리하게 받음

//기본 사용
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {...

//파라미터 이름과 변수명이 같다면, 다음과 같이 생략 가능
(@RequestParam String username,@requestParam int age)
// 단순 타입이면 어노테이션 생략도 가능하지만, 비추
  • required를 통해 필수값 설정

@ModelAttribute

요청 파라미터 받기 => 객체생성 => 객체에 값 너주기

를 자동화해주는 기능

public String modelAttributeV1(@ModelAttribute HelloData helloData)

동작방식
객체 생성 => 객체의 프로퍼티 찾음 => setter 호출 => 바인딩 (값 입력)


요청 메세지

  • Httpmessage body에 직접 데이터를 담아서 요청

    • Http API에서 주로 사용 (json,text,xml)
    • POST, PUT, PATCH

    메시지 바디를 통해서 데이터가 직접 넘어오면@RequestParam,@modelAttribute 사용 불가 (HTML Form 제외)

단순 텍스트

  1. InputStream으로 읽고, Writer.write()으로 써서 전송
  2. HttpEntity<String> 사용
    @PostMapping("/request-body-string-v3")
    public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
        String messageBody = httpEntity.getBody();
        log.info("messageBody={}", messageBody);
        return new HttpEntity<>("ok");
    }
  • HttpEntity : header, body 정보 편리하게 조회
    • 메시지 바디 정보를 직접 조회
    • 파라미터 조회 기능과 관계 X
  • 응답에도 사용 가능
    • 바디 정보 직접 반환
    • 헤더 정보 포함 가능
    • view로 넘어가지 않음
  • HttpEntity를 상속받은 개체들
    • RequestEntity:HttpMethod, url정보추가, 요청
    • ResponseEntity : Http상태 코드 설정, 응답

@RequestBody

앞의 과정은 필요없이, 메세지 바디 직접 조회

public HttpEntity<String> requestBodyStringV4(@RequestBody String messageBody)

@ResponseBody

응답 결과를 Http 메시지 바디에 직접 담아서 전달 (view 사용 X)

JSON

ObjectMapper를 통해서 Json=>객체변환하는 방법이 있고,
(@RquestBody HelloData data)처럼 직접 만든 객체를 지정할 수도 있다.

HttpEntity, @RequestBody등을 사용하면, Http 메시지 컨버터가 우리가 원하는 문자나 객체로 변환


 @ResponseBody
 @PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData helloData) throws IOException {
      log.info("username={},age={}",helloData.getUsername(),helloData.getAge());
      return "ok";
    }   

*생략하면 @ModelAttribute 로 인식하기 때문에 생략 X
HttpEntity<HelloData> 로도 꺼낼 수 있음


응답

스프링에서 응답 데이터를 만드는 3가지 방법

  • 정적 리소스 (파일 그대로 전달)
  • 뷰 템플릿 사용 (동적인 HTML)
  • Http 메시지 사용
    • Http 메시지 바디에 Json등의 형식으로 데이터를 실어 보냄

정적 리소스

src/main/resources/static에 리소스를 넣어두면, 정적 리소스 제공

뷰 템플릿

뷰 템플릿을 거쳐서 HTML이 생성되고, 뷰가 응답을 만들어서 전달
기본 템플릿 경로 = src/main/resources/templates

  • String: View | Http메시지
  • Void : 요청 URL을 논리 뷰 이름으로

Thymeleaf 설정

build.gradle

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

기본설정

spring.thymleaf.prefitx=classpath:/templates/ 
spring.thymeleaf.suffix=.html

HTTP 메시지 컨버터

ResponseBody 원리

스프링에서 Http메시지 컨버터 적용 경우

  • 요청 : @RequestBody,HttpEntity(RequestEntity)
  • 응답 : @ResponseBody,'HttpEntity(ResponseEntity)

요청 매핑 핸들러 어댑터 구조

RequestMappingHandlerAdapter 등작 방식

ArgumentResolver
어노테이션 기반의 컨트롤러가 Model,@RequestParam....등 여러 파라미터를 처리할 수 있는 이유가 ArugmentResolver덕분임
Http메세지 컨버터가 여기에 포함됨

ReturnValueHandler
ArgumentResolver와 비슷한데, 응답값 반환,처리
ex) 뷰 이름을 String으로 반환해도 동작

0개의 댓글