이 파일은 프로젝트의 일관성을 유지하고, 협업 시 발생할 수 있는 충돌을 방지하기 위한 핵심 지침서입니다. 모든 작업자는 작업을 시작하기 전 이 내용을 반드시 숙지해야 합니다.
- 사용자 확인: 작업을 시작하기 전, 반드시 현재 사용자의 이름을 확인하십시오. (소유자: 황호찬)
- 명세 준수: 모든 필드명, 타입, 엔드포인트는
UIBackendSpec.md와 100% 일치해야 합니다. 임의 변경을 금지합니다. - 히스토리 파악:
Work Log와Todo List를 읽어 중복 작업을 방지하고 문맥을 파악하십시오. - 작업 로그 기록: 작업 완료 후 반드시 아래 양식으로 기록을 남기십시오.
- 양식:
[이름] [YYYY-MM-DD HH:mm]에 [수행한 업무]를 작성함. [앞으로 해야 할 일]을 해야 됨.
- 양식:
- 네이버 핵데이 컨벤션 준수:
- 들여쓰기: Tab (1칸 = 4공백) 사용.
- 줄바꿈: LF (Unix 방식) 적용.
- 임포트: 와일드카드(
.*) 금지, 구체적 명시. (순서: static -> java -> javax -> org -> com -> backend)
- 기능별 패키징 (Package by Feature):
backend.[feature].entity,backend.[feature].service,backend.[feature].controller,backend.[feature].dto구조 유지.
- 멀티 모듈 의존성:
capstone-domain은capstone-api를 참조할 수 없음. 공용 DTO는 domain 모듈에 위치 가능.
- 논리적 외래키 (Logical FK): DB 수준의 물리적 FK 제약은 지양한다. 무결성은 애플리케이션(Service) 레이어에서 검증하며, 필요 시 인덱스만 생성한다.
- 풍부한 도메인 모델 (Rich Domain): 엔티티에
@Setter사용을 금지한다. 비즈니스 로직(상태 변경 등)은 엔티티 내부 메서드(예:.match())로 구현한다. - 소프트 딜리트 (Soft Delete):
is_deleted등의 플래그를 사용하여 물리적 삭제로 인한 참조 무결성 오류를 원천 차단한다. - 불변성 및 생성자 주입:
@RequiredArgsConstructor를 통한 생성자 주입을 필수로 하며, 가급적 객체의 불변성을 유지한다. - 검증의 계층화: DTO는 형식 검증(
@Valid), 서비스/도메인은 비즈니스 규칙 검증을 담당한다.
- 설계 우선 (Think Before Coding):
- 불확실한 요구사항은 추측하지 말고 명시적으로 질문하여 확인한다.
- 모호한 경우 여러 해석과 트레이드오프를 제시하고 사용자의 선택을 유도한다.
- 혼란이 생기면 즉시 멈추고 명확하지 않은 지점을 명시하여 질문한다.
- 단순성 유지 (Simplicity First):
- 요청받지 않은 기능, 과도한 추상화, 추측성 유연성을 배제한 최소 구현을 원칙으로 한다.
- 200줄의 코드를 50줄로 줄일 수 있다면 즉시 재작성하여 코드 최적화를 수행한다.
- 발생 가능성이 없는 시나리오에 대한 방어적 예외 처리를 지양한다.
- 정밀한 수정 (Surgical Changes):
- 요청과 직접 관련된 코드만 수정하며, 주변 코드의 포맷팅이나 스타일을 임의로 개선하지 않는다.
- 개인적 선호보다 프로젝트의 기존 코딩 컨벤션과 스타일을 최우선으로 준수한다.
- 본인의 수정으로 인해 발생한 미사용 임포트나 변수만 제거한다.
- 목표 중심 실행 (Goal-Driven Execution):
- "버그 수정" 대신 "재현 테스트 작성 후 통과"와 같이 검증 가능한 목표를 설정한다.
- 다단계 작업 시 각 단계마다 구체적인 검증 방법(Verify)을 포함한 계획을 수립한다.
- 빌드 확인:
./gradlew compileJava실행 시 에러가 없어야 함. - 컨벤션 체크:
./gradlew checkstyleMain실행 시 위반 사항이 0건이어야 함. - 테스트 보장: 핵심 로직 변경 시 단위 테스트를 작성하고
./gradlew test를 통과해야 함.
- 비밀 정보 관리:
application-secret.yml,.env등 민감한 정보가 포함된 파일은 절대 Git에 커밋하지 않는다.- 해당 파일들은 반드시
.gitignore에 등록되어 있어야 하며, 서버 배포 시에는 수동으로 업로드하거나 환경 변수를 통해 관리한다.
- 해당 파일들은 반드시
- 환경별 설정 분리: 로컬 개발 환경과 실제 운영 서버 환경의 설정을 분리하여 관리하며, DB 비밀번호나 API 키와 같은 보안 정보는 별도의 Secret 파일로 격리한다.
모든 PR 생성 시 아래를 자동으로 적용한다. AI 작업자는 PR 만든 직후 즉시 수행.
본 프로젝트의 작업자는 3 명. AI 가 매번 ask 하지 않도록 매핑을 명시:
| 이름 | GitHub login |
|---|---|
| 황호찬 (소유자) | hoTan35 |
| 이성찬 | ca5tlechan |
| 김동현 | ThonApple |
- CodeRabbit Full Review 요청:
- PR 생성 직후
@coderabbitai full review코멘트를 단다. - 한도 초과 (
Rate limit exceeded) 메시지를 받으면 사용자에게 즉시 보고하고, 댓글 안에 명시된 언제 풀리는지 (예: "59 minutes and 55 seconds") 와 함께 알린다. - 한도가 풀린 후에는 사용자가 별도 명령하지 않아도 다시
@coderabbitai full review를 트리거한다.
- PR 생성 직후
- 리뷰어 자동 지정 (본인 제외):
- 모든 PR 은 3 명의 작업자 중 본인을 제외한 두 명 을 reviewer 로 자동 등록한다.
- 작업 시작 시 General Rules #1 에 따라 확인한 현재 사용자 (=PR 작성자) 를 위 매핑에서 빼고 나머지 두 명을
--reviewer인자로 넣는다. - 예: 김동현이 PR 만들면 →
--reviewer "hoTan35,ca5tlechan". 이성찬이면 →--reviewer "hoTan35,ThonApple". - 둘 중 한 명 이상의 approve 가 머지 조건.
- 재리뷰 트리거:
- CodeRabbit fix 커밋을 push 한 후엔 다시
@coderabbitai review(증분) 또는full review(전체) 를 명시적으로 트리거한다 — push 직후 시점에 따라 이전 리뷰가 fix 전 코드를 본 경우 누락될 수 있음.
- CodeRabbit fix 커밋을 push 한 후엔 다시
- 황호찬 2026-04-10 14:00에
UIBackendSpec.md기반으로Post,FeedItem,Spot엔티티와 Enum을 작성함. - 황호찬 2026-04-10 14:30에
GET /feeds피드 목록 조회 API를 작성함. - 황호찬 2026-04-10 15:00에
Post매칭 시Spot자동 생성 로직 및 서비스 테스트 코드를 작성함. - 황호찬 2026-04-10 15:30에 전체 코드에 네이버 핵데이 컨벤션을 적용하고 컴파일 오류를 해결함.
- 황호찬 2026-04-10 18:45에
POST /posts/offer및POST /posts/request게시글 등록 API를 작성함. - 황호찬 2026-04-10 19:15에 QueryDSL 5.0.0을 사용하여
GET /feedsAPI를 고도화함. - 황호찬 2026-04-10 20:10에
FeedListQuery위치 조정으로 빌드 오류를 해결함. 현재 전체 빌드 및 컴파일 성공 상태임. - 김동현 2026-04-13 10:00에 Spot/Chat 도메인 엔티티 8개(
SpotParticipant,SpotSchedule,SpotVote,SpotVoteOption,SpotVoteAnswer,SpotChecklist,SpotFile,SpotNote) 및 Chat 엔티티 2개(ChatRoom,ChatMessage), Repository 10개,SpotController(21개 엔드포인트 뼈대),ChatController(9개 엔드포인트 뼈대)를 작성함.SpotService나머지 기능(참여자/일정/투표/체크리스트/파일/노트/리뷰) 및ChatService(SSE 포함) 구현을 해야 됨. - 김동현 2026-04-13 14:30에
SpotService기본 CRUD 및 상태 변경(match,cancel,complete) 구현, DTO 3개(CreateSpotRequest,SpotResponse,SpotListResponse) 작성, 논리적 FK 원칙 적용(엔티티@ManyToOne→ ID 필드로 전환), 네이버 핵데이 컨벤션 및@Valid검증 적용,ParticipantRole명세서 기준(AUTHOR/PARTICIPANT)으로 수정,ChatController패키지 경로 수정을 완료함.SpotService나머지 기능 및ChatService구현을 해야 됨. - 김동현 2026-04-27 10:00에
SpotService나머지 기능(참여자 조회, 일정 추가/조회, 투표 생성/조회/참여, 체크리스트 조회/추가/토글, 파일 업로드/조회/삭제, 노트 작성/조회) 전부 구현 완료, 관련 DTO 11개 추가, 엔티티 비즈니스 메서드(toggleDone,updateContent,incrementCount,update) 추가,SpotController전 엔드포인트 실제 서비스 연결 완료함.ChatService구현 및 SSE 실시간 채팅 연결을 해야 됨. - 김동현 2026-04-27 10:30에
ChatService(채팅방 CRUD, 커서 기반 메시지 페이지네이션, 메시지 전송),SseEmitterService(roomId 기반 구독·브로드캐스트, ping·timeout·error 처리),ChatController(전 엔드포인트 실제 연결 + SSE/api/chat/connect?roomId=) 구현 완료, Chat DTO 5개(ChatRoomResponse,CreateChatRoomRequest,ChatMessageResponse,SendMessageRequest,ChatMessageListResponse) 추가함. 인증 도입 후 dummy-user-id 교체 및 ChatRoomMember 테이블 추가가 필요함.
-
핵심 엔티티 및 리포지토리 구축 (Logical FK 원칙 적용)
-
QueryDSL 기반 동적 피드 조회 API 구현
-
게시글 등록 및 자동 매칭/스팟 생성 로직 구현
-
Neon Serverless Postgres 데이터베이스 연동 (
application.yml수정) -
실제 데이터베이스 환경에서의 통합 테스트
-
이성찬 2026-04-12 에 Auth/User 파트 전체(JWT 인증, OAuth2 소셜 로그인, 회원가입/탈퇴, 프로필 관리)를 작성함. Neon Serverless Postgres 데이터베이스 연동(
application.yml수정) 및 실제 DB 환경에서의 통합 테스트를 해야 됨.
- 핵심 엔티티 및 리포지토리 구축 (Logical FK 원칙 적용)
- QueryDSL 기반 동적 피드 조회 API 구현
- 게시글 등록 및 자동 매칭/스팟 생성 로직 구현
- Neon Serverless Postgres 데이터베이스 연동 (
application.yml수정) - 실제 데이터베이스 환경에서의 통합 테스트
- 게시글 상세 조회 및 삭제 API (Soft Delete 적용)
- 피드 신청·수락·거절·취소 API
- 펀딩 목표 달성 시 Spot 자동 전환 로직
- Post 생성 시 FeedItem 자동 연동
- JWT 인증 필터 및 토큰 발급/갱신
- OAuth2 소셜 로그인
- 회원가입/탈퇴, 프로필 관리 API
- Spot/Chat 전체 엔티티 및 Repository 구축
-
SpotController,ChatController엔드포인트 뼈대 작성 -
SpotService기본 CRUD(GET /spots,POST /spots,GET /spots/{id}) 구현 -
SpotService상태 변경(/match,/cancel,/complete) 구현 -
SpotService나머지 기능 (참여자 조회, 일정, 투표, 체크리스트, 파일, 노트) -
ChatService구현 (채팅방 생성/조회, 커서 기반 메시지 조회/전송, 읽음 처리 stub) - SSE 실시간 채팅 연결 (
/api/chat/connect?roomId=) 구현 (단일 서버 인메모리)
- 황호찬 2026-05-04 에
FeedApplication엔티티/리포지토리 추가,FeedItem·Post엔티티에 펀딩 관련 필드(fundingGoal,fundedAmount,isDeleted등) 추가,POST /posts/offer|request생성 시FeedItem자동 연동 구현,GET /feeds/{feedId}피드 상세 조회·DELETE /feeds/{feedId}피드 소프트 딜리트,POST /feeds/{feedId}/apply신청·DELETE /feeds/{feedId}/apply취소·PATCH /feeds/{feedId}/applications/{id}/accept|reject수락/거절 구현, 수락 시fundedAmount누적 후 목표 달성 시 Spot 자동 전환 로직 완성,GET /posts/{postId}상세 조회·DELETE /posts/{postId}소프트 딜리트 구현 완료함. Neon DB 연동 후 통합 테스트 및 인증 도입 시 dummy-user-id 교체를 해야 됨.
-
이성찬 2026-05-14 에 SecurityConfig CORS 설정 명시화(CorsConfigurationSource 빈 등록, cors() 빈 람다 수정), MvcConfig allowedOriginPatterns("*") → frontend.base-url 프로퍼티 기반으로 변경하여 허용 origin 환경변수화 완료함. 추후 배포 환경 origin 추가 시 application.yml의 frontend.base-url만 수정하면 됨.
-
김동현 2026-05-14 에 Spot/Chat 도메인 잔여 dummy-user-id 5곳(createSpot, uploadFile, createNote, sendMessage 등)을
@AuthenticationPrincipal기반 currentUserId 로 일괄 교체하고, PR #15 caveat 였던 SpotVoteAnswer unique constraint 마이그레이션을 처리함.(vote_id, user_id) → (vote_id, user_id, option_id)로 의미를 변경하여 multiSelect 투표를 실제로 동작하게 하였으며,castVote에 단일선택/다중선택 분기 로직(단일선택 시 이전 답변 삭제 + 카운트 원자적 감소 → 표 변경 가능)과decrementVoteCount음수 가드를 추가함. PostgreSQL 수동 마이그레이션 스크립트(docs/migrations/2026-05-14_spot_vote_answer_multiselect.sql) 동반. ChatRoomMember 엔티티 도입(진짜 unreadCount, PERSONAL 방 partner, 차단/나가기)은 다음 PR. -
황호찬 2026-05-18 에
GlobalExceptionHandler에IllegalArgumentException(404)·IllegalStateException(400) 핸들러를 추가하여 feed apply 500 버그를 수정,FeedDetailResponse에@Schema(allOf = {FeedItemResponse.class})를 추가하여 Swagger 상세 조회 스키마에 부모 클래스 필드가 누락되던 문제를 해결함. FE 핸드오프를 위한 FeedItem DTO 신규 필드(isRentable,myApplicationRole,myApplicationDeposit) 추가 작업을 해야 됨.
마지막 업데이트: 2026-05-18 (황호찬)