- 지금 로그인 / 회원가입 / 포스팅 기능 구련을 완료했는데
- 전체 기능구현이 끝나고 디자인을 씌울까 아니면 기능구현이 되는대로 디자인을 씌울까
- 기능별로 디자인도 같이 씌우기로 결정 BootStrap 사용 예정
디자인
로그인

회원가입

기본 페이지


기능연결
로그인
로그인 요약도
graph LR
User[사용자] -->|클릭| Browser[브라우저 JS]
Browser -->|1. fetch 요청 (JSON)| URL[/api/v1/user/login/]
URL -->|2. 연결| View[Django View]
View -->|3. 검증| Serializer[Serializer]
Serializer -->|4. 조회| DB[(Database)]
DB --> View
View -->|5. 응답 (Token)| Browser
Browser -->|6. 저장 및 이동| LocalStorage[브라우저 저장소]
1단계: 이벤트 감지 및 가로채기
- HTML 폼(Form)은 원래 submit 버튼을 누르면 무조건 페이지를 새로고침하며 어딘가로 이동하려고 함
- 그리하여 이걸 막고 "내가 알아서 데이터를 보낼게"라고 해야 함
document.getElementById('loginForm').addEventListener('submit', async function(e) {
e.preventDefault();
2단계: 데이터 포장 - JSON
- 백엔드의 LoginSerializer는 JSON 데이터를 기다리고 있음
- 그래서 사용자가 입력창(input)에 적은 내용을 가져와서 JSON 문자열로 포장해야 함
const email = document.getElementById('email').value;
const password = document.getElementById('password').value;
body: JSON.stringify({
email: email,
password: password
})
3단계: Fetch - 비동기 통신
- (A) 주소
- /api/v1/user/login/으로 요청을 쏘면
- Django urls.py가 이를 낚아채서 LoginAPIView로 연결해 줌
- (B) 메서드
- POST로 쏘기 때문에 LoginAPIView의 def post(self, request): 함수가 실행
- (C) 헤더
- 백엔드가 request.data를 파싱 할 때 "아, 이거 JSON이구나"라고 알 수 있게 해 줌
const response = await fetch('/api/v1/user/login/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ ... })
});
4단계: 응답 처리
- 백엔드(LoginAPIView)가 로직을 다 처리하고 Response(...)를 반환하면
const data = await response.json();
if (response.ok) {
localStorage.setItem('access_token', data.token.access);
window.location.href = "/";
} else {
alert("로그인 실패: " + ...);
}
회원가입
프론트엔드(JS) -> 백엔드(Django) -> DB
회원가입 흐름도
graph LR
User[사용자 입력] -->|비번 일치 확인| JS[프론트엔드 JS]
JS -->|1. JSON 전송 (email, nickname, pw)| URL[/api/v1/user/signup/]
URL --> View[SignupAPIView]
View -->|2. 데이터 검증| Serializer[SignupSerializer]
Serializer -->|3. 중복 체크| DB[(Database)]
DB --> Serializer
Serializer -->|4. 유저 생성| Service[SignupService]
Service --> DB
View -->|5. 성공 응답 (201)| JS
JS -->|6. 로그인 페이지로 이동| Page[Login Page]
1단계: 이벤트 감지 및 1차 검문
- 회원가입 버튼을 누르면 자바스크립트가 가장 먼저 작동
- 여기서 중요한 건 서버로 보내기 전에 프론트에서 먼저 거르는 작업
document.getElementById('signupForm').addEventListener('submit', async function(e) {
e.preventDefault();
const email = document.getElementById('email').value;
const nickname = document.getElementById('nickname').value;
const password = document.getElementById('password').value;
const passwordConfirm = document.getElementById('passwordConfirm').value;
if (password !== passwordConfirm) {
alert("비밀번호가 일치하지 않습니다.");
return;
}
2단계: 데이터 선별 및 포장
- SignupSerializer는 딱 3가지 정보만 원함: email, nickname, password
- 프론트에서 passwordConfirm을 입력받았지만, 이건 검사만 하고 실제 JSON 포장 단계에서는 제거
- 백엔드 SignupSerializer의 fields = ["email", "nickname", "password"]와 정확히 일치해야 함
body: JSON.stringify({
email: email,
nickname: nickname,
password: password
})
3단계: Fetch - 비동기 통신
- 포장된 데이터를 들고 백엔드 API 주소로 떠남
Django 처리 과정
- 도착
- /api/v1/user/signup/ 주소에 있는 SignupAPIView가 요청을 받습니다.
- 2차 검문 (Serializer)
- SignupSerializer가 "이메일 형식이 맞는지", "이미 가입된 이메일인지(validate_email)" 정밀 검사
- 생성 (Service)
- 문제가 없으면 SignupService.create_user가 DB에 유저를 저장합니다.
- 응답
- "잘 만들었어(201 Created)"라는 신호를 보냅니다.
const response = await fetch('/api/v1/user/signup/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ... })
});
4단계: 응답 처리 및 이동
- 백엔드의 처리 결과를 보고 사용자에게 알림을 줌
const data = await response.json();
if (response.ok) {
alert("회원가입 완료! 로그인 페이지로 이동합니다.");
window.location.href = "/api/v1/user/login-page/";
} else {
alert(errorMessage);
}
기능구현
포스트 작성 기능
작성 글 조회
