- 계획
- 문제점
- 듣는 건 하겠는데 TIL 너무 쓰기 싫다.. 귀찮아..
- 키보드 오늘 온다며.. 왜 안옴 ?
- 보완점
- 키보드 빨리 와주세요..
- 귀찮아도 꾸준히...
- 오늘 공부
1. 데이터를 클라이언트에 반환하는 방법
- 기존 : 서버 요청을 받아 html/css/js파일을 반환해주는게 주 업무
- 최근 경향 : 예전엔 좀 그런 편이었으나, 프론트엔드와 백엔드가 발전하며 느슨하게 결합하는 방식 선호
(요청에 맞는 특정 정보만 반환하는 것을 더 선호, 데이터 교환 포맷 중 Json 형태로 데이터를 반환하기도 함)
-Json데이터 반환
템플릿엔진이 적용된 SpringBoot는 Controller에서 문자열을 반환하면 templates폴더에서 html파일을 반환함
따라서 Json데이터를 브라우저에 반환하고 싶다면 메서드에 @ResponseBody 에너테이션 추가
* Java는 Json타입을 지원하지 않으므로, Json 형태의 String타입으로 변환해서 사용
(Ex. http://localhost:8080/response/json/string)
* String 외의 자바 클래스
(http://localhost:8080/response/json/class (자바 객체 -> Json으로 변환, Spring에서 자동으로 변환))
- @RestController 에너테이션 : @Controller + @ResponseBody / 해당 클래스 모든 메서드에 @Responsbody를 사용한 효과
2. Jackson이란 무엇인가?
- Json 데이터 구조를 처리해주는 라이브러리
(Object를 Json타입의 String형태로 변환 가능)
(Json타입의 String을 Object로도 가능)
- Spring은 3.0버전 이후로 Jacskon과 관련된 API를 제공해 직접 소스 코드를 작성하여 Json 데이터를 처리하지 않아도 자동으로 처리함
- Object To Json
@Test
@DisplayName("Object To JSON : get Method 필요")
void test1() throws JsonProcessingException {
Star star = new Star("Robbie", 95);
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
String json = objectMapper.writeValueAsString(star);
System.out.println("json = " + json);
}
(ObjectMapper를 사용할 때 무조건 가능한 게 아니라 조건이 있음 Ex. Getter 메서드)
(Object To Json = 직렬화(serialize))
- Json To Object
@Test
@DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
void test2() throws JsonProcessingException {
String json = "{\"name\":\"Robbie\",\"age\":95}"; // JSON 타입의 String
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
Star star = objectMapper.readValue(json, Star.class);
System.out.println("star.getName() = " + star.getName());
}
(마찬가지로 ObjectMapper를 쓰기 위해 Getter 또는 Setter 메서드, 기본 생성자 필요)
(당연한 이야기지만 Json 형태의 키 값과 Star클래스 필드명(변수명)이 일치해야함)
(Json To Object = 역직렬화(deserialize))
3. Path Variable과 Request Param
- 클라이언트 즉, 브라우저에서 서버로 Http요청을 보낼 때 데이터를 같이 보낼 수 있음.
- 데이터를 보내는 방식이 여러 가지이므로 모든 방식에 대한 처리 방법을 학습해야함.
- @PathVariable
// [Request sample]
// GET http://localhost:8080/hello/request/star/Robbie/age/95
@GetMapping("/star/{name}/age/{age}")
@ResponseBody
public String helloRequestPath(@PathVariable String name, @PathVariable int age)
{
return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age);
}
필요한(받아올) 데이터의 변수명에 {}를 사용
@PathVariable을 메서드의 파라미터로 사용, String 형태와 int 형태로 받아올 것 변수명과 타입 선언
- @Request Param
// [Request sample]
// GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
필요 데이터를 받기 위해 key부분에 선언한 name과 age를 사용해 value에 선언된 Robbie, 95를 받음
@PathVariable과 마찬가지로 메서드의 파라미터 부분에 @RequestParam을 key값과 같이 변수명과 변
수 타입을 선언하면 데이터를 받아올 수 있음.
- form 태그 POST
<form method="POST" action="/hello/request/form/model">
<div>
이름: <input name="name" type="text">
</div>
<div>
나이: <input name="age" type="text">
</div>
<button>전송</button>
</form>
html의 form태그를 사용해 POST 방식으로 http요청을 보낼 수 있음.
이때 http body에 "name=Robbie&age=95" 형태로 담겨져서 서버에 전달
- RequestParam 생략 하는 방식
// [Request sample]
// GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam(required = false) String name, int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
required 옵션을 false로 설정하면 Client에서 전달받은 값들에서 해당 값이 포함되어 있지 않아도 오류가 미발생
@PathVariable(required = false)도 해당 옵션이 존재
클라이언트로부터 값을 전달 받지 못한 변수는 null로 초기화