createAddress.html은 주소 등록 화면을 제공하며, 아래의 주요 요소로 구성되어 있습니다:
form: 사용자가 주소 이름과 주소를 입력할 수 있는 입력 필드.label과 input: 사용자가 필수 정보를 입력하도록 설계.button: 폼 제출 버튼.script: 자바스크립트 파일인 createAddress.js를 defer 속성을 사용해 로드.createAddress.js는 주소 등록을 처리하는 로직을 포함하고 있습니다. 주요 기능은 다음과 같습니다.
폼 제출 이벤트 리스너 추가
document.querySelector를 사용해 폼 요소를 선택하고, addEventListener로 submit 이벤트를 감지.preventDefault()를 호출해 기본 제출 동작 방지.입력 값 검증
addressName과 address 필드를 확인하고 비어 있으면 경고 메시지를 출력.주소 개수 제한
fetch를 통해 GET 요청으로 사용자의 기존 주소 목록을 가져옴.주소 등록 요청
addressName과 address를 서버로 전송.예외 처리
try-catch 블록을 사용해 비동기 요청에서 발생하는 오류를 처리.api/users/me/addressesapi/users/me/addressespreventDefault()를 사용해 기본 동작을 제어하는 중요성을 다시 느꼈다.fetch API와 async/await를 사용한 깔끔한 비동기 처리가 유용했다.오늘은 주소 등록 기능을 구현하며 사용자 입력 검증과 네트워크 요청의 중요성을 다시 확인했다. 앞으로 더 발전된 UX와 코드 품질을 목표로 개선해 나가야겠다!
createAddress.html
<!doctype html>
<html lang="en" data-theme="dark">
<head>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
/>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>주소 등록</title>
</head>
<body>
<main class="container">
<header>
<h1>주소 등록</h1>
<a href="getAddress.html" role="button">주소 목록으로 이동</a>
</header>
<form id="addressForm">
<label for="addressName">주소 이름</label>
<input
type="text"
id="addressName"
placeholder="주소 이름을 입력하세요"
required
/>
<label for="address">주소</label>
<input
type="text"
id="address"
placeholder="주소를 입력하세요"
required
/>
<button type="submit">등록하기</button>
</form>
</main>
<script src="js/createAddress.js" defer></script>
</body>
</html>
createAddress.js
const addressForm = document.querySelector('#addressForm');
// 주소 등록 이벤트
addressForm.addEventListener('submit', async (e) => {
e.preventDefault();
const addressName = document.querySelector('#addressName').value.trim();
const address = document.querySelector('#address').value.trim();
if (!addressName || !address) {
alert('모든 필드를 입력해주세요.');
return;
}
try {
// 기존 주소 개수 확인
const countResponse = await fetch('api/users/me/addresses', {
method: 'GET',
headers: {
Authorization: `Bearer ${localStorage.getItem('accessToken')}`,
},
});
if (!countResponse.ok) {
throw new Error('주소 개수를 확인하지 못했습니다.');
}
const { data: addresses } = await countResponse.json();
if (addresses.length >= 5) {
alert('최대 5개의 주소만 등록할 수 있습니다.');
return;
}
// 주소 등록 요청
const response = await fetch('api/users/me/addresses', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${localStorage.getItem('accessToken')}`,
},
body: JSON.stringify({ addressName, address }),
});
if (!response.ok) {
throw new Error('주소 등록에 실패했습니다.');
}
alert('주소가 등록되었습니다.');
window.location.href = 'getAddress.html'; // 조회 페이지로 이동
} catch (error) {
console.error('등록 오류:', error);
alert(error.message || '오류가 발생했습니다.');
}
});