Pre Project 9-5

Note L·2023년 4월 23일
0

Caused by: org.h2.jdbc.JdbcSQLDataException: Value too long for column "BODY CHARACTER VARYING(255)": "'<div data-language=""javascript"" class=""toastui-editor-ww-code-block-highlightin... (351)"; SQL statement: 에러

클라이언트 측에서 코드블럭을 이용해서 POST, PATCH등의 요청을 보낼 경우에는 indentation이나 줄바꿈 프로그래밍언어 특성상 많은 글자수를 차지한다. 문제는 우리 백엔드개발자가 처음에 엔티티클래스를 만들때 @Column해놓고 별도의 속성값을 추가하지 않으면 최대글자수가 varchar(255)로 세팅된다.
그래서 저런 에러가 뜨는 것이다. 그럼 어떻게 해결할까?

해결

엔티티클래스에서 String 타입의 필드 이를테면 유저가 직접 입력해서
등록하고 수정하는 Question의 body 혹은 Answer의 content같은 경우에는 엔티티클래스에서 @Column(length = n)이렇게 애초에 설정해준다.

주의 : length를 얼마로 하건 자유이지만 너무 큰 수 이를테면 10000등으로 설정하면 sql 쿼리발생시 성능저하가 일어나니 적당한 길이로 세팅하라!


클라이언트 측에서 질문 PATCH요청시 POST때 썼던 details가 방해됨 그에따라 PATCH요청하면 400 에러가 뜸

해결

Question 엔티티클래스에서 details 컬럼을 아예삭제했다. 즉 테이블 구조를 변경했다. 그리고 관련된 QuestionDto.Post와 uestionDto.Patch 클래스 또한 유저로부터 details를 받을 필요가 없도록 삭제했다.


현재 문제

질문이건 답변이건 생성일 수정일 내용물은 있지만 정작 포스트를 쓴
유저는 없고 따라서 정보도 없는 상황 어떻게 유저 정보를 질문과 답변에 넣을 수 있을까?

해결 알고리즘

  1. 질문과 답변을 등록하기 전에 먼저 멤버를 등록해야 한다.

  2. 질문과 답변 등록시 멤버가 직접 자신을 식별할 수 있는
    정보(즉 유니크한 필드)를 요청바디에 적어넣도록 해야 한다.

  3. 뭐가 있을까?
    email을 요청바디에 넣는다면 멤버는 '아 뭐 내 이메일로 다른 유저의 답변을 받을 수도 있겠네'라고 생각할터이니 email이 자연스럽다. displayName을 써 넣으라고 멤버에게 말한다면 '뭐야 내가 설정한 닉네임 모르나 왜 귀찮게 닉네임 또 써 넣으래?'라며 UX UI를 저하시킬 수 있다.

  4. 그럼 이제 실전 MemberRepository에 있는 findByEmail()메소드를 활용해보자

    MemberService.java에서

    이렇게 메서드를 구분시켰다.

  5. QuestionController와 AnswerController에서
    PostMapping시 첫줄에 먼저 등록요청이 존재하는 회원에 의한 것인지 확인이 필요

    (이메일따위야 다른 유저의 것을 봐뒀다가 도용해서 요청바디로 날리면 보안의 의미가 없지 따라서 지금 기능과 과정은 이후 스프링 시큐리티로 완전해질것임)

profile
Flying books in the library are getting apart and then merging

1개의 댓글

comment-user-thumbnail
2023년 6월 23일

Thanks for this! :)

답글 달기