210521 금 TIL

bongf·2021년 5월 21일
0

TIL

목록 보기
34/40

✔ Done

  • 프로젝트 : DB 설계
    • JSON으로 LOCALDATE를 통신하는 방법을 알게되었다.
    • MySQL의 VARCHAR 데이터 타입에 대해 더 잘 알게되고 언제 이를 써야할지 고민할 수 있게 되었다.
    • 원시타입과 래퍼 클래스의 차이에 대해 복습했다.

📂 Feeling

Good

  • 실습하면서 알게된 것을 정리하면서 다시 복습했다.

Bad

  • 정리하는데 시간이 많이 걸렸다.

🗒 Learned

1) DTO에서 LocalDate 혹은 LocalDateTime을 사용할 경우

1.1) 문제

  • json으로 데이터를 받아서 이를 LocalDate로 선언한 필드에 저장하고 싶었지만 형식이 맞지 않는다며 저장이 되지 않았다.

1.2) 해결방안 출처

1.2) 해결방안1) @DatetimeFormat

  • 스프링 문서
  • 필드나 메서드 파라미터가 date나 time으로 포매팅 되어야 한다고 하는 어노테이션이다
Declares that a field or method parameter should be formatted as a date or time.
  • pattern 옵션으로 원하는 형식을 지정한다.
  • form data로 전송시 아래와 같이 입력해 주면 잘 들어오는 것을 확인해줄 수 있다.

1.3) 해결방안2) JSON으로 통신시 @JsonFormat 사용

  • 에는 다시 입력한 형식을 받을 수 없다는 에러가 났다. JSON으로 이런식으로 보내고 있었다.
  • JSON으로 request 받거나 response를 보낼 경우에는 @JsonFormat을 사용한다
    • 위에 표기된 출처 블로그 (창천항로님) 보면 아래와 같이 설명되어 있다.
    @JsonFormat은 Jackson의 어노테이션이고, @DateTimeFormat은 Spring의 어노테이션입니다.

1.4) 보충 이동욱님 블로그 정리된 내용

  • 창천항로님 블로그에 정리된 내용에 따르면 아래와 같다고 한다.

Get요청시에는 @DateTimeFormat

Post 요청, ResponseBody에서는 @JsonFormat

Post 요청시에도 @DateTimeFormat이 적용될 수 있으나, @JsonFormat이 지정되어 있지 않을때만 가능하다.

1.5) 이동욱님 블로그 내용 직접 해보니까

  • 실제로 몇가지 실습을 해보니
    • Get요청시 @JsonFormat을 적용했더니 요청을 가져오지 못했다.
    • Post요청에 JSON으로(@RequestBody) 받는 경우 @JsonFormat과 @DateTimeFormat 이 모두 가능했다.
    • 응답시에 이렇게 데이터를 넣고 반환했을 때
      • @JsonFormat을 붙여주지 않은 경우
      • @JsonFormat을 붙여준 경우
      • 이렇게 postman으로 결과 확인시에는 차이 없이 똑같이 들어왔는데 혹시 iOS에서는 다른 결과로 들어오는지 한 번 확인해봐야겠다.

2) VARCHAR

2.1) 최대 바이트 65,535 bytes

  • 최대길이는 65,535 bytes
    • 이전에는 더 작았는데 버전업이 되면서 올라갔다.

      The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among all columns)

2.2) VARCHAR는 길이에 대한 정보를 저장

  • VARCHAR가 CHAR와 다른 점은 길이에 대한 정보도 저장한다.

    In contrast to CHAR, VARCHAR values are stored as a 1-byte or 2-byte length prefix plus data.

2.3) VARCHAR는 가변

  • VARCHAR가 CAHR와 또 다른 점은 입력되는 길이에 따라서 저장공간이 달라진다는 것이다 (가변)

2.4) VARCAHR 최대길이 21843글자 (utf8사용)

  • VARCHAR() 에서 이 ()안에 들어가는 것은 글자수다

    • VARCHAR(45)는 45글자
    • 그래서 SQL문으로 (65,535 bytes라고 했을 때 길이에 대한 바이트 빼고 655532로 저장할 경우) 에러가 난다.
    • 한 글자당 3바이트 필요한 utf8
  • 그런데 위에서 길이에 대한 정보를 저장할 공간이 필요하므로

    • ( 65535 / 3 ) - 2 정도의 공간 21843 글자 최대
  • 어차피 한 row에 대한 최대 사이즈가 65535 이다. text는 가변이 아니라 고정이라 성능 떄문에 text를 쓰는 것 같다. (더 자세히 알아볼 필요) https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html

3) Wrapper vs primitive

profile
spring, java학습

0개의 댓글