개인 프로젝트
1. 관리자 페이지
- 변호사 가입 승인 / 신고 처리 / 회원 관리 / 결제 관리를 한 화면의 탭으로 통합
- 관리자도 일반 로그인 화면에서 로그인
- 회원·변호사 목록은 20명씩 페이지 나눔 + 서버 검색
2. 채팅 신고 · 차단
- 신고 기준은 욕설·모욕 / 금전 요구 두 가지로 한정 → 관리자가 대화 원문을 보고 이용 정지 결정
- 회원·변호사가 서로를 직접 차단할 수 있고, 설정 화면에서 차단 관리
- 대화방 입장 시 이용 안내 팝업 (일주일 동안 안 보기)
3. 실시간 채팅 (폴링 → WebSocket)
- 5초마다 새로 불러오던 방식에서 WebSocket으로 전환
- 상대 화면 표시까지 4.5초 → 0.3초
- 로그인 토큰은 브라우저가 읽을 수 없는 쿠키라, 서버가 발급한 1회용 입장권으로 접속
4. 유료 기능 (토스페이먼츠)
- 원하는 변호사 직접 선택: 2,900원 결제 → 입점 변호사 목록(강점·경력·수임료·실적)에서 선택
- 등기부 분석: 아이디당 무료 5회, 이후 1회 990원
- 결제 내역 화면: 미사용 이용권은 즉시 취소, 사용한 이용권은 환불 요청 → 관리자 승인
- 금액은 항상 서버가 정하고, 브라우저가 보낸 금액이 다르면 승인 요청조차 하지 않음
5. 계정 · 보안
- 소셜 로그인(구글·카카오·네이버) + 로고 버튼
- 회원가입 이메일 인증 (6자리 인증번호)
- 비밀번호 5회 오류 시 잠금 → 비밀번호 찾기로만 해제
- 소셜 계정은 이메일이 인증된 경우에만 기존 계정과 연결 (계정 탈취 방지)
- 회원 탈퇴, 이용약관·개인정보처리방침 페이지
- 보안 헤더(클릭재킹 방지 등), 요청 횟수 제한, 업로드 파일 형식 검사(실제 파일 내용으로 판별)
- 만료된 로그인 기록 매일 자동 정리
6. 사용성
- 어디서든 로그아웃할 수 있는 공통 머리글 (채팅 화면 제외)
- 로그인 만료 시 "로그인하시겠습니까?" 팝업 → 로그인 후 보던 화면으로 복귀
- 한글이 글자 단위로 끊기던 줄바꿈을 띄어쓰기 기준으로 변경
삽질 기록 (배운 점)
1. 결제했는데 이용권이 사라졌다
개발 DB가 메모리 기반이라 서버를 재시작할 때마다 데이터가 초기화되고 있었다.
→ 파일 기반 DB로 변경. "개발 환경도 데이터가 남아야 실제 사용 흐름을 테스트할 수 있다."
2. 다른 프로젝트의 설정이 섞여 들어왔다
PC의 OS 환경변수에 남아 있던 다른 프로젝트의 소셜 로그인 키가 .env.local보다 우선 적용되고 있었다.
→ 프로젝트 전용 키는 설정 파일 값만 쓰도록 강제.
3. 카카오 로그인 KOE006
리다이렉트 URI에 도메인만 적고 경로를 빼먹었다. 콜백 주소는 전체 경로를 정확히 등록해야 한다.
4. 테스트가 가끔 실패했다
처음엔 병렬 실행 문제로 봤지만, 진짜 원인은 테스트가 매번 같은 이름으로 데이터를 만들어 DB에 동명이인이 쌓인 것.
→ 이름이 아니라 ID로 찾도록 수정. 첫 번째 진단을 너무 빨리 믿지 말 것.
5. DB 예약어
day, count를 컬럼 이름으로 썼다가 SQL 오류. 예약어는 피하자.