Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
151dacf
feat: 파견 대학 테이블명 변경 및 협정 대학 테이블 추가하는 DDL 작성 (#620)
whqtker Jan 24, 2026
949d3d9
refactor: 잘못 설정되었던 테이블 간 연관 관계 재설정 (#622)
whqtker Jan 24, 2026
db0287f
refactor: 대학 검색 응답 수정 (#624)
whqtker Jan 25, 2026
b4d6ec2
refactor: s3 버전 업그레이드 및 로직 수정 (#608)
lsy1307 Jan 30, 2026
d85576d
refactor: 리프레시 토큰 만료시 쿠키 삭제 (#628)
Gyuhyeok99 Feb 2, 2026
c0a4f42
refactor: 멘토링 조회 응답에 mentoringId 필드 추가 (#638)
whqtker Feb 3, 2026
2fef77c
feat: WebSocket 로깅 인터셉터 작성 (#635)
whqtker Feb 3, 2026
27cb522
feat: 어드민에서 파견 대학을 관리하도록 (#633)
whqtker Feb 7, 2026
8d060b4
fix: host_university 테이블의 korean_name 필드에 unique key 추가 (#645)
whqtker Feb 10, 2026
3e7acea
fix: 멘토 지원서 승인 시 유저 Role 을 Mentor로 승격 (#639)
sukangpunch Feb 10, 2026
2e84c2f
chore: 스크립트 버전 수정 (#651)
whqtker Feb 10, 2026
450db99
feat: test skill 추가 (#647)
Gyuhyeok99 Feb 11, 2026
61fad78
fix: 게시글 중복 생성 방지 (#649)
JAEHEE25 Feb 12, 2026
a61888a
chore: testcontainer 버전 업 (#659)
whqtker Feb 14, 2026
02c2d8e
chore: windows에서도 hook이 동작하도록 (#655)
whqtker Feb 14, 2026
6e9ee44
refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경 (#653)
whqtker Feb 14, 2026
26f5a76
refactor: 멘토 도메인 응답의 사용자 id를 siteUserId로 통일 (#665)
Gyuhyeok99 Feb 14, 2026
80ae3fc
refactor: 채팅 도메인 응답의 사용자 관련 id를 siteUserId로 통일 (#666)
whqtker Feb 14, 2026
7e7b5c9
feat: 전체 뉴스를 조회하는 API 구현 (#674)
whqtker Feb 18, 2026
bcad07c
chore: 누락된 제약 조건을 추가하는 스크립트 작성 (#676)
whqtker Feb 18, 2026
a554fbc
chore: pr을 리뷰하는 SKILL.md 작성 (#669)
whqtker Feb 19, 2026
61aba25
feat: Parameter Store 기반 설정 관리 전환 및 loadtest 프로필 추가 (#670)
lsy1307 Mar 3, 2026
cd40ddd
refactor: docker-compose.dev.yml에 mysql 컨테이너 추가 (#690)
Hexeong Mar 3, 2026
3b238e4
fix: term 테이블의 is_current 필드에 UK 설정 (#650)
whqtker Mar 4, 2026
4086edc
feat: 어드민 유저 관리 기능 추가 (#686)
JAEHEE25 Mar 5, 2026
f152ebe
chore: 스크립트 버전 수정 (#691)
whqtker Mar 6, 2026
4efa1bc
chore: stage admin 도메인 추가 (#692)
whqtker Mar 8, 2026
bb37cd6
refactor: 응답에서 refresh token은 제외하여 전달하도록 (#646)
whqtker Mar 8, 2026
3a7e3c9
feat: 어드민 국가 crud 추가 (#656)
Gyuhyeok99 Mar 8, 2026
00093eb
refactor: 대학 캐시 무효화 정책 추가 (#660)
Gyuhyeok99 Mar 8, 2026
9f63826
chore: master hotfix를 develop에 sync (#694)
whqtker Mar 8, 2026
6ebdf47
chore: develop → release 머지
whqtker Mar 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions .claude/hooks/notify.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,17 @@
])
elif system == "Windows":
ps1_path = os.path.join(script_dir, "notify.ps1")
subprocess.run([
"powershell", "-NoProfile", "-ExecutionPolicy", "Bypass",
"-File", ps1_path
])
# VS Code extension 환경에서는 PATH에 powershell이 없을 수 있으므로 절대 경로 사용
powershell_candidates = [
r"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",
"powershell",
]
for ps in powershell_candidates:
try:
subprocess.run(
[ps, "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ps1_path],
timeout=10,
)
break
except (FileNotFoundError, subprocess.TimeoutExpired):
continue
281 changes: 281 additions & 0 deletions .claude/skills/review-pr/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,281 @@
---
name: review-pr
description: Pull Request를 체계적으로 리뷰하여 프로젝트 컨벤션 준수 여부와 코드 품질을 검증합니다
args: <PR 번호> (예: /review-pr 666)
---

# Pull Request 리뷰 가이드

이 skill은 solid-connect-server 프로젝트의 Pull Request를 체계적으로 리뷰합니다.

## 사용법

```bash
/review-pr <PR번호>
```

**예제:**
```bash
/review-pr 666
```

---

## 리뷰 프로세스

### 1단계: PR 정보 수집

GitHub CLI로 PR의 기본 정보와 변경사항을 파악합니다.

```bash
gh pr view <번호> -R solid-connection/solid-connect-server # PR 기본 정보 조회
gh pr diff <번호> -R solid-connection/solid-connect-server # 변경된 파일과 diff 확인
gh pr checks <번호> -R solid-connection/solid-connect-server # CI/CD 상태 확인
```

**수집할 정보:**
- PR 제목 및 설명
- 관련 이슈 번호
- 변경된 파일 목록
- CI/CD 체크 상태

### 2단계: 변경 파일 분석

**도구 우선순위:**

1. **Serena MCP** (Java 코드 분석에 최적화)
- `mcp__serena__get_symbols_overview <파일경로>` - 파일의 클래스/메서드 구조 파악
- `mcp__serena__find_symbol <심볼명>` - 특정 심볼 검색
- `mcp__serena__search_for_pattern <패턴>` - 컨벤션 위반 패턴 검색

2. **Read/Grep** (보조 분석)
- `Read <파일경로>` - 파일 전체 읽기
- `Grep --pattern <패턴>` - 패턴 검색

### 3단계: 체크리스트 검증

아래 체크리스트를 순서대로 확인합니다.

---

## 리뷰 체크리스트

각 항목의 상세 컨벤션은 참조 문서를 확인하세요.

### 1. 아키텍처 및 계층 구조

**검증 항목:**
- 계층형 아키텍처 준수 (Controller → Service → Repository)
- 역계층 참조 금지
- 순환 의존성 없음

👉 **참고:** `CLAUDE.md` - "아키텍처" 섹션

---

### 2. 네이밍 컨벤션

**검증 항목:**
- API 엔드포인트: kebab-case 사용 (예: `/user-profile`)
- DTO 변환 메서드: 단일 파라미터 `from()`, 다중 파라미터 `of()`
- Request/Response: `XXXRequest`, `XXXResponse` 형식
- 테스트 메서드: 한국어, `어떤_것을_하면_어떤_결과가_나온다()` 패턴

👉 **참고:** `CLAUDE.md` - "네이밍 컨벤션" 섹션

---

### 3. 코드 스타일

**검증 항목:**
- 와일드카드(`*`) import 금지
- 클래스 선언 전 빈 줄 존재
- private 메서드는 호출하는 public 메서드 바로 아래 위치
- Controller: 모든 파라미터 줄바꿈 필수
- 일반 메서드: 3개 이상 파라미터 시 줄바꿈
- 파일 끝 개행 문자

**패턴 검색 예제:**
```bash
mcp__serena__search_for_pattern "import.*\\*" # 와일드카드 import 검색
```

👉 **참고:** `CLAUDE.md` - "코드 스타일" 섹션

---

### 4. Entity 및 JPA

**검증 항목:**
- 모든 필드에 `@Column` 어노테이션 존재
- `name` 속성으로 컬럼명 명시
- `nullable` 속성 명시
- null 불가: 원시 타입 (`int`, `long`, `boolean`)
- nullable: Wrapper 타입 (`Integer`, `Long`, `Boolean`)
- 양방향 연관관계 시 편의 메서드 존재

👉 **참고:** `CLAUDE.md` - "데이터베이스 접근" 섹션

---

### 5. 데이터베이스 마이그레이션

**검증 항목:**
- 스키마 변경 시 Flyway 마이그레이션 파일 추가
- 파일명 형식: `V{VERSION}__{DESCRIPTION}.sql`
- 위치: `src/main/resources/db/migration/`
- Entity 변경과 마이그레이션 일치
- 기존 마이그레이션 파일 수정 금지 (새 버전 생성)

👉 **참고:** `CLAUDE.md` - "데이터베이스 마이그레이션" 섹션

---

### 6. 테스트 코드

**검증 항목:**
- 새로운 Service/Repository 메서드에 대한 테스트 존재
- 예외 케이스 테스트 포함
- `@TestContainerSpringBootTest` 어노테이션 사용
- `@DisplayName`으로 한글 설명 제공
- `@Nested`로 기능별 그룹화
- Given-When-Then 구조 준수
- Fixture 패턴 사용 (FixtureBuilder + Fixture)

👉 **참고:** `.claude/skills/test/SKILL.md`

---

### 7. 커밋 메시지

**검증 항목:**
- `<type>: <description>` 형식
- Type: `feat`, `fix`, `refactor`, `test`, `chore`, `docs`, `perf`
- 간결하고 명확한 설명

👉 **참고:** `CLAUDE.md` - "Git 커밋 컨벤션" 섹션

---

### 8. 코드 품질 및 잠재적 이슈

**검증 항목:**
- 비즈니스 로직은 Service 계층에만
- Controller는 요청/응답 처리만
- `@Transactional` 적절하게 사용 (읽기 전용: `readOnly = true`)
- CustomException 사용
- N+1 쿼리 문제 없음
- 인증/인가 처리 (`@AuthorizedUser`)
- 민감 정보 노출 없음

👉 **참고:** `CLAUDE.md` - "아키텍처", "기술 스택 상세" 섹션

---

## 도구 사용 가이드

### Serena MCP (우선 사용)

```bash
# 파일의 클래스/메서드 구조 파악
mcp__serena__get_symbols_overview src/main/java/.../MentorService.java

# 특정 심볼 검색
mcp__serena__find_symbol "MentorDetailResponse"

# 컨벤션 위반 패턴 검색
mcp__serena__search_for_pattern "import.*\\*"
```

### GitHub CLI

```bash
# PR 정보
gh pr view 666 -R solid-connection/solid-connect-server --json title,body,author,number,url

# 변경사항
gh pr diff 666 -R solid-connection/solid-connect-server --patch

# CI 상태
gh pr checks 666 -R solid-connection/solid-connect-server
```

### 보조 도구

```bash
# 파일 읽기
Read src/main/java/.../MentorService.java

# 패턴 검색
Grep --pattern "@Column" --glob "*.java" --path src/main/java/.../domain
```

---

## 리뷰 결과 출력 형식

다음 형식으로 리뷰 결과를 정리하여 제공합니다.

```markdown
## PR 리뷰 결과: #{번호} - {제목}

**PR 링크:** {GitHub URL}
**관련 이슈:** #{이슈번호}

### 📊 PR 정보 요약

- **작성자:** {작성자}
- **변경 파일:** {숫자}개
- **추가 라인:** +{숫자}, **삭제 라인:** -{숫자}
- **CI/CD 상태:** {통과/실패}

### 주요 변경사항

{PR 설명 요약}

---

### ✅ 통과 항목

- 아키텍처 계층 구조 준수
- 네이밍 컨벤션 준수
- ...

### ⚠️ 개선 권장 항목

- **코드 스타일**: 와일드카드 import 사용
- 파일: `src/main/java/.../MentorService.java:5`
- 개선: 명시적 import로 변경

### ❌ 필수 수정 항목

- **Entity**: @Column 어노테이션 누락
- 파일: `src/main/java/.../domain/Mentor.java:30`
- 수정 방향: 모든 필드에 `@Column` 어노테이션 추가

---

### 💡 종합 의견

{전반적인 리뷰 의견}

**승인 상태:** ✅ 승인 / ⚠️ 조건부 승인 / ❌ 수정 후 재검토
```

---

## 리뷰 시 주의사항

1. **컨텍스트 이해 우선**: PR 설명과 관련 이슈를 먼저 읽고 변경의 목적 파악
2. **Serena MCP 우선 사용**: Java 코드 분석 시 효율적
3. **건설적 피드백**: 문제점 지적 시 구체적인 개선 방향 제시
4. **긍정적 피드백**: 잘된 부분도 언급하여 균형 잡힌 리뷰
5. **우선순위**: 아키텍처 > 네이밍 > 스타일 순으로 중요도 판단

---

## 참고 자료

- **프로젝트 컨벤션**: `CLAUDE.md` - 전체 개발 컨벤션
- **테스트 가이드**: `.claude/skills/test/SKILL.md` - 테스트 작성 가이드
- **개발 컨벤션 위키**: https://github.com/solid-connection/solid-connect-server/wiki/개발-컨벤션-정리
3 changes: 0 additions & 3 deletions .github/workflows/dev-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ jobs:
steps:
- name: Checkout the code
uses: actions/checkout@v4
with:
token: ${{ secrets.SUBMODULE_ACCESS_TOKEN }}
submodules: true

# --- Java, Gradle 설정 ---
- name: Set up JDK 17
Expand Down
3 changes: 0 additions & 3 deletions .github/workflows/prod-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@ jobs:
steps:
- name: Checkout the code
uses: actions/checkout@v4
with:
token: ${{ secrets.SUBMODULE_ACCESS_TOKEN }}
submodules: true

# --- Java, Gradle 설정 ---
- name: Set up JDK 17
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ out/
### Claude Code ###
.claude/settings.local.json

### Serena ###
.serena/

### YML ###
application-secret.yml
application-prod.yml
Expand Down
3 changes: 0 additions & 3 deletions .gitmodules

This file was deleted.

1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ dependencies {
// Etc
implementation platform('software.amazon.awssdk:bom:2.41.4')
implementation 'software.amazon.awssdk:s3'
implementation 'io.awspring.cloud:spring-cloud-aws-starter-parameter-store:3.0.4'
implementation 'org.hibernate.validator:hibernate-validator'
implementation 'org.springframework.boot:spring-boot-starter-websocket'

Expand Down
13 changes: 13 additions & 0 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,21 @@ services:
network_mode: "host"
environment:
- SPRING_PROFILES_ACTIVE=dev
- AWS_REGION=ap-northeast-2
- SPRING_DATA_REDIS_HOST=127.0.0.1
- SPRING_DATA_REDIS_PORT=6379
volumes:
- ./logs:/var/log/spring
restart: always

mysql:
image: mysql:8.0
container_name: solid-connection-dev-mysql
environment:
MYSQL_DATABASE: solid_connection
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
ports:
- "3306:3306"
volumes:
- ./mysql_data_dev:/var/lib/mysql
restart: always
1 change: 1 addition & 0 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ services:
network_mode: "host"
environment:
- SPRING_PROFILES_ACTIVE=prod
- AWS_REGION=ap-northeast-2
- SPRING_DATA_REDIS_HOST=127.0.0.1
- SPRING_DATA_REDIS_PORT=6379
volumes:
Expand Down
Loading