23.06.20
Serialization(직렬화)
직렬화란?
객체를 저장 가능한 상태 또는 전송 가능한 형태로 바꾸는 작업을 의미한다.
즉, 직렬화 : 메모리 상에 저장된 데이터를 전송 가능한 형태로 바꾸는 작업이다.
JSON (JavaScript Object Notion)
- 자바스크립트에서 객체를 사용하는 방식을 JSON이라고 한다.
- 데이터를 주고 받는 데 활용할 수 있는 데이터 표현 방식
- JavaScript 객체를 표현하는 방식에서 그 문법을 차용
✅ JSON 사용방법 중괄호( {} ) 내부에 Key - Value 쌍을 콜론(:)으로 구분
- Key가 객체의 필드라면, Value는 필드에 할당된 값
- 기본 자료형: 문자열, 숫자, 불린, Null
- 복합 자료형: 객체( {} ), 배열 ( [] )
{
"title": "게시글 제목",
"content": "Lorem ipsum dolor sit amet"
}
- 이때 들어올 수 있는 데이터 자료형은 문자열, 숫자, 불린, Null, 그리고 복수의 데이터를 포함하기 위한 객체(Object)와 배열(Array)이 있습니다.
- 실제로 현재 데이터는 한 객체를 표현한 내용으로, title 과 content 항목에 데이터가 할당되었다고 할 수 있습니다.
✅ JSON 장점
- 사람이 읽고 쓰기 쉽다
- 기계가 파싱(해석)하고 만들기 편하다
- 거의 대부분의 API 통신에서 사용한다.
- Java의 유사한 interface : Map<String, Object> (Map 자료 구조)
@RequestBody, @ResponseBody
HTTP 요청과 응답의 Body를 결정하는 어노테이션
- 클라이언트가 보낸 데이터의 필드가 지정된 객체와 동일할 경우
- 그 데이터를 할당해서 객체를 만들어준다.
- 응답하는 객체의 필드를 해석 가능한 데이터의 형태 (JSON) 등으로 Body에 할당한다.
- BodyController
// '/body'로 요청이 들어왔을 때
// ResponseDto 데이터를 표현한 JSON 응답을 반환하는 메소드
// ResponseDto를 표현한 JSON을 포함해 응답하는 메소드
@PostMapping("/body")
@ResponseBody
public ResponseDto body(
@RequestBody
ArticleDto dto
){
log.info("POST /body " + dto.toString());
ResponseDto response = new ResponseDto();
response.setMessage("success");
response.setStatus(200);
return response;
}
@PostMapping("/body-2")
@ResponseBody
public ResponseDto body2(
@RequestBody
WriterDto dto
){
log.info("POST /body-2 " + dto.toString());
ResponseDto response = new ResponseDto();
response.setMessage("success");
response.setStatus(200);
return response;
}
@PostMapping("/body-3")
@ResponseBody
public ResponseDto body3(
@RequestBody
ArticleDto dto
){
log.info("POST /body-3 " + dto.toString());
ResponseDto response = new ResponseDto();
response.setMessage("success");
response.setStatus(200);
return response;
}
@PostMapping("/body-4")
@ResponseBody
public ResponseDto body4(
@RequestBody
ArticleComplexDto dto
) {
log.info("POST /body-3 " + dto.toString());
return new ResponseDto();
}
}
💡 @RestController를 사용하면
모든 메소드에 @ResponseBody가 추가 되기 때문에 일일히 @ResponseBody를 추가하지 않아도 된다.
💡 ResponseEntity 좀 더 세밀한 응답 조절이 필요할 때
- 응답 코드 설정
- 응답 헤더를 추가
- new를 대신해 응답을 만들어나가기 위한 빌더(Builder) 메소드도 제공한다.
- ResponseEntity
//@ResponseBody는 요청의 HTTP Body만 설정
//Header를 추가하거나
//Status code를 고르고 싶을 때
//ResponseEntity<T>
@PostMapping("/entity")
public ResponseEntity<ResponseDto> entity(
@RequestBody
ArticleDto dto
) {
log.info("POST /body " + dto.toString());
ResponseDto response = new ResponseDto();
response.setMessage("success");
response.setStatus(200);
//상태코드 지정해서 ResponseEntity 객체 그냥 쓰기
ResponseEntity<ResponseDto> responseEntity = new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
return responseEntity;
}
}
REST
▶️ REpresentational State Transfer
- HTTP를 이용한 서버를 구현할 때 지켜야 하는 설계 원칙
- 서버와 클라이언트 사이의 결합성 감소에 목표를 둠
- 성능향상
- 확장성 확보
- 사용 편의성 증대
▶️ Client – Server Architecture
- 클라이언트와 서버의 역할 분리
- 서버는 데이터가 어떤 방식으로 표현되는지 몰라도 된다.
- 클라이언트도 데이터가 어떻게 저장되는지 몰라도 된다.
- 양측의 독립적 발전 추구
▶️ Statelessness
- 클라이언트가 보내는 개별적인 요청은 각각이 요청을 표현하에 충분하여야 한다.
- 즉, 서버가 클라이언트가 몇번째 보낸 요청인지, 이전에 보낸 요청에 데이터가 어떤지 기억할 필요가 없어야 한다.
▶️ Cacheability
- 서버에서 보내주는 응답은 캐시 가능성에 대해서 표현해 주어야 한다.
- Cache-Control Header
▶️ Layered System
- 클라이언트가 서버에 요청이 도달하기까지의 과정을 알 필요 없고, 영향 받지도 않아야 한다.
▶️ Code On Demand (Optional)
- 실행 가능한 코드를 전달함으로서 일시적으로 클라이언트의 기능을 확장
- JavaScript와 브라우저