[Springboot] 22 댓글 등록 ( 디버깅 하는 방법 )

내용정리필요
김호정's avatar
Sep 13, 2024
[Springboot] 22 댓글 등록 ( 디버깅 하는 방법 )
 
캐싱해서 사용하는게 AWS 서버로 배포할 때, 돈이 적게 든다.
 

 
form 태그를 사용하면 때리고 나서 자동으로 location.reload 가 된다.
 
notion image
 
notion image
 
void 타입으로 설정하면 → url 주소 = 파일명으로 인식해서 찾는다.
( → test/reply 라는 정적 소스가 없어서 못찾음)
 
notion image
디버깅을 해보니 requestURI가 /test/reply 로 들어온 것을 확인할수있다.
 
템플릿 엔진을 쓰는 이유는 거기에 html 코드랑 자바코드를 적으라는 것 !
→ 응답할 때 return 다음에 html이랑 자바 코드를 적어서 화면을 return 할 수 있지만 “파일”로 return 하는게 편해서 파일을 리턴한다.
→ 이게 훨씬 편하다!
→ 그래서 우리도 지금 응답할 때 mustache 파일을 응답하도록 해두었다.
 

 
댓글 등록 시작.
 
notion image
  • form 태그는 부분 리로드를 할 수 없으니 form 태그로 요청하지 않을 것이다. → 기존 속성들을 지운다. 이제 name도 필요없음
  • 자바스크립트에서는 태그를 id로 찾으니까 name → id 로 바꿔줌.
  • button의 타입은 submit으로 하면 리로드 되니까 button으로 바꿔준다.
 
 
notion image
무슨 데이터를 들고갈지 “객체”를 보고 판단한다.
 
지금 댓글 등록을 할건데,
id는 auto_increment 로 생성해 쓰니까 패스.
comment는 클라이언트가 입력한 거 들고가야하니까 필요함.
board는 댓글 저장할 때 어떤 board에 작성했는지 id가 필요하니까 필요함.
user는 클라이언트가 입력한 값이 아닌 session의 정보를 꺼내서 넣어줄 거기때문에 뷰에서 넘길 필요가 없음.
→ User 정보는 무조건 session에서 가져와야 한다!
createdAt도 등록할때 now() 해주면 되니 패스.
 
결론 :
user는 세션의 user를 넘기면 되니까 board, comment를 넘기자 !
 
 
notion image
boardId와 comment를 넘길 수 있도록 해당 form안의 코드를 수정.작성함.
 
notion image
input 의 value = 5, div data-boardId = 5 —> id 와 data-set의 값이 잘 설정된 것을 볼 수 있다.
 
input type hidden 과 아래의 data-set이 잘 작동하는지 확인해보자.
notion image
data-boardId 라고 적으니 카멜표기법이 안돼서 undefined가 뜸.
data-set → hello 로 바꿔주고, 아래 div의 id랑 input 의 id가 겹치니까
아래 id는 boardId2로 바꿔준다. → ( id 겹쳐도 에러남 주의 )
 
++
notion image
notion image
data-boardId 이렇게 카멜 표기법을 사용하면
notion image
data-set의 값이 제대로 넘어가지 않아서 변수안에 undefined가 들어감.
 
notion image
data() 안에 들어갈 건 key ( 순수 자바스크립트에서는 dataset. 뒤에 key를 적어준다 )
→ 스크립트에 이렇게 적어서 실행해보면
( 위의 let boardId 는 제이쿼리를 사용해 작성한 것이고 아래 let boardId2는 순수 자바스크립트로 작성한 것 )
notion image
 
notion image
해당 data-set의 value가 alert창이랑 console에 잘 나온다 : )
notion image
이 값이 나오는 거임
 
“HTML에 데이터를 심어두고 싶을때”
  1. Input type hidden
  1. data-set
2가지 중 선택해서 쓴다 : )
 
( 이전에 data-set w3schools 에서 연습할 수 있는거 링크 포스팅에 걸어놨는데 못찾겠다. )
 
 
data-set
 
jQuery에서 data() 메소드를 사용하면 HTML 요소에 데이터를 저장하거나 해당 데이터를 가져올 수 있습니다. data() 메소드는 DOM 요소에 메타 데이터를 저장하는 기능을 제공합니다.기본 사용법
  1. 데이터 저장하기data() 메소드를 사용해 특정 데이터 키와 값을 설정할 수 있습니다.
  1. 데이터 가져오기data() 메소드를 사용해 요소에 저장된 데이터를 가져올 수 있습니다.
1. 데이터 저장하기
javascript // 특정 요소에 데이터를 저장하는 방법 $('#myElement').data('key', 'value');
위 코드는 #myElement라는 요소에 key라는 데이터에 'value'라는 값을 저장합니다.2. 데이터 가져오기
javascript // 특정 요소에서 데이터를 가져오는 방법 var value = $('#myElement').data('key'); console.log(value); // 'value'
이 코드는 #myElement에 저장된 key 데이터를 가져옵니다.3. 여러 데이터 저장하기
javascript $('#myElement').data({ key1: 'value1', key2: 'value2', key3: 'value3' });
이 코드는 한 번에 여러 개의 데이터를 저장하는 예제입니다.4. HTML5 data-* 속성과의 연동HTML5의 data-* 속성과 jQuery의 data() 메소드를 함께 사용할 수도 있습니다.
html <div id="myElement" data-key="initialValue"></div> javascript
// 이미 HTML에 정의된 data-* 속성을 가져올 수 있습니다. var value = $('#myElement').data('key'); console.log(value); // 'initialValue'
data-* 속성은 data() 메소드로도 접근이 가능하며, 그 값을 가져올 수 있습니다.5. 데이터 제거하기removeData() 메소드를 사용하여 요소에 저장된 데이터를 제거할 수 있습니다.
javascript $('#myElement').removeData('key');
위 코드는 #myElement에서 key 데이터를 제거합니다.이것이 기본적인 jQuery의 data() 메소드 사용법입니다.나의 말:순수 자바스크립트로는?ChatGPT의 말:ChatGPT순수 자바스크립트에서는data-* 속성을 직접 사용하여 데이터를 저장하고 가져올 수 있습니다. HTML5에서는data-* 속성을 통해 사용자 정의 데이터를 HTML 요소에 저장할 수 있습니다. 이를 이용한 순수 자바스크립트 사용 방법을 설명하겠습니다.1. 데이터 저장하기 (setAttribute 사용)data-* 속성을 사용하여 데이터를 저장할 수 있습니다.
html <div id="myElement"></div> javascript
// 데이터를 저장하는 방법 var element = document.getElementById('myElement'); element.setAttribute('data-key', 'value');
위 코드는#myElement에 data-key="value" 속성을 추가합니다.2. 데이터 가져오기 (getAttribute 사용)저장된 데이터를 가져올 때는 getAttribute() 메소드를 사용합니다.
javascript // 데이터를 가져오는 방법 var value = element.getAttribute('data-key'); console.log(value); // 'value'
3. dataset 사용HTML5에서 도입된 dataset 속성은 data-* 속성에 더 간편하게 접근할 수 있도록 합니다. dataset은 자동으로 data-* 속성을 읽고, 객체 형태로 반환합니다.데이터 저장하기
javascript // dataset을 사용하여 데이터 저장하기 element.dataset.key = 'value';
위 코드는 #myElement에 data-key="value"를 추가합니다.데이터 가져오기
javascript // dataset을 사용하여 데이터 가져오기 var value = element.dataset.key; console.log(value); // 'value'
4. 여러 데이터 저장 및 가져오기HTML 요소에 여러 data-* 속성을 추가하고, 이를 통해 여러 데이터를 저장 및 가져올 수 있습니다.
html <div id="myElement" data-key1="value1" data-key2="value2"></div> javascript
// dataset을 사용하여 여러 데이터 접근 var element = document.getElementById('myElement'); console.log(element.dataset.key1); // 'value1' console.log(element.dataset.key2); // 'value2' // 데이터를 수정하기 element.dataset.key1 = 'newValue1'; console.log(element.dataset.key1); // 'newValue1'
5. 데이터 제거하기 (removeAttribute 사용)데이터 속성을 제거하려면 removeAttribute() 메소드를 사용할 수 있습니다.
javascript // 데이터 제거하기 element.removeAttribute('data-key');
이 코드는 data-key 속성을 제거합니다.요약
  • 데이터를 저장할 때는 setAttribute() 또는 dataset을 사용합니다.
  • 데이터를 가져올 때는 getAttribute() 또는 dataset을 사용합니다.
  • 데이터를 제거할 때는 removeAttribute()를 사용합니다.
이 방식으로 순수 자바스크립트에서 데이터를 처리할 수 있습니다
 
++
순수 자바스크립트로 쓰려면
element.dataset.key = ‘value’;
이런식으로 사용한다.
notion image
 
최종작성된 코드
 
data-set div 제거함
 
+) 왜 data-set 말고 hidden을 사용해서 boardId값을 심어두었나 ?
→ <Input type hidden> 으로 들어가 있어야
자바스크립트에서 comment랑 같이 보낼 수 있으니까!
우리는 board_id를 comment랑 같이 자바스크립트 객체에
같이 담아서 JSON으로 바꿔서 보낼거니까,
boardId를 Input type hidden 으로 넣어두자!
 
추가로 model.id 는 서버쪽에서 실행&렌더링 되어서 오니까
model.id가 먼저 실행되어 mustache dom이 완성되기 전에 그 값을
여기서 가지고 있음
 
컨트롤러
notion image
여기 save()의 매개변수로 String comment, Integer BoardId
이렇게 이제 못받는다 → JSON으로 던지는건 이렇게 못받음
 
notion image
 
reply 패키지 안에 ReplyRequest 만들어주기
 
notion image
 
요청 DTO에서 insert(save) 하는건 안에 ToEntity 만들어주기.
→ 순수한 비영속 객체를 만들어서 집어넣기만 하면 되기 때문에
insert(save) 인 경우에만! toEntity를 만들어준다.
→ 문제는 user에 sessionUser를 넣어야 하고,
board()안에는 board객체를 넣어야 한다는 것.
notion image
toEntity 만들때 .builder() 에러남
cannot find symbol
→ method builder()가 Reply 에 없다!
 
notion image
→ Reply 객체에 builder가 없어서 toEntity 에 사용할라면 추가해주기
 
 
 
notion image
 
작성하고 ( 일단 user랑 board는 null 을 넣어둠 )
 
컨트롤러
notion image
notion image
null값이나 ok만 return하면 CSR로 그림그릴때 id=”reply-3” 이렇게
pk를 걸지 못한다.
( →그럼 나중에 삭제가 불가능. id에서 pk를 뽑아서 delete를 요청할 것이기 때문)
→ 그래서 save하고 save한 정보를 받아서 컨트롤러에서 return 할 때 돌려줘야 한다.
 
return null 아니면 return
 
notion image
ALT + ENTER 하면 매서드 생성 됨
 
마이바티스에서 방금 들어간 값을 찾으려면 MAX값을 찾아서 좀 복잡하게 해야하는데
JPA는 바로 return 해줘서 replyPS로 받으면 된다 : )
notion image
( @Transactional 붙이기 )
 
replyPS로 받아서 return 해도 되고 ,
reply에 저장한게 담겼으니까 reply를 return 해도 같음. 같은 객체
 
notion image
 
완성 : )
 
notion image
컨트롤러.
 
 
근데 지금 ReplyPS를 return 하면 Reply객체에 @JsonIgnoreProperties 를 걸어주지 않는이상 터진다.
 
→ 또 엔티티로 응답하면 그 안에 필요없는 데이터를 많이 넘기는건데,
지금 detail에서필요한게 3개 ? 이니
ReplyResponse를 만들어서 return 하기 !
댓글아이템에 필요한게 3개
댓글아이템에 필요한게 3개
 
++
만약 ReplyResponse에 isOwner도 같이 넣어서 만들거면
내가 인증을 거쳐서 save하고 지금 return 하는 거기때문에
isOwner는 무조건 true !
 
 
notion image
서비스에서 ReplyResponse.DTO(reply); return 하도록 수정
 
notion image
컨트롤러도 ReplyResponse.DTO를 return 하도록 수정 : )
 
회사가도 RestAPI 사용할 때 공동응답DTO를 만들어서 return 한다.
 
 
AJAX로 통신할 때는 무조건 JSON으로 주고 받는게 표준!
JSON을 주고 받을땐 DTO를 만들어서 담아주면 된다.
 
어떤 데이터를 넣을지를 고민해야 함.
 
그리고 해야할게 인증체크. /API만 붙이면 인터셉터가 낚아채서 함.
sessionUser 은 무조건 가져오는게 아니라 save할 때 필요하니까 get함.

 
JPA는 INSERT를 하면 방금 넣은 객체를 동기화해주니까
MAXID를 찾을 필요가 없고, 바로 방금 insert 한 것을 돌려받을 수 있따!
 
 
마이바티스로 한거 선생님 깃허브에 topic브랜치에서 확인 할 수 있다.
얼마나 귀찮은지 확인해보기 : ) return new ReplyResponse.DTO(reply);
 
이렇게 dto로 응답해야지 양방향 매핑이든 레이지 로딩이든 jpa가 안 터짐
그리고 실제 목적은 화면에 필요한 데이터만 return 하려고 만든 것!
(→ entity를 return 하면 필요하지 않은 전체 데이터를 return 해야함 )
 
 
이제 컨트롤러까지 완성했으니
뷰의 댓글등록 부분 수정해보자
 
 
notion image
onclick 추가
 
매서드 이름만들때 동사+명사로 만드는지 이런거 팀의 컨벤션이니까 지키기!
 
 
notion image
 
 
자바스크립트 객체로 만들어야지 JSON으로 컨버팅하는게 편하다.
 
data-set 을 안한 이유가 hidden으로 하면
일관성 있고 깔끔하게
reply 자바스크립트 객체를 만들 수 있어서 이다!
 
 
notion image
 
fetch url은 가능한 `` 백틱으로 감싸기
문법 모르겠으면 구글에서 fetch post 사용법 이라고 검색해서 보고 쓰기!
 
PUT과 POST 를 보낼때는 보낼 데이터의 타입을 컨텐츠 타입으로 적어준다.
 
GET요청에서 사용하는 쿼리스트링같은거는 쿼리의 WHERE절에 걸려고 하는거니 insert 하는 데이터가 아니라서 해당없음
 
notion image
 
기다렸다가 받아야 하니까 await 걸어주고
promise로 받을거 아니니까 async 적어주기
 
++
post랑 put은 변경된 데이터를 return 해줘야한다.
 
notion image
responseBody 찍어보기
 
 
notion image
 
 
잘 나옴
notion image
중긴에 SyntaxError 에러 났는데
콘솔에 확인해보니 널포인트 익셉션이 발생.
notion image
notion image
ReplyRequest 에 toEntity에 user랑 board를 null로 적어놔서 터짐
 
내가 제어하지 않은 에러가 터지게 됨
 
디버깅 하는 방법에는 여러가지가 있다.
 
1
 
  1. 사이사이에 1, 2, 3 숫자 넣어서 실행되는지 확인하기
→ 숫자가 콘솔에 안나오면 그 이전 코드에서 터진거
 
  1. IDE 디버깅 모드로 디버깅 하기
 
notion image
3번 디버깅 모드로 실행시키면
 
 
notion image
로그인 안하고 댓글 작성하기를 클릭했을 때
→ 이 부분에서 sessionUser 가 null 이 전달 된 것을 확인할 수 있다.
→ 이렇게 디버깅 모드로 값이 제대로 전달되었는지 아닌지 sout
안찍어보고 확인할 수 있다.
 
notion image
로그인 하고 댓글 등록 때렸을 때
→ 이 부분에서 sessionUser가 들어가서 값이 들어와있는 걸 확인할 수 있다.
→ 뒤에 해결되지 않은 에러가 있으니 계속해서 step over로 내려가보자
→ replyService의 댓글쓰기 쪽이 의심될때는 replyService.댓글쓰기
줄에서 Step Into 해서 들어가면 안으로 들어갈 수 있다.
 
notion image
댓글쓰기 매서드 안에 미리 break포인트를 찍어두었으면 거기로 이동한다.
 
 
notion image
ReplyRequest 안 toEntity 매서드 안에 미리 break Point를 찍어 두었고, .user 와 .board 안에 null을 적어둔 것을 발견할 수 있었다.
 
정상적으로 로그인했으면 여기서 터졌을 거고,
sessionUser 와 board 가 정상적인 값이 넘어왔는데
여기서 안 들어간 것을 확인해서 디버깅 했을 것이다!
 
  • invoke 호출하다.
 
notion image
매개변수로 전달된 값을 제대로 넣어준다
 
 
 
모든 익셉션은 내가 컨트롤 할 줄 알아야 한다.
 
notion image
 
댓글 아이템 부분 코드 `` 벡틱 안에 넣어줌
 
→ 이제 이건 템플릿엔진 부분이 아니니까 $로 고쳐줌
 
notion image
 
잘 만들어줌
 
prepend 해줌 : )
notion image
박스를 찾아서 prepend 해주는 데 박스에 id 가 없어서 id 넣어줌
 
notion image
그부분에 prepend하고 textarea 값을 “” 공백으로 바꿔준다.
 
 
이제 등록하면 잘 된다.
 
 
Share article

keepgoing