취업 준비생을 위한 커뮤니티 플랫폼
합격시그널은 취준생이 정보 공유, 질문/답변, 소통을 한 곳에서 할 수 있도록 만든 커뮤니티 서비스입니다. 본 프로젝트는 6인 팀(백엔드 중심)으로 2주간 진행한 팀 프로젝트입니다.
취업 준비의 모든 정보를 한 곳에서 — 합격시그널
| 항목 | 내용 |
|---|---|
| 프로젝트명 | 합격시그널 |
| 프로젝트 유형 | 취업 준비생 커뮤니티 플랫폼 |
| 팀 구성 | 6인 팀 프로젝트 (백엔드 중심) |
| 개발 기간 | 2주 |
핵심 목표
- 게시판 중심 커뮤니티 기능 구현
- JWT + HttpOnly Cookie 기반 인증/인가 강화
- Redis 캐싱 및 실시간 알림(SSE) 기반 사용자 경험 개선
- JWT + HttpOnly Cookie 기반 로그인/로그아웃/토큰 재발급
- 이메일 인증 코드 기반 아이디 찾기 / 비밀번호 재설정
- 회원 탈퇴 (소프트 삭제)
- 게시판/카테고리별 게시글 CRUD
- 댓글/대댓글(계층형) 작성, 수정, 삭제
- 게시글/댓글 좋아요 토글
- 좋아요 기반 게시판별 인기글 Top5 (Redis 캐싱 + 캐시 무효화)
- SSE(Server-Sent Events) 기반 실시간 댓글/답글 알림
- 게시글 키워드 검색 / 카테고리 필터
- 최신순/인기순 정렬 / 페이지네이션
- 게시판/카테고리 생성, 수정, 삭제
- 회원 목록 조회
↓ HTTP
Frontend (Next.js 16)
↓ REST API + Cookie
Backend (Spring Boot 4)
├── H2 Database (도메인 데이터)
├── Redis (인기글 캐시)
└── Mail Server (이메일 인증)
↑ SSE
Frontend (Next.js 16)
| 컴포넌트 | 역할 |
|---|---|
| Spring Security Filter Chain | JWT 인증/인가, XSS 방지 필터 |
| Controller / Service / Repository | 도메인 레이어 분리 |
| Redis | 인기글 Top5 캐싱으로 DB 부하 감소 |
| SSE | 실시간 알림 스트림 제공 |
백엔드 실행 후 Swagger UI에서 전체 API를 확인할 수 있습니다.
| 항목 | URL |
|---|---|
| Swagger UI | http://localhost:8080/swagger-ui/index.html |
| OpenAPI Docs | http://localhost:8080/v3/api-docs |
- 문제: 게시글 상세 조회 시 게시판, 카테고리, 작성자 정보 접근마다 개별 쿼리가 실행되어 1번 요청에 4번 쿼리 발생
- 원인: JPA 기본 Lazy Loading으로 인해 연관 엔티티 접근 시점마다 추가 SELECT 실행
- 해결:
@EntityGraph로 board, category, author를 단일 JOIN 쿼리로 한 번에 조회 - 결과: 게시글 상세 조회 쿼리 4번 → 1번으로 감소
- 문제: XSS sanitize 로직이
PostRepositoryImpl안에 있어 게시글 외 다른 도메인은 보호되지 않는 구조 - 원인: 관심사 분리 원칙 위반, Repository가 보안 책임을 담당하는 구조
- 해결:
XssFilter+XssRequestWrapper추가로 Filter 레이어에서 모든 요청을 일괄 처리 - 결과: 전 도메인에 XSS 방지 자동 적용, Repository 단일 책임 원칙 준수
- 문제: 좋아요 변경 시 DB는 업데이트되지만 Redis 캐시는 이전 데이터를 반환
- 원인: 캐시를 유지하면 실시간 반영 불가, 매번 초기화하면 Redis 사용 의미 퇴색
- 해결: Cache-Aside 패턴 + 게시글 작성/삭제/좋아요 변경 시 캐시 무효화(evict), TTL 설정으로 방어선 구축
- 결과: 데이터 정합성 확보 및 반복 조회 구간 DB 부하 감소
본 프로젝트는 JWT Secret Key, 메일 서버 설정 등 민감한 정보를 코드에 직접 노출하지 않기 위해
설정 파일을 분리하여 관리합니다. 모든 파일은 .gitignore에 등록되어 있어 Git 원격 저장소에 포함되지 않습니다.
실행 시에는 팀 내부 채널을 통해 공유받은 내용을 직접 생성하여 사용합니다.
| 파일 | 위치 | 용도 |
|---|---|---|
.env |
backend/ |
JWT Secret Key, 메일 서버 계정 정보 |
application-secret.yaml |
backend/src/main/resources/ |
JWT Secret Key 설정 |
application-mail.yaml |
backend/src/main/resources/ |
메일 서버 설정 (GreenMail 로컬 테스트용) |
| 이름 | GitHub | 역할 |
|---|---|---|
| 김강산 | @csgangsai06512-ue | 백엔드, 회원가입/로그인/인증, 마이페이지 |
| 김경탁 | @gyeongtaggim865-hue | 백엔드, 게시글 좋아요, 댓글 작성/수정 |
| 김민혁 | @mk-404lab | 백엔드, 게시글 CRUD/정렬/인기글 |
| 김정욱 | @study-withme | 백엔드, 댓글 조회/삭제/좋아요 |
| 김하늘 | @c1oud-dev | 백엔드, 게시글 조회/검색/페이징 |
| 이유진 | @YJin33 | 백엔드, 관리자 기능, 실시간 알림(SSE) |
cd backend
./gradlew bootRuncd frontend
npm install
npm run dev# 최초 실행
docker run -d --name redis -p 6379:6379 redis
# 재시작
docker start redis합격시그널은 취준생의 정보 공유와 소통을 빠르고 안전하게 지원하는, 인증·실시간 알림·캐싱 기반 커뮤니티 플랫폼입니다.