Controller Querystring and Path Variable Mapping

민준·2023년 2월 21일
0

1. 쿼리스트링과 주소 변수 매핑

구체적인 데이터 요청시 쿼리스트링 또는 주소 변수 매핑 이 필요합니다.
스트링부트에서는 '주소 변수 매핑'이 훨씬 편리해서 주로 사용합니다.
강의에서는 통닭집에 비유해 개념을 설명합니다.
요는, 서버나 데이터베이스에 요청을 할 때 무엇을 원하는지 구체적으로 전달한다는 것입니다.

예를들어 '도메인?type=양념'의 형식으로 요청하는 것이 '쿼리스트링',
'도메인/양념'의 형식으로 요청하는 것이 '주소 변수 매핑'이라고 합니다.

실습

지난 프로젝트에 이어 web 패키지에 클래스를 하나 생성합니다.

package com.cos.controllerdemo.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class QueryPathController {
	
	@GetMapping("/chicken") // 쿼리스트링
	public String chickenQuery(String type) {
		return type+" 배달갑니다.(쿼리스트링)";
	}
	
	@GetMapping("/chicken/{type}") // 주소 변수 매핑
	public String chickenPath(@PathVariable String type) {
		return type+" 배달갑니다.(주소 변수 매핑)";
	}
}


2. HTTP body 데이터 전송하기

ㄱ) HTTP header 의 Content-Type

'POST', 'PUT' 요청 방식으로 body 데이터를 전송할 때,
'http header'에 Content-Type을 'protocol'로 명시해야 합니다.
'GET' 요청 방식에는 body가 없으니 'Content-Type' 또한 없습니다.

스프링부트는 기본적으로 x-www-form-urlencoded 타입을 파싱(분석)합니다.
이외에도 'text/plain', 'application/json', 이미지, 영상 등등이 있습니다.

Content-Type데이터 형식
x-www-form-urlencodedkey = value
text/plain메시지
application/json{"username" : "cos"}

실습

web 패키지에 새로운 클래스를 하나 생성합니다.
요청 방식은 'POST'이며 아직 위에서 본 코드들과 큰 차이는 없어보입니다.
요청 방식이 'POST'이므로 'Postman'을 실행합니다.

package com.cos.controllerdemo.web;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HttpBodyController {
	
	@PostMapping("/body1")
	public String xwwwformurlencoded() {
		return "key=value 전송 옴";
	}
	
	@PostMapping("/body2")
	public String textplain() {
		return "plain/text 전송 옴";
	}
	
	@PostMapping("/body3")
	public String applicationjson() {
		return "json 전송 옴";
	}
}

지금까지는 특별히 다른 점이 안보입니다.

a) x-www-form-urlencoded

이번에는 포스트맨에 키와 값을 입력하고 위 코드에서 아래와 같이 코드를 조금 추가합니다.
'Logger'를 통해 'username' 키의 값을 콘솔창에 보여줍니다.

@RestController
public class HttpBodyController {
	
	private static final Logger log = LoggerFactory.getLogger(HttpBodyController.class);

	@PostMapping("/body1")
	public String xwwwformurlencoded(String username) {
		log.info(username);
		return "key=value 전송 옴";
	}

b) text/plain

이번에는 'textplain' 메서드를 아래와 같이 수정합니다.
위에서는 'String username'을 매개변수로 받아 키로 인식해 값을 출력했다면
여기서는 '@RequestBody String data'를 매개변수로 받아서 그대로 출력합니다.

@PostMapping("/body2")
public String textplain(@RequestBody String data) {
	log.info(data);
	return "text/plain 전송 옴";
	}

포스트맨에서 'Body-raw-Text'로 설정하고 메시지를 입력합니다.
저는 "평문을 날려봅니다."라고 입력하고 'Send' 버튼을 눌렀습니다.
하단에 "text/plain 전송 옴"이라고 return 값이 출력되었습니다. 반면 콘솔창에는

작성한 데이터가 잘 출력되었습니다.

c) application/json

실습에 앞 서 강의에서 'json'에 대해 유튜브 링크를 하나 추천해주었습니다.
👉 스프링부트 강좌 23강(블로그 프로젝트) - JSON 사용법

위 코드에 이어 'applicationjson' 메서드의 코드를 아래와 같이 수정하고 저장합니다.
위의 'text/plain'와 다른 게 없습니다.

@PostMapping("/body3")
public String applicationjson(@RequestBody String data) {
	log.info(data);
	return "json 전송 옴";
}

이제 포스트맨에 아래와 같이 입력하고 'Send'를 누릅니다.

데이터가 잘 출력되었습니다. 키로 요청해 값을 응답받고 싶으면 새로운 패키지와 클래스를 생성합니다.

package com.cos.controllerdemo.domain; // domain 패키지 - User 클래스

public class User {
	
    // 멤버변수 'username' 선언
	private String username;

	// get(), set() 메서드 선언(아래의 방법으로 자동완성 가능)
    // 우클릭 - Source - Generate Getters and Setters
    // 또는 [option]+[command]+S > Generate Getters and Setters
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}
}

이제 이 'User' 클래스의 메서드를 이용해 'username'의 값을 받아올 것입니다.
다시 'HttpBodyController' 클래스에 아래와 같이 코드를 추가합니다.
위에서는 그저 문자열 데이터로만 받아왔다면 이번에는 'x-www-form-urlencoded'처럼
'username'을 키로 활용해 값을 받아옵니다.

@PostMapping("/body4")
public String applicationjsonToObject(@RequestBody User user) {
	log.info(user.getUsername());
	return "json 전송 옴";
}

그리고 포스트맨에 위와 똑같이 다시 입력하고 전송 버튼을 누릅니다.

원하는 값을 잘 받아왔습니다. 그런데 하나 궁금한 게 생겼습니다.
굳이 get() 메서드를 활용해서 데이터를 받아왔어야 하나? 'username'으로 직접 받으면 안되나? 싶습니다.
아- 코드를 쓰다가 깨달았습니다. 애초에 매개변수를 String 으로 받는 순간 그것은 문자열 데이터일 뿐입니다.


아- 이게 강의를 들으면서 정리까지 하려다보니

시간이 꽤나 걸립니다.

그래도 확실한 건 그냥 강의만 슥 보는 것보다는

머리에 정리가 되긴 합니다.

귀찮고 오래걸려도.. 해야하는 이유가 생겼습니다.

그나저나 패스트캠퍼스 백엔드 부트캠프 신청했는데,

합격이 될지 말지 걱정됩니다. 오늘 사전 설명회가 있었는데

들어보니 이거 저에게 꼭 필요한 과정이라는 생각이 들었습니다.

발표는 3월 10일.. 이 글을 보는 여러분 응원해주세요.

profile
백엔드 포지션 공부 중입니다.

0개의 댓글