[TIL#29] 가을에 시작한 Spring <시간을 (Timestamp, LocalDateTime) Json 으로 request, response 하기>
간략하게 둘을 비교하자면, 둘 다 시간을 나타낸다는 공통점을 가진 데이터 타입이다. 표기할 수 있는 시간의 범위와 표기 형태가 자잘하게 다르지만 Timestamp와 Datetime의 가장 큰 차이점은 timezone의 정보의 유무이다.
'직렬화(=Serialization)' 는 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터 형태로 바꾸는 것이다. 직렬화 사용이유는 객체 자체를 영속적으로 보관할때 사용하는데 파일형태로 저장되어 네트워크를 통해 전송이 가능합니다.
반대로 데이터스트림으로부터 데이터를 읽어 객체를 생성하는 것은 '역직렬화(=Deserialization)' 이다.
이해를 제대로 한 것은 아니지만 현 시점에서는 이렇게 이해하고 있다. 이점을 유의하고 아래의 코드를 보자.
서비스 사용자(=Client) 가 서비스 제공자(=Server) 로 요청을 보내는 경우이다. 해당 요청을 받은 서버는 단순히 해당 RequestDto 를 통해 받아오는 데이터를 사용하기 위해서 객체화시켜야한다. 하여 역직렬화가 필요한 상황이다.
하지만 보면 특이한 점이 있다. Timestamp 의 경우 따로 직렬화를 해주지 않아도 잘 작동한다. 이유는 추후에 알아보자.
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class UpdateCardPeriodRequestDto {
@NotNull(message = "yyyy-MM-dd HH:mm:ss 형태로 입력해주세요.")
private Timestamp startedAt;
@NotNull(message = "yyyy-MM-dd HH:mm:ss 형태로 입력해주세요.")
private Timestamp closedAt;
@JsonSerialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "E, dd MMM yyyy HH:mm:ss z", timezone = "GMT+2")
private LocalDateTime createdAt;
@JsonSerialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "E, dd MMM yyyy HH:mm:ss z", timezone = "GMT+2")
private LocalDateTime updatedAt;
}
서비스 제공자(=Server)가 서비스 사용자(=Client)가 전해준 Request 로 받은 데이터 혹은 요청들을 처리한 다음 다시 서비스 사용자(=Client) 에게 돌려주는 상황이다. 처리된 데이터를 서비스 사용자(=Client) 에게 전달해줘야 하는 상황이다.
따라서 직렬화(=Deserialization) 가 사용된다. 직렬화를 해야지 네트워크를 통해 데이터가 전달될 수 있기 때문이다.
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UpdateCardPeriodResponseDto {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "E, dd MMM yyyy HH:mm:ss z", timezone = "GMT+2")
private Timestamp startedAt;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "E, dd MMM yyyy HH:mm:ss z", timezone = "GMT+2")
private Timestamp closedAt;
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "E, dd MMM yyyy HH:mm:ss z", timezone = "GMT+2")
private LocalDateTime createdAt;
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "E, dd MMM yyyy HH:mm:ss z", timezone = "GMT+2")
private LocalDateTime updatedAt;
}
현재 직렬화 역직렬화의 개념이 정립이 되지 않은 상태이기에 많이 불안한 상황이다. 그럼에도 최대한 이해하려고 적용시켰기 때문에 추후에 다시 다뤄볼 예정이다.
[TIL#25-2] 가을에 시작한 Spring <PLUS 복습> (0) | 2023.12.19 |
---|---|
[TIL#25-1] 가을에 시작한 Spring <PLUS 복습> (0) | 2023.12.15 |
[TIL#24] 가을에 시작한 Spring <Transactional / FetchType.LAZY or EAGER / cascade> (0) | 2023.12.12 |
[TIL#23] 가을에 시작한 Spring <IoC/DI> (0) | 2023.11.28 |
[TIL#21] 가을에 시작한 Spring <ERD 작성> (0) | 2023.11.16 |