캐싱해서 사용하는게 AWS 서버로 배포할 때, 돈이 적게 든다.
form 태그를 사용하면 때리고 나서 자동으로 location.reload 가 된다.


void 타입으로 설정하면 → url 주소 = 파일명으로 인식해서 찾는다.
( → test/reply 라는 정적 소스가 없어서 못찾음)

디버깅을 해보니 requestURI가 /test/reply 로 들어온 것을 확인할수있다.
템플릿 엔진을 쓰는 이유는 거기에 html 코드랑 자바코드를 적으라는 것 !
→ 응답할 때 return 다음에 html이랑 자바 코드를 적어서 화면을 return 할 수 있지만 “파일”로 return 하는게 편해서 파일을 리턴한다.
→ 이게 훨씬 편하다!
→ 그래서 우리도 지금 응답할 때 mustache 파일을 응답하도록 해두었다.
댓글 등록 시작.

- form 태그는 부분 리로드를 할 수 없으니 form 태그로 요청하지 않을 것이다. → 기존 속성들을 지운다. 이제 name도 필요없음
- 자바스크립트에서는 태그를 id로 찾으니까 name → id 로 바꿔줌.
- button의 타입은 submit으로 하면 리로드 되니까 button으로 바꿔준다.

무슨 데이터를 들고갈지 “객체”를 보고 판단한다.
지금 댓글 등록을 할건데,
id는 auto_increment 로 생성해 쓰니까 패스.
comment는 클라이언트가 입력한 거 들고가야하니까 필요함.
board는 댓글 저장할 때 어떤 board에 작성했는지 id가 필요하니까 필요함.
user는 클라이언트가 입력한 값이 아닌 session의 정보를 꺼내서 넣어줄 거기때문에 뷰에서 넘길 필요가 없음.
→ User 정보는 무조건 session에서 가져와야 한다!
createdAt도 등록할때 now() 해주면 되니 패스.
결론 :
user는 세션의 user를 넘기면 되니까 board, comment를 넘기자 !

boardId와 comment를 넘길 수 있도록 해당 form안의 코드를 수정.작성함.

input 의 value = 5, div data-boardId = 5 —> id 와 data-set의 값이 잘 설정된 것을 볼 수 있다.
input type hidden 과 아래의 data-set이 잘 작동하는지 확인해보자.

data-boardId 라고 적으니 카멜표기법이 안돼서 undefined가 뜸.
data-set → hello 로 바꿔주고, 아래 div의 id랑 input 의 id가 겹치니까
아래 id는 boardId2로 바꿔준다. → ( id 겹쳐도 에러남 주의 )
++


data-boardId 이렇게 카멜 표기법을 사용하면

data-set의 값이 제대로 넘어가지 않아서 변수안에 undefined가 들어감.

data() 안에 들어갈 건 key ( 순수 자바스크립트에서는 dataset. 뒤에 key를 적어준다 )
→ 스크립트에 이렇게 적어서 실행해보면
( 위의 let boardId 는 제이쿼리를 사용해 작성한 것이고
아래 let boardId2는 순수 자바스크립트로 작성한 것 )


해당 data-set의 value가 alert창이랑 console에 잘 나온다 : )

이 값이 나오는 거임
“HTML에 데이터를 심어두고 싶을때”는
- Input type hidden
- data-set
2가지 중 선택해서 쓴다 : )
( 이전에 data-set w3schools 에서 연습할 수 있는거 링크 포스팅에 걸어놨는데 못찾겠다. )
data-set
jQuery
에서 data()
메소드를 사용하면 HTML 요소에 데이터를 저장하거나 해당 데이터를 가져올 수 있습니다. data()
메소드는 DOM 요소에 메타 데이터를 저장하는 기능을 제공합니다.기본 사용법- 데이터 저장하기:
data()
메소드를 사용해 특정 데이터 키와 값을 설정할 수 있습니다.
- 데이터 가져오기:
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'
d
ata-*
속성은 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’;
이런식으로 사용한다.
ㄴ

최종작성된 코드
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이 완성되기 전에 그 값을
여기서 가지고 있음
컨트롤러

여기 save()의 매개변수로 String comment, Integer BoardId
이렇게 이제 못받는다 → JSON으로 던지는건 이렇게 못받음

reply 패키지 안에 ReplyRequest 만들어주기

요청 DTO에서 insert(save) 하는건 안에 ToEntity 만들어주기.
→ 순수한 비영속 객체를 만들어서 집어넣기만 하면 되기 때문에
insert(save) 인 경우에만! toEntity를 만들어준다.
→ 문제는 user에 sessionUser를 넣어야 하고,
board()안에는 board객체를 넣어야 한다는 것.

toEntity 만들때 .builder() 에러남
cannot find symbol
→ method builder()가 Reply 에 없다!

→ Reply 객체에 builder가 없어서 toEntity 에 사용할라면 추가해주기

작성하고 ( 일단 user랑 board는 null 을 넣어둠 )
컨트롤러


null값이나 ok만 return하면 CSR로 그림그릴때 id=”reply-3” 이렇게
pk를 걸지 못한다.
( →그럼 나중에 삭제가 불가능. id에서 pk를 뽑아서 delete를 요청할 것이기 때문)
→ 그래서 save하고 save한 정보를 받아서 컨트롤러에서 return 할 때 돌려줘야 한다.
return null 아니면 return

ALT + ENTER 하면 매서드 생성 됨
마이바티스에서 방금 들어간 값을 찾으려면 MAX값을 찾아서 좀 복잡하게 해야하는데
JPA는 바로 return 해줘서 replyPS로 받으면 된다 : )

( @Transactional 붙이기 )
replyPS로 받아서 return 해도 되고 ,
reply에 저장한게 담겼으니까 reply를 return 해도 같음. 같은 객체

완성 : )

컨트롤러.
근데 지금 ReplyPS를 return 하면 Reply객체에
@JsonIgnoreProperties
를 걸어주지 않는이상 터진다.→ 또 엔티티로 응답하면 그 안에 필요없는 데이터를 많이 넘기는건데,
지금 detail에서필요한게 3개 ? 이니
ReplyResponse를 만들어서 return 하기 !

++
만약 ReplyResponse에 isOwner도 같이 넣어서 만들거면
내가 인증을 거쳐서 save하고 지금 return 하는 거기때문에
isOwner는 무조건 true !

서비스에서
ReplyResponse.DTO(reply);
return 하도록 수정
컨트롤러도 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 해야함 )
이제 컨트롤러까지 완성했으니
뷰의 댓글등록 부분 수정해보자

onclick 추가
매서드 이름만들때 동사+명사로 만드는지 이런거 팀의 컨벤션이니까 지키기!

자바스크립트 객체로 만들어야지 JSON으로 컨버팅하는게 편하다.
data-set 을 안한 이유가 hidden으로 하면
일관성 있고 깔끔하게
reply 자바스크립트 객체를 만들 수 있어서 이다!

fetch url은 가능한 `` 백틱으로 감싸기
문법 모르겠으면 구글에서 fetch post 사용법 이라고 검색해서 보고 쓰기!
PUT과 POST 를 보낼때는 보낼 데이터의 타입을 컨텐츠 타입으로 적어준다.
GET요청에서 사용하는 쿼리스트링같은거는 쿼리의 WHERE절에 걸려고 하는거니 insert 하는 데이터가 아니라서 해당없음

기다렸다가 받아야 하니까 await 걸어주고
promise로 받을거 아니니까 async 적어주기
++
post랑 put은 변경된 데이터를 return 해줘야한다.

responseBody 찍어보기

잘 나옴

중긴에 SyntaxError 에러 났는데
콘솔에 확인해보니 널포인트 익셉션이 발생.


ReplyRequest 에 toEntity에 user랑 board를 null로 적어놔서 터짐
내가 제어하지 않은 에러가 터지게 됨
디버깅 하는 방법에는 여러가지가 있다.
1
- 사이사이에 1, 2, 3 숫자 넣어서 실행되는지 확인하기
→ 숫자가 콘솔에 안나오면 그 이전 코드에서 터진거
- IDE 디버깅 모드로 디버깅 하기
→

3번 디버깅 모드로 실행시키면

로그인 안하고 댓글 작성하기를 클릭했을 때
→ 이 부분에서 sessionUser 가 null 이 전달 된 것을 확인할 수 있다.
→ 이렇게 디버깅 모드로 값이 제대로 전달되었는지 아닌지 sout
안찍어보고 확인할 수 있다.

로그인 하고 댓글 등록 때렸을 때
→ 이 부분에서 sessionUser가 들어가서 값이 들어와있는 걸 확인할 수 있다.
→ 뒤에 해결되지 않은 에러가 있으니 계속해서 step over로 내려가보자
→ replyService의 댓글쓰기 쪽이 의심될때는 replyService.댓글쓰기
줄에서 Step Into 해서 들어가면 안으로 들어갈 수 있다.

댓글쓰기 매서드 안에 미리 break포인트를 찍어두었으면 거기로 이동한다.

ReplyRequest 안 toEntity 매서드 안에 미리 break Point를 찍어 두었고, .user 와 .board 안에 null을 적어둔 것을 발견할 수 있었다.
정상적으로 로그인했으면 여기서 터졌을 거고,
sessionUser 와 board 가 정상적인 값이 넘어왔는데
여기서 안 들어간 것을 확인해서 디버깅 했을 것이다!
- invoke 호출하다.

매개변수로 전달된 값을 제대로 넣어준다
모든 익셉션은 내가 컨트롤 할 줄 알아야 한다.

댓글 아이템 부분 코드 `` 벡틱 안에 넣어줌
→ 이제 이건 템플릿엔진 부분이 아니니까 $로 고쳐줌

잘 만들어줌
prepend 해줌 : )

박스를 찾아서 prepend 해주는 데 박스에 id 가 없어서 id 넣어줌

그부분에 prepend하고 textarea 값을 “” 공백으로 바꿔준다.
이제 등록하면 잘 된다.
Share article