카테고리 없음

day 44 TIL

dalooong 2023. 7. 9. 13:41

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와 브라우저