스프링 MVC 1편 -벡엔드 웹 개발 핵심 기술 (6)

bin1225·2021년 9월 26일
0

Spring

목록 보기
6/15
post-thumbnail

6. 스프링 MVC - 기본 기능


로깅

로그 선언

  1. 일반선언
java private Logger log = LoggerFactory.getLogger(getClass());
  1. 애노테이션 사용
    @Slf4j : 롬복
@Slf4j
public class LogTest{
	
    public String logTester(){
    	String name = "name";
        log.info("이것은 로그 입니다.");
        log.info("name ={}",name);
	}
}

로그 레벨 순서
LEVEL: TRACE > DEBUG > INFO > WARN > ERROR
올바른 로그 사용법

log.debug("data={}",data);

log.debug("data="+data) 이런식으로 하면 +를 연산자로 인식하여 더하기 연산이 발생한다.

로그 사용시 장점

  • 쓰레드 정보, 클래스 이름 등 부가정보를 함께 볼 수 있고, 출력 모양을 조절할 수 있다.

  • 로그 레벨을 설정하여 상황에 맞게 출력을 조절할 수 있다.

  • 콘솔뿐 아니라 파일이나 네트워크 등 별도의 위치에 로그를 남길 수 있다.

  • 성능도 System.out 보다 좋다.

    매핑 정보

  • @RestController
    @Controller는 반환 값이 String이면 뷰 이름으로 인식하고 렌더링
    @RestController는 Http메세지 바디에 그대로 String을 입력한다.

  • HTTP 메서드
    @RequestMapping 에 method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게
    호출된다.( GET, HEAD, POST, PUT, PATCH, DELETE )

  • HTTP 메서드 매핑 축약
    편리한 축약 애노테이션
    -@GetMapping
    -@PostMapping
    -@PutMapping
    -@DeleteMapping
    -@PatchMapping

    경로변수(PathVariable) 사용

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

 	log.info("mappingPath userId={}", data);
 	return "ok";
    
}

이외에도 특정 파라미터, 헤더, 미디어 타입 등을 조건으로 세워 맵핑할 수 있다.

HTTP요청 파라미터 - 쿼리 파라미터, HTML Form

  • Spring 미사용
    HttpServletRequest 의 request.getParameter() 를 사용하면 다음 두가지 요청 파라미터를 조회할 수 있다.
String username = request.getParameter("username");
  • Spring 애노테이션 사용(@RequestParam)
public String requestParamV2(
 @RequestParam("username") String memberName,
 @RequestParam("age") int memberAge) {
 	log.info("username={}, age={}", memberName, memberAge);
 	return "ok";
}

파라미터 이름이 변수 이름과 같다면
@RequestParam("name")
-> name부분 생략 가능

  • 파라미터 필수 여부 설정
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age) 

기본 값이 필수(true)이고 false 설정시 파라미터가 필수가 아니게 된다.

  • 기본 값 적용
@RequestParam(required = true, defaultValue = "guest") String username,

defaultValue를 통해 기본값을 설정할 수 있다.

  • Map으로 조회하기
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
 	log.info("username={}, age={}", paramMap.get("username"),
	paramMap.get("age"));
 	return "ok";
}

HTTP 요청 파라미터 - @ModelAttribute

실제 개발시에 객체에 파라미터 값을 넣기 위해서는 값을 받아서 직접 그 객체에 set을 통해 값을 주입해줘야 한다.
하지만 스프링은 이 과정을 완전히 자동화 해주는 @ModelAttribute 기능을 제공한다.

public String modelAttributeV1(@ModelAttribute HelloData helloData) {
 	log.info("username={}, age={}", helloData.getUsername(),
	helloData.getAge());
 	return "ok";
}

@ModelAttribute 코드가 있으면 Spring 은 해당 객체(여기서는 HelloData) 를 생성하고 해당 객체의 프로퍼티의 setter 을 호출해서 파라미터 값을 입력한다.

  • @ModelAttribute는 생략할 수 있다.

스프링은 해당 생략시 다음과 같은 규칙을 적용한다.
- String , int , Integer 같은 단순 타입 = @RequestParam
- 나머지 = @ModelAttribute (argument resolver 로 지정해둔 타입 외)

HTTP 요청 메시지 - 단순 텍스트

1. InputStream
HTTP 메시지 바디의 데이터를 InputStream 을 사용해서 직접 읽을 수 있다.

public void requestBodyStringV2(InputStream inputStream, Writer responseWriter)
throws IOException {
 	String messageBody = StreamUtils.copyToString(inputStream,
	StandardCharsets.UTF_8);
 	log.info("messageBody={}", messageBody);
 	responseWriter.write("ok");
}

2. HttpEntity
HttpEntity: HTTP header, body 정보를 편리하게 조회
- 메시지 바디 정보를 직접 조회
- 요청 파라미터를 조회하는 기능과 관계 없음 @RequestParam X, @ModelAttribute X

public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
 	String messageBody = httpEntity.getBody();
 	log.info("messageBody={}", messageBody);
 	return new HttpEntity<>("ok");
}

3. RequestBody

public String requestBodyStringV4(@RequestBody String messageBody) {
 	log.info("messageBody={}", messageBody);
 	return "ok";
}

HTTP 요청 메시지 - JSON

@RequestBody 객체 변환

public String requestBodyJsonV3(@RequestBody HelloData data) {
 	log.info("username={}, age={}", data.getUsername(), data.getAge());
 	return "ok";
}

HttpEntity , @RequestBody 를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체 등으로 변환해준다.
HTTP 메시지 컨버터는 문자 뿐만 아니라 JSON도 객체로 변환해준다.

@RequestBody는 생략이 불가능하다.
-> 생략하면 @ModelAttribute가 실행되기 때문이다.

@ResponseBody
응답의 경우에도 @ResponseBody 를 사용하면 해당 객체를 HTTP 메시지 바디에 직접 넣어줄 수 있다.
이 경우엔 JSON 형식으로 응답이 생성된다.
물론 이 경우에도 HttpEntity 를 사용해도 된다.

0개의 댓글