뷰
페이지를 만들고 자바스크립트
코드로 REST API
호출하기.API
document.querySelector()
addEventListener()
fetch()
뷰
페이지 구성._list
)_new
)_comments
)부트스트랩
-> card
_new.mustache
<div class="card m-2" id="comments-new">
<div class="card-body">
</div>
</div>
class="card m-2"
id="comments-new"
댓글 작성 폼
부트스트랩
-> forms
_new.mustache
<div class="card m-2" id="comments-new">
<div class="card-body">
<!-- 댓글 작성 폼 -->
<form>
<!-- 닉네임 입력 -->
<div class="mb-3">
<label class="form-label">닉네임</label>
<input type="text" class="form-control" id="new-comment-nickname">
</div>
<!-- 댓글 본문 입력 -->
<div class="mb-3">
<label class="form-label">댓글 내용</label>
<textarea type="text" class="form-control" rows="3" id="new-comment-body"></textarea>
</div>
<!-- 히든 인풋 -->
{{#article}}
<input type="hidden" id="new-comment-article-id" value="{{id}}">
{{/article}}
<!-- 전송 버튼 -->
<button type="button" class="btn btn-primary" id="comment-create-btn">댓글 작성</button>
</form>
</div>
</div>
닉네임 입력
<input>
요소의 속성을 type="text"
, id="new-comment-nickname"
.댓글 본문 입력
<input>
대신 여러 줄을 입력할 수 있는 <textarea></textarea>
로 작성.히든 인풋
히든 인풋(hidden input)
mustache
문법으로 변수의 사용 범위를 지정. ({{#article}}..{{/article}}
)댓글 작성
버튼을 눌렀을 때 댓글이 입력되도록 자바스크립트로 구현._new.mustache
파일의 코드에서 제일 밑에 작성.웹 페이지
에서도 자바스크립트
를 사용하면 REST API
를 호출할 수 있음._new.mustache
<!-- 댓글 작성하기 -->
<script>
{
// 댓글 생성 버튼 변수화.
const commentCreateBtn = document.querySelector("#comment-create-btn");
commentCreateBtn.addEventListener("click", function () {
console.log("버튼을 클릭했음.");
});
}
</script>
querySelector()
메서드.특정 요소
를 선택할 때 사용함.id
, name
, class
, HTML
태그 등의 값을 입력하면 해당 속성 값을 가진 대상을 반환함.id
값으로 대상을 찾을 때는 id 값 앞에 #
을 붙임.아이디 선택자(#id)
라고 함.댓글 작성 버튼
의 id값인 comment-create-btn
을 #
과 함께 입력
하고, 댓글 작성 버튼을 상수(const)
타입의 commentCreateBtn
변수에 저장.// 해당 id 값을 가진 요소를 찾아 변수에 저장.
// 형식.
자료형 변수명 = document.querySelector("#id값");
addEventListener()
메서드.특정 요소
가 이벤트를 감지함.이벤트
가 발생
하면 지정된 함수
를 실행
함.commentCreateBtn
)을 클릭(click
)했을 때 함수(function
)를 실행하도록.// 이벤트가 감지되면 이벤트 처리 함수 실행.
// 형식.
요소명.addEventListener("이벤트 타입", "이벤트 처리 함수)
자바스크립트
객체로 만들어서 출력.자바스크립트
에서 객체
를 만드는 3
가지 방법.
객체 리터럴
방식.생성자 함수
방식.Object.create()
방식.객체 리터럴 방식으로 처리.
객체 리터럴(object literal) 방식
// 형식.
var object = {
key1: value1,
key2: value2,
...
}
<div class="card m-2" id="comments-new">
<div class="card-body">
(생략)
<input type="text" class="form-control" id="new-comment-nickname">
(생략)
<textarea type="text" class="form-control" rows="3" id="new-comment-body"></textarea>
(생략)
<input type="hidden" id="new-comment-article-id" value="{{id}}">
(생략)
</div>
</div>
<!-- 댓글 작성하기 -->
<script>
{
// 댓글 생성 버튼 변수화.
const commentCreateBtn = document.querySelector("#comment-create-btn");
commentCreateBtn.addEventListener("click", function () {
// 새 댓글 객체 생성.
const comment = {
// 새 댓글 닉네임.
nickname: document.querySelector("#new-comment-nickname").value
// 새 댓글 본문
, body: document.querySelector("#new-comment-body").value
// 부모 게시글 id
, articleId: document.querySelector("#new-comment-article-id").value
};
console.log(comment);
});
}
</script>
상수
타입의 comment 변수를 선언하고 nickname
, body
, articleId
키를 정의함.querySelector()
메서드로 가져옴.객체
가 생성
된 것을 확인할 수 있음.fetch()
함수는 웹 페이지
에서 HTTP
통신을 하는 데 사용함.GET
, POST
, PATCH
, DELETE
같은 요청을 보내고 응답을 받을 수 있음.// 형식. (Ex. POST일 경우)
fetch('API 주소', {
method: "POST" // 요청 메서드 (GET, POST, PATCH, DELETE)
, headers: { // 헤더 정보.
"Content-Type": "application/json"
},
body: JSON.stringify(객체) // 전송 데이터.
}).then(response => { // 응답을 받아 처리하는 구문.
// 응답 처리문.
});
fetch()
함수.첫 번째
전달값에는 API
주소가 들어감.두 번째
전달값에는 요청 메서드(method)
, 헤더 정보(header)
, 전송 본문(body)
이 들어감.JSON
형태로 보내야 하므로 JSON.stringify()
함수에 객체
를 전달해서 JSON형태
로 변환
함.응답 객체
인 response
를 받음.response
안에는 응답에 관한 정보가 들어있음.const url = "/api/articles/" + comment.articleId + "/comments";
댓글 생성 API 주소
를 저장.API 주소
에서 부모 게시글의 id
는 매번 바뀌므로 comment.articleId
로 작성하고 +
연산자를 이용해서 앞뒤 주소와 연결.// 비동기 통신을 위한 API - fetch()
fetch(url, {
method: "POST"
, headers: { // 전송 본문의 데이터 타입(JSON) 정보
"Content-Type": "application/json"
},
body: JSON.stringify(comment) // comment 객체를 JSON 문자열로 변환해서 전송.
});
첫 번재
전달값으로 API 주소
를 가지고 있는 url을 넘김.두 번째
전달값으로 요청 메서드
, 헤더 정보
, 전송 본문
을 넘김.헤더 정보
에는 전송 본문
의 데이터 타입이 JSON
임을 명시하는 내용이 들어감.
body: JSON.stringify(comment)
}).then(response => {
// HTTP 응답 코드에 따른 메시지 출력.
const msg = response.ok ? "댓글이 등록됐음." :"댓글 등록 실패!";
alert(msg);
// 페이지 새로 고침.
window.location.reload();
});
response
는 API 요청을 보내고 받은 응답 객체
.상태
가 ok면 전자, 아니면 후자를 msg변수에 저장한 후 alert()
함수로 출력
함.window.location.reload();
으로 웹 페이지를 새로 고침.