Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
20a1719
ãcs 스케줄러 및 테스트코드
HwangMinSeon Oct 25, 2025
17a6fac
fix: 테스트 환경변수 설정변경
HwangMinSeon Oct 25, 2025
7feb4a6
test: TodayCsScheduler 유닛 테스트 작성
HwangMinSeon Oct 25, 2025
b689abc
fix: 전체 주석 처리
HwangMinSeon Oct 25, 2025
ee53f65
fix: 큐 파일 정리
HwangMinSeon Oct 25, 2025
be75380
setting: resume id 추가
yuripbong Nov 12, 2025
0e7ea94
feat: 이력서 크롤링 실패 처리
yuripbong Nov 12, 2025
d262f2c
feat: 이력서 작업 처리 상태 감지
yuripbong Nov 12, 2025
60d8487
feat: 이력서 크롤링 실패 분류
yuripbong Nov 12, 2025
35c6b58
feat: 이력서 Id 추출
yuripbong Nov 12, 2025
71f0b9b
feat: 이력서 처리 작업 모니터링
yuripbong Nov 12, 2025
cc08fab
feat: 이력서 크롤링 실패 슬랙 알림
yuripbong Nov 12, 2025
1ddd007
style: 포맷팅
yuripbong Nov 13, 2025
c2924e6
setting: 도커 이미지 변경
yuripbong Nov 14, 2025
dd9fef0
fix: 이미지 수정
yuripbong Nov 14, 2025
9422ed3
setting: 도커 이미지 변경
yuripbong Nov 14, 2025
1c817c0
Merge branch 'develop' of https://github.com/Techeer-Hogwarts/backend…
HwangMinSeon Nov 15, 2025
f9ec269
fix: 알림 중복 발송 방지
yuripbong Nov 15, 2025
2029291
fix: 레디스 조회 null 검사
yuripbong Nov 15, 2025
189e336
refactor: SCAN 기반 조회 적용
yuripbong Nov 20, 2025
619a937
fix: 알림 발송 완료 태스크 정리
yuripbong Nov 20, 2025
e8eb606
fix : 스케줄러에서 이모지 제거
HwangMinSeon Nov 24, 2025
311d037
fix : 도커파일 수정
HwangMinSeon Nov 24, 2025
9d12337
fix : 도커파일 수정, Runtime jre로 수정. builder는 유지
HwangMinSeon Nov 24, 2025
a8e141b
fix : 함수명 소문자로 수정
HwangMinSeon Nov 24, 2025
2f30cee
fix : instanceOf 제거
HwangMinSeon Nov 24, 2025
98dd1fd
Merge pull request #126 from Techeer-Hogwarts/BACKEND-179
HwangMinSeon Nov 24, 2025
ebda8e4
fix: 부트캠프 기간 생성 LocalDate 의존성 제거
dongwooooooo Nov 25, 2025
f9812d2
fix: BootcampMapper 정적 메서드로 변경
dongwooooooo Nov 25, 2025
8689b53
BootcampPermissionEvaluator 구현 및 CustomUserPrincipal 수정
dongwooooooo Nov 25, 2025
d09c2eb
BootcampService 검증 로직 추가, 기타 적용사항
dongwooooooo Nov 25, 2025
57ea6e2
User에 bootcamp로직 수정
dongwooooooo Nov 25, 2025
42d97fc
Test: BootcampTest 코드 작성
dongwooooooo Nov 25, 2025
2b28068
기타 변경사항, SpotlessApply
dongwooooooo Nov 25, 2025
38f4432
커서 룰 하나 추가
dongwooooooo Nov 25, 2025
739e1c8
카멜케이스, 리터럴 중복 해결
dongwooooooo Nov 25, 2025
edffe27
LocalDate 빈으로 주입
dongwooooooo Nov 29, 2025
1081397
DelegatingPermissionEvaluator long 형변환
dongwooooooo Nov 29, 2025
5c8c1f4
DelegatingPermissionEvaluator long 형변환
dongwooooooo Nov 29, 2025
47f01bc
순환참조 수정
dongwooooooo Nov 29, 2025
5ac4200
evaluator 수정
dongwooooooo Nov 29, 2025
a1c660c
spotlessApply
dongwooooooo Nov 29, 2025
160859c
ci test 주석 해제
dongwooooooo Nov 30, 2025
f6797b7
순환참조 해제
dongwooooooo Nov 30, 2025
3780770
외부 환경변수 테스트환경에서 격리
dongwooooooo Nov 30, 2025
3ac8de2
테스트 컨테이너 적용
dongwooooooo Nov 30, 2025
2f99b6b
테스트컨테이너 변경 적
dongwooooooo Nov 30, 2025
3b69ed3
프로젝트 멤버 테스트코드 작성
dongwooooooo Nov 30, 2025
fb2bdee
spotlessApply
dongwooooooo Nov 30, 2025
dbd1da5
Merge branch 'develop' of https://github.com/Techeer-Hogwarts/backend…
dongwooooooo Nov 30, 2025
ae82e00
test.properties 추가
dongwooooooo Nov 30, 2025
af5b3e3
ci jacoco 종류 변경
dongwooooooo Nov 30, 2025
536bb73
코더레빗 리뷰 적용
dongwooooooo Nov 30, 2025
1f66bc1
Merge pull request #128 from Techeer-Hogwarts/BACKEND-187
dongwooooooo Nov 30, 2025
aa2484b
zoom header debugging
dongwooooooo Dec 1, 2025
8dd61d1
zoom testConnection 체
dongwooooooo Dec 1, 2025
e79f956
zoom event notification endpoint url validate api
dongwooooooo Dec 6, 2025
ebffde4
zoom event notification endpoint url validate api
dongwooooooo Dec 6, 2025
11ac775
zoom event notification endpoint url validate api
dongwooooooo Dec 6, 2025
7c4744c
zoom event notification endpoint url validate api
dongwooooooo Dec 6, 2025
55aaf53
zoom 안 쓰는 코드 정리
dongwooooooo Dec 6, 2025
800d96a
zoom 안 쓰는 코드 정리
dongwooooooo Dec 6, 2025
042258d
zoom api 토큰 설정
dongwooooooo Dec 6, 2025
0523e24
zoom api 토큰 설정
dongwooooooo Dec 6, 2025
8a398df
zoom 웹훅 api 수정 및 정리
dongwooooooo Dec 6, 2025
fc22dee
zoom webhook exception
dongwooooooo Dec 6, 2025
59ec0d9
spotlessApply
dongwooooooo Dec 6, 2025
276a716
zoomWebhook 인증 리팩터링
dongwooooooo Dec 6, 2025
9694580
spotlessApply
dongwooooooo Dec 6, 2025
a080e48
래빗 리뷰
dongwooooooo Dec 6, 2025
86c87ef
zoom 인증 경로 설정
dongwooooooo Dec 7, 2025
f953881
zoom 웹훅 이벤트 body 실종 수정
dongwooooooo Dec 7, 2025
5591e9a
spotlessApply
dongwooooooo Dec 7, 2025
be72a68
zoom 인증 경로 설정
dongwooooooo Dec 7, 2025
5213a47
zoomWebhook filter에서 aop로 인증 변경
dongwooooooo Dec 7, 2025
dc53254
spotlessApply
dongwooooooo Dec 7, 2025
0b812e2
zoom 12시 이후로 나가면 조회 못하는 에러 해결
dongwooooooo Dec 10, 2025
02288ea
spotlessApply
dongwooooooo Dec 10, 2025
695f534
Merge pull request #132 from Techeer-Hogwarts/BACKEND-193
dongwooooooo Dec 10, 2025
8f5c10b
feat: 부트캠프 목록 조회 응답값 수정
kimzini Dec 21, 2025
adaa34b
feat: 부트캠프 목록 조회 응답값 수정
kimzini Dec 21, 2025
4da0d5a
setting: resume id 추가
yuripbong Nov 12, 2025
38f3f52
feat: 이력서 크롤링 실패 처리
yuripbong Nov 12, 2025
e03446c
feat: 이력서 작업 처리 상태 감지
yuripbong Nov 12, 2025
1c4058b
feat: 이력서 크롤링 실패 분류
yuripbong Nov 12, 2025
e407487
feat: 이력서 Id 추출
yuripbong Nov 12, 2025
97b0cf7
feat: 이력서 처리 작업 모니터링
yuripbong Nov 12, 2025
841726c
feat: 이력서 크롤링 실패 슬랙 알림
yuripbong Nov 12, 2025
f9c0570
style: 포맷팅
yuripbong Nov 13, 2025
44ea627
setting: 도커 이미지 변경
yuripbong Nov 14, 2025
94bef45
fix: 알림 중복 발송 방지
yuripbong Nov 15, 2025
7cf8f14
fix: 레디스 조회 null 검사
yuripbong Nov 15, 2025
4c23268
refactor: SCAN 기반 조회 적용
yuripbong Nov 20, 2025
c8c3d00
fix: 알림 발송 완료 태스크 정리
yuripbong Nov 20, 2025
b8ad0a8
Merge branch 'BACKEND-166' of https://github.com/Techeer-Hogwarts/bac…
yuripbong Jan 7, 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
49 changes: 24 additions & 25 deletions .github/workflows/other.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,32 @@ jobs:
steps:
- uses: actions/checkout@v4

# - name: Set up JDK 21
# uses: actions/setup-java@v3
# with:
# java-version: '21'
# distribution: 'temurin'
# cache: gradle
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
cache: gradle

# - name: Grant execute permission for gradlew
# run: |
# cd techeerzip
# chmod +x gradlew
- name: Grant execute permission for gradlew
run: |
cd techeerzip
chmod +x gradlew

# - name: Run tests with coverage
# run: |
# cd techeerzip
# ./gradlew test jacocoTestReport
- name: Run tests with coverage
run: |
cd techeerzip
./gradlew test jacocoTestReport

# - name: Publish Jacoco coverage report
# uses: PavanMudigonda/[email protected]
# with:
# coverage_results_path: techeerzip/build/reports/jacoco/test/jacocoTestReport.xml
# coverage_paths: techeerzip/build/reports/jacoco/test/html/index.html
# github_token: ${{ secrets.GITHUB_TOKEN }}
# minimum_coverage: 30
# fail_below_threshold: false
# output_level: inline
# coverage_report_name: JaCoCo Coverage
- name: Publish Jacoco coverage report
uses: Madrapps/[email protected]
with:
paths: techeerzip/build/reports/jacoco/test/jacocoTestReport.xml
token: ${{ secrets.GITHUB_TOKEN }}
min-coverage-overall: 30
min-coverage-changed-files: 30
title: Code Coverage
update-comment: true

- name: Show build number
run: |
Expand Down Expand Up @@ -76,4 +75,4 @@ jobs:
docker buildx build \
--platform linux/amd64 \
--push \
-t ${{ secrets.DOCKER_HUB_USERNAME }}/techeerism-spring:$DOCKER_IMAGE_TAG .
-t ${{ secrets.DOCKER_HUB_USERNAME }}/techeerism-spring:$DOCKER_IMAGE_TAG .
199 changes: 199 additions & 0 deletions .rules/.cursorrules.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
# Spring Boot Development Rules for Cursor AI

## 역할
당신은 Spring Boot 전문 개발자입니다. 클린 코드와 Best Practice를 준수하며, 유지보수 가능한 코드를 작성합니다.

## 전역 예외 처리 (Global Exception Handling)

### 원칙
- 모든 예외는 `@RestControllerAdvice`를 사용한 전역 예외 핸들러에서 처리
- 비즈니스 예외는 커스텀 예외 클래스를 생성하여 사용
- 예외 발생 시 일관된 형식의 에러 응답 반환
- 예외 처리 시 적절한 HTTP 상태 코드 사용

### 구현 요구사항
- `GlobalExceptionHandler` 클래스 생성 (`@RestControllerAdvice` 사용)
- 커스텀 예외: `CustomException` 또는 도메인별 예외 클래스 (예: `UserNotFoundException`)
- 에러 응답 DTO: `ErrorResponse` 클래스 (code, message, timestamp, errors 필드 포함)
- 주요 예외 처리:
- `CustomException`: 비즈니스 로직 예외
- `MethodArgumentNotValidException`: 유효성 검증 실패
- `HttpRequestMethodNotSupportedException`: 잘못된 HTTP 메서드
- `Exception`: 예상치 못한 예외

## 에러 코드 (Error Code)

### 원칙
- 모든 에러는 고유한 에러 코드를 가짐
- 에러 코드는 Enum으로 관리
- 에러 코드 네이밍: `도메인_상황` (예: `USER_NOT_FOUND`, `INVALID_INPUT`)
- HTTP 상태 코드와 에러 메시지를 함께 관리

### 구조
```
ErrorCode Enum 필드:
- HttpStatus status (HTTP 상태 코드)
- String code (에러 코드, 예: "U001")
- String message (에러 메시지)

카테고리별 에러 코드:
- Common (C001~): 공통 에러 (잘못된 입력, 서버 오류 등)
- User (U001~): 사용자 관련
- Auth (A001~): 인증/인가 관련
- (도메인별로 추가)
```

## Swagger (API 문서화)

### 원칙
- 모든 API는 Swagger로 문서화
- 성공/실패 케이스 모두 명시
- 예외 상황별 응답 예시 작성

### 어노테이션 사용
- 클래스: `@Tag(name, description)`
- 메서드: `@Operation(summary, description)`
- 응답: `@ApiResponses` (성공 200, 실패 4xx/5xx 모두 명시)
- 파라미터: `@Parameter(description, required)`
- 요청/응답 모델: `@Schema(description, example)`

### 실패 테스트 필수
모든 API에 대해 다음 케이스 문서화:
- 성공 케이스 (200, 201)
- 잘못된 입력 (400)
- 인증 실패 (401)
- 권한 없음 (403)
- 리소스 없음 (404)
- 서버 오류 (500)

## 클린 코드 (Clean Code)

### SRP (Single Responsibility Principle)
- 하나의 클래스/메서드는 하나의 책임만 가짐
- Controller: 요청/응답 처리만
- Service: 비즈니스 로직만
- Repository: 데이터 접근만
- Validator: 유효성 검증만
- 책임이 여러 개면 클래스/메서드 분리

### 네이밍 규칙
- 클래스명: PascalCase, 명사 (예: UserService, OrderController)
- 메서드명: camelCase, 동사+명사 (예: createUser, findById)
- 변수명: camelCase, 명확한 의미 (예: userId, userEmail)
- 상수명: UPPER_SNAKE_CASE
- Boolean: is/has/can으로 시작 (예: isActive, hasPermission)

### 메서드 작성
- 메서드는 20줄 이내로 작성
- 한 가지 작업만 수행
- Early Return 패턴 사용
- 깊은 중첩 지양 (최대 2depth)

### 주석
- 코드로 설명 가능한 부분은 주석 작성 금지
- Why는 주석으로, What은 코드로
- 복잡한 비즈니스 로직만 주석 작성

## 패키지 구조

### 도메인 중심 구조 (권장)
```
src/main/java/com/example/project/
├── domain/
│ ├── user/
│ │ ├── controller/
│ │ ├── service/
│ │ ├── repository/
│ │ ├── entity/
│ │ └── dto/
│ ├── order/
│ └── ...
├── global/
│ ├── config/
│ ├── exception/
│ ├── common/
│ └── util/
└── Application.java
```

### 계층별 책임
- **controller**: API 엔드포인트, 요청 검증
- **service**: 비즈니스 로직, 트랜잭션 관리
- **repository**: 데이터 접근
- **entity**: JPA 엔티티
- **dto**: Request/Response 객체
- **global/exception**: 전역 예외 처리
- **global/config**: 설정 클래스
- **global/common**: 공통 상수, Enum

## 환경 변수 (.env)

### 원칙
- 민감 정보는 절대 코드에 하드코딩 금지
- `.env` 파일 또는 `application-{profile}.yml` 사용
- `.gitignore`에 환경 파일 추가

### 관리 대상
- 데이터베이스 접속 정보
- API 키 (외부 서비스)
- JWT Secret Key
- 이메일 SMTP 정보
- 포트 번호
- 프로필별 설정값

### 사용 방법
```yaml
# application.yml
spring:
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
```

## 코드 작성 시 필수 체크리스트

### API 개발 시
- [ ] 전역 예외 처리 적용
- [ ] 에러 코드 정의
- [ ] Swagger 문서화 (성공/실패 케이스)
- [ ] DTO Validation (`@Valid`, `@NotNull` 등)
- [ ] 적절한 HTTP 상태 코드 반환

### 클래스 작성 시
- [ ] SRP 준수 (단일 책임)
- [ ] 적절한 패키지 위치
- [ ] 명확한 네이밍
- [ ] 불필요한 주석 제거
- [ ] 매직 넘버/문자열 상수화

### 보안
- [ ] 민감 정보 환경 변수 처리
- [ ] SQL Injection 방어 (JPA 사용)
- [ ] XSS 방어
- [ ] 적절한 권한 검증

## 코드 리뷰 기준
코드를 제안할 때 다음을 자동으로 검토하고 개선점 제시:
1. 예외 처리가 적절한가?
2. SRP를 위반하지 않는가?
3. 네이밍이 명확한가?
4. 불필요한 코드는 없는가?
5. 보안 이슈는 없는가?

---

## 코드 생성 시 기본 템플릿

새로운 도메인 기능 추가 시 다음 순서로 생성:
1. Entity 정의
2. Repository 인터페이스
3. DTO (Request/Response)
4. Service (인터페이스 + 구현체)
5. Controller
6. 커스텀 예외 클래스
7. ErrorCode 추가
8. Swagger 문서화
9. 테스트 코드

이 규칙을 항상 준수하며 코드를 작성하고, 규칙 위반 시 개선 방안을 제시하세요.
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM openjdk:21-slim AS builder
FROM eclipse-temurin:21-jdk AS builder
WORKDIR /app
RUN apt-get update && apt-get install -y findutils wget
COPY ./techeerzip/ /app/
Expand All @@ -8,7 +8,7 @@ RUN ./gradlew clean spotlessApply bootJar --no-daemon -x test
# OpenTelemetry Java Agent 다운로드
RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.5.0/opentelemetry-javaagent.jar

FROM openjdk:21-slim
FROM eclipse-temurin:21-jre
RUN apt-get update \
&& apt-get install -y --no-install-recommends ffmpeg \
&& rm -rf /var/lib/apt/lists/*
Expand Down
Loading
Loading