이 프로젝트는 비속어 사용을 줄이고 건강한 커뮤니티 문화를 조성하기 위한 PURGO 체험용 커뮤니티 백엔드 시스템입니다.
AI 필터링 서버(PURGO_CORE)와 연동하여 사용자별 비속어 사용 횟수를 누적 관리합니다.
누적 5회 이상 시, 게시글·댓글 작성 및 수정이 제한됩니다.
이를 통해 PURGO를 활용한 자정 기능이 실제 서비스 환경에서 어떻게 작동하는지를 직접 체험할 수 있도록 설계되었습니다.
- 송보민(PL) : 마이페이지, DB 연결(MySQL, Redis), JWT, 초기 설정 보수, ERD , 프록시 서버 구현, ai 연동
- 구강현 : 사용자 관리, JWT, 초기 설정, ERD, Query, 문서 작성 및 정리(Notion), ai 기능 연결(욕설 카운트, 기능 제한)
- 정혜지 : 게시글 CRUD, 검색, ERD, Query , swagger
- 이은비(보조) : 댓글 CRUD, ERD
- application.properties 파일 생성
- 노션 -> 백엔드 설정/application.properties 참고
- java 17
- Spring Boot 3.4.4
- gradle-8.13
-
Mysql
- docker run --name mysql-db -e MYSQL_ROOT_PASSWORD={your_password} -p 3306:3306 -d mysql:8.4
- 쿼리 : query.sql
- docker run --name mysql-db -e MYSQL_ROOT_PASSWORD={your_password} -p 3306:3306 -d mysql:8.4
-
Redis
- docker run -d --name redis -p 6379:6379 redis:7-alpine
- 2025.03.26 ~ 2025.06.05
| 분류 | 사용 기술 | 설명 |
|---|---|---|
| 백엔드 프레임워크 | Spring Boot | REST API, 보안, DB 연동을 스타터 의존성 기반으로 통합 구성 |
| 보안 | Spring Security | 필터 체인 기반 인증/인가 흐름 구현, 세션리스 구조로 인증 처리 |
| 인증 | JWT | 클라이언트 인증 상태를 유지하기 위한 토큰 기반 인증 방식 |
| 데이터베이스 | MySQL | 관계형 데이터 정합성과 트랜잭션 처리에 특화된 구조 |
| 데이터베이스 | Redis | 인메모리 기반으로 고속 키-값 저장, TTL 설정, 구조 단순화에 최적화 |
| ORM | JPA (Hibernate) | 자바 객체로 DB를 직접 제어하고 유지보수성을 높이는 ORM 접근 |
| 이메일 발송 | Spring Mail | 인증 및 알림 메일 발송을 SMTP 설정 기반으로 간편하게 구현 |
| 분류 | 사용 기술 | 설명 |
|---|---|---|
| IDE | IntelliJ IDEA | Java 및 Spring Boot 개발에 최적화된 통합 개발 환경 |
| 빌드 도구 | Gradle | 프로젝트 빌드 및 의존성 관리 자동화 도구 |
| 버전 관리 | Git + GitHub | 소스 코드 이력 관리 및 협업 도구 |
| 테스트 도구 | Postman | REST API 테스트 및 문서화 |
| 기타 라이브러리 | Lombok | Getter, Setter, Builder 자동 생성 |
| JDK(JRE) | Java 17 | Spring 애플리케이션 런타임 환경 |
| DB 툴 | DBeaver | MySQL RDS 접속 및 쿼리 테스트 |
| 인프라 관리 | AWS Console | EC2, RDS, ElastiCache, S3 구성 및 모니터링 도구 |
┌────────────┐
│클라이언트 │
└────┬───────┘
↓
POST /api/auth/login
↓
ID/PW 인증
↓
AccessToken + RefreshToken 생성
↓
토큰 응답 → 클라이언트 저장
┌────────────┐
│클라이언트 │
└────┬───────┘
↓
Authorization: Bearer <token>
↓
JwtAuthorizationFilter
└→ 토큰 서명 검증 (라이브러리 내부)
└→ userId(sub) 추출
└→ DB에서 유저 조회
└→ SecurityContext에 등록
↓
@AuthenticationPrincipal 접근 가능
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| POST | /auth/signup | 회원가입 |
| POST | /auth/login | 로그인 및 토큰 발급 |
| POST | /auth/refresh | 토큰 재발급 |
| POST | /auth/logout | 로그아웃 |
| GET | /auth/checkId | 아이디 중복 확인 |
| GET | /auth/checkName | 닉네임 중복 확인 |
| POST | /auth/findId | 이메일로 아이디 찾기 |
| POST | /auth/resetPassword | 비밀번호 재설정 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/user/profile | 내 프로필 조회 |
| PUT | /api/user/profile | 내 프로필 수정 |
| DELETE | /api/user/delete | 회원 탈퇴 |
| POST | /api/user/penaltyCount | 패널티 횟수 조회 |
| POST | /api/user/limits | 사용자 제한 정보 조회 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/post/list | 게시글 목록 조회 (페이지네이션) |
| GET | /api/post/{postId} | 게시글 상세 조회 |
| POST | /api/post/create | 게시글 작성 |
| PUT | /api/post/update/{postId} | 게시글 수정 |
| DELETE | /api/post/delete/{postId} | 게시글 삭제 |
| GET | /api/post/my | 작성 게시글 조회 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/comment/{postId} | 특정 게시글의 댓글 조회 |
| POST | /api/comment/{postId} | 댓글 작성 |
| PUT | /api/comment/{commentId} | 댓글 수정 |
| DELETE | /api/comment/{commentId} | 댓글 삭제 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| GET | /api/search | 키워드로 게시글 검색 |
backend/
└── src/
└── main/
├── java/
│ └── com/
│ └── example/
│ └── final_backend/
│ ├── config/
│ │ ├── JwtConfig.java
│ │ ├── PurgoClientConfig.java
│ │ ├── RedisConfig.java
│ │ ├── SecurityConfig.java
│ │ ├── SwaggerConfig.java
│ │ └── WebMvcConfig.java
│ ├── controller/
│ │ ├── AuthController.java
│ │ ├── CommentController.java
│ │ ├── MypageController.java
│ │ ├── PostController.java
│ │ └── SearchController.java
│ ├── dto/
│ │ ├── AuthDto.java
│ │ ├── CommentDto.java
│ │ ├── JwtDto.java
│ │ ├── PostDto.java
│ │ └── ProfileDto.java
│ ├── entity/
│ │ ├── BadwordLogEntity.java
│ │ ├── CommentEntity.java
│ │ ├── PenaltyCountEntity.java
│ │ ├── PostEntity.java
│ │ ├── UserEntity.java
│ │ └── UserLimitsEntity.java
│ ├── factory/
│ │ └── UserFactory.java
│ ├── repository/
│ │ ├── BadwordLogRepository.java
│ │ ├── CommentRepository.java
│ │ ├── PenaltyCountRepository.java
│ │ ├── PostRepository.java
│ │ ├── UserLimitsRepository.java
│ │ └── UserRepository.java
│ ├── security/
│ │ ├── CustomUserDetails.java
│ │ └── JwtAuthorizationFilter.java
│ └── service/
│ ├── AsyncService.java
│ ├── AuthService.java
│ ├── CheckBadwordService.java
│ ├── CommentService.java
│ ├── JwtService.java
│ ├── MypageService.java
│ ├── PostService.java
│ ├── RedisService.java
│ ├── ServerToProxyJwtService.java
│ ├── UserDetailsServiceImpl.java
│ └── UserPenaltyService.java
└── resources/
├── application.properties
└── dummy.txt
BadwordFilterService는 FastAPI 서버에 메시지를 POST 요청으로 전달- FastAPI 응답 구조 예시:
{
"isAbusive": true,
"originalText": "욕설 포함된 문장",
"rewrittenText": "***"
}- 욕설이 감지되면
chatService.incrementBadwordCount()실행 - FastAPI 장애 시 원문 그대로 반환
-
게시글 작성, 수정, 삭제, 조회
로그인한 사용자는 게시글을 작성하고, 본인이 작성한 글은 수정·삭제할 수 있습니다. -
댓글 작성, 수정, 삭제
게시글에 댓글을 달 수 있으며, 작성자는 댓글 수정과 삭제가 가능합니다. -
욕설 필터링 (FastAPI 연동)
게시글과 댓글은 AI 서버와 연동되어 욕설을 실시간 감지하고 자동으로 대체어로 변환합니다. -
JPA 기반 DB 연동
JPA를 통해 객체 중심으로 DB에 접근하고 데이터를 자동 매핑 및 저장합니다. -
비속어 사용 횟수 누적 관리
감지된 욕설은 사용자별로 누적 기록되며, 로그로 저장됩니다. -
누적 시 제한 기능
비속어 5회 이상 사용 시, 게시글·댓글 작성 및 수정이 자동으로 제한됩니다. -
JWT 인증 및 토큰 갱신
JWT를 통해 사용자 인증을 처리하며, Access Token이 만료되면 Refresh Token을 이용해 API 요청을 통해 갱신할 수 있습니다.
