async, await 에 대한 이해도가 떨어진 상태에서 무작정 쓰려다보니 발생한 문제였다.
기존에 짰던 코드는 이미 설계된 수정 코드 내부에서 짜다보니 async await을 신경쓰지 않고 짰다. 최종 코드와 구조는 매우 유사했으나 계속 오류가 나던 부분이 바로 이 때문이었다.
내가 이 문제를 해결하는 데에 가장 필요했던 개념은, await은 async 함수 안에서만 동작한다는 것.
그걸 모르고 그냥 냅다 async가 아닌 함수 내에 await을 넣어버리니 문제가 발생했던 것이다. 최종 코드를 조건문만 떼서 살펴보겠다.
// 패스워드가 일치할 경우
if (data.pw === needPwModi) {
// 수정할 댓글을 적을 textarea 생성
const textarea = document.createElement("input");
modiInput.placeholder = "수정할 댓글을 입력하세요";
modiInput.value = data.comment; // 기존 댓글이 수정할 textarea에 그대로 들어가도록 함.
// 수정한 댓글을 등록할 button 생성
const saveButton = document.createElement("button");
saveButton.textContent = "댓글 등록";
saveButton.classList.add("saveBtn");
// textarea, button을 넣을 div 생성
const textModiBox = document.createElement("div");
textModiBox.classList.add("textModiBox");
textModiBox.appendChild(modiInput);
textModiBox.appendChild(saveButton);
// 수정 버튼, 현재 코멘트를 보이지 않게 하고, 수정할 박스를 추가.
modiBtn.style.display = "none";
userComment.style.display = "none";
liLeft.appendChild(textModiBox);
modiInput.focus(); // 수정 시 바로 input에 포커스가 가도록 하기
// 문제의 부분. 해결 전에는 async를 사용하지 않아 문제가 발생했다.
// 수정 버튼 클릭 이벤트.
saveButton.addEventListener("click", async () => {
const newComment = modiInput.value;
if (newComment === '') {
alert("댓글이 입력되지 않았습니다.")
return;
}
try {
// Firestore 업데이트
await updateDoc(doc(db, "webComments", id), {
'comment': newComment
});
// 수정된 댓글을 화면에 반영.
userComment.textContent = newComment;
userComment.style.display = "";
window.alert("메시지가 업데이트되었습니다.");
window.location.reload();
} catch (error) {
window.alert("오류가 발생했습니다.");
}
})
} else {
alert("비밀번호가 다릅니다.");
}
이 코드에서 중요한 부분은 saveButton의 클릭 이벤트이다. 앞서 말한대로 async를 사용하지 않은 상태에서 함수 내부에 await을 사용하여 문제가 발생했다. 이 문제를 통해 async await에 대한 개념을 다시 제대로 잡고 가야겠다는 생각이 들었다.
Element.closest() : 요소에서 가장 가까운 조상을 찾는 메소드HTMLElement: focus() : 해당 요소에 포커스 지정 (오늘은 input에 바로 포커스가 가도록 하는 기능에 쓰임)단순히 개념을 잘 알지 못해서 해결하지 못하는 문제들이 아직 많기에, 다음 주에 있을 자바스크립트 강의가 기대되는 동시에 아는 개념이라도 더욱 열심히 들어야겠다는 생각이 들었다. 그리고, 역시 구글링을 잘 이용하자.