Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
304 commits
Select commit Hold shift + click to select a range
7ee23e1
refactor: 불필요한 파일 삭제 (#166)
Jimin730 Jul 22, 2025
520edb9
refactor: Service 네임 변경 (#166)
Jimin730 Jul 22, 2025
1871d3a
refactor: swagger docs 파일 분리 (#166)
Jimin730 Jul 22, 2025
ab33318
refactor: 회원 Service, controller 메서드 분리 (#166)
Jimin730 Jul 22, 2025
2ecd4e0
refactor: 슬래시 누락 수정 (#166)
Jimin730 Jul 23, 2025
5f37220
[REFACTOR] 회원 도메인 클래스 파일 책임 분리
Jimin730 Jul 23, 2025
c8d0917
refactor: auth 패키지 추가 및 관련 파일 이동 (#175)
Jimin730 Jul 23, 2025
d3b1b4c
refactor: response 파일 패키지 이동 (#175)
Jimin730 Jul 23, 2025
bc2da4a
[REFACTOR] auth 패키지 추가 및 패키지 구조 변경
Jimin730 Jul 23, 2025
e34a068
bug: objectMapper 설정 추가 (#178)
Jimin730 Jul 23, 2025
518c8ba
refactor: RedisConfig 수정 (#179)
Jimin730 Jul 23, 2025
7a483ee
[BUG] 로그아웃 시 Redis Duration 타입 직렬화/역직렬화 오류
Jimin730 Jul 24, 2025
ef6f0ba
refactor: 로그인 로직에 http only 및 secure cookie 적용 (#168)
Jimin730 Jul 23, 2025
c3567ac
refactor: TokenError 경로 수정 (#168)
Jimin730 Jul 23, 2025
f51a9b1
refactor: 토큰 재발급 로직 리팩토링 (#168)
Jimin730 Jul 23, 2025
991dfc6
refactor: 토큰 재발급 로직 수정 (#168)
Jimin730 Jul 23, 2025
838c6a0
refactor: @CookieValue 적용 (#168)
Jimin730 Jul 23, 2025
f8cb95e
refactor: setCookie 메서드 분리 (#168)
Jimin730 Jul 24, 2025
347a28b
refactor: Success 이름 변경 (#168)
Jimin730 Jul 24, 2025
b4dccbf
refactor: 상수 필드 적용 (#168)
Jimin730 Jul 24, 2025
697e2ae
[REFACTOR] Http only 적용
Jimin730 Jul 24, 2025
550cfbc
fix: 엔티티 관계 및 제약조건 수정 (#181)
Friox Jul 24, 2025
1f9e437
fix: leftjoin 조건 수정 및 null check 로직 추가 (#181)
Friox Jul 24, 2025
d304e0e
[FIX] Booking 도메인 리팩토링 후 노선 중간 구간 예매 불가
Friox Jul 24, 2025
632178a
feat: 로그아웃 시 cookie 값 만료 로직 추가 (#183)
Jimin730 Jul 24, 2025
842f9e7
feat: @CookieValue required 속성 추가 (#183)
Jimin730 Jul 24, 2025
b819d82
refactor: 중복된 코드 메서드 분리 (#183)
Jimin730 Jul 24, 2025
5022115
refactor: CookieManager 유틸 클래스로 cookie 관련 메서드 관리 (#183)
Jimin730 Jul 24, 2025
fe78fb9
[FEATURE] 로그아웃 시 Cookie에 담긴 refreshToken 만료 로직 추가
Jimin730 Jul 24, 2025
3d1b7bb
refactor: TokenProvider 책임 분리 (#185)
Jimin730 Jul 24, 2025
1b99193
refactor: 주석 수정 (#185)
Jimin730 Jul 24, 2025
21efc24
[REFACTOR] TokenProvider 클래스 책임 분리
Jimin730 Jul 25, 2025
3baafc5
feat: AOP 기반 쿼리 성능 모니터링 시스템 구현 (#177)
Ogu1208 Jul 23, 2025
6da45b1
fix: 구간 겹침 판단 로직을 station.id → stopOrder 기반으로 수정 (#177)
Ogu1208 Jul 23, 2025
845d5bb
fix: 객차 내 모든 좌석 상세 조회 쿼리에서 잘못된 LEFT JOIN 조건 수정 (#177)
Ogu1208 Jul 23, 2025
653a2c4
refactor: Q객체 변수명을 축약어에서 풀 네이밍으로 변경하여 가독성 향상 (#177)
Ogu1208 Jul 23, 2025
e4eff4d
feat: 열차 조회 성능 개선 - N+1 문제 해결을 위한 배치 쿼리 도입 (#177)
Ogu1208 Jul 24, 2025
6edaeb5
refactor: 좌석 상태 판별 로직 개선 및 역할 분리 (#177)
Ogu1208 Jul 24, 2025
c7e8cbf
refactor: 성능 측정용 모니터링 AOP 코드 정리 (#177)
Ogu1208 Jul 24, 2025
3236611
refactor: 쿼리 확인 및 측정용 yml 설정 제거 (#177)
Ogu1208 Jul 24, 2025
701338f
refactor: 사용하지 않는 기존 열차 조회 단일 N+1 조회 쿼리 제거 (#177)
Ogu1208 Jul 24, 2025
627119d
refactor: 사용하지 않는 열차 조회 관련 쿼리, DTO 제거 (#177)
Ogu1208 Jul 25, 2025
48d9d9e
[FEATURE] 열차 조회 로직 및 배치 쿼리로 N+1 개선 #177
Ogu1208 Jul 25, 2025
b51cb94
refactor: 사용하지 않는 컨트롤러 삭제 (#161)
Yunsung-Jo Jul 23, 2025
a79cd33
refactor: 티켓 엔티티에서 운임 제거 (#161)
Yunsung-Jo Jul 24, 2025
7805c90
feat: 운임을 Reservation에서 조회하도록 수정 (#161)
Yunsung-Jo Jul 24, 2025
8640790
feat: 예약 생성에 운임 계산 로직 추가 (#161)
Yunsung-Jo Jul 24, 2025
cfb869a
feat: 운임 선택 로직을 메서드로 분리 (#161)
Yunsung-Jo Jul 25, 2025
a6cf553
[FEATURE] 운임 조회 로직 개선
Yunsung-Jo Jul 25, 2025
92d385b
feat: 예약 만료 ErrorCode 추가 (#165)
Friox Jul 27, 2025
a7a38ac
feat: 만료된 예약을 검색하는 메서드 추가 (Pageable) (#165)
Friox Jul 27, 2025
2127c2d
feat: 예약 삭제 스케줄러 실행 시간 조정 (#165)
Friox Jul 27, 2025
d919e3f
feat: 예약 조회 시점에 만료된 예약이 삭제되도록 구현 (#165)
Friox Jul 27, 2025
15ed7b6
feat: 만료 예약 검색 Pageable 적용 (#165)
Friox Jul 27, 2025
2cef4c6
feat: 예약 삭제 메서드 일부 어노테이션 삭제, 호출 관계 수정 (#165)
Friox Jul 28, 2025
d44e91c
[FEATURE] 만료된 예약 삭제 로직 개선
Friox Jul 28, 2025
2632330
refactor: ReservationService 메서드 분리
chanwonlee Jul 26, 2025
7dd1216
fix: 좌석 예약 충돌 해결을 위한 비관적 락 구현
chanwonlee Jul 26, 2025
00468d8
chore: SeatReservation의 version 필드 제거
chanwonlee Jul 26, 2025
3b54322
[BUG] 좌석 충돌 예약 발생 오류
chanwonlee Jul 28, 2025
9438d94
feat: 결제 상태 Enum 클래스 구현 (#171)
EndlessMilkyway Jul 28, 2025
311dd7e
feat: 결제 수단 Enum 클래스 구현 (#171)
EndlessMilkyway Jul 28, 2025
81db8fb
feat: 결제 성공 코드 Enum 클래스 구현 (#171)
EndlessMilkyway Jul 28, 2025
1f5e1d1
feat: 결제 실패 코드 Enum 클래스 구현 (#171)
EndlessMilkyway Jul 28, 2025
1cffced
feat: Payment 엔티티 클래스 구현 (#171)
EndlessMilkyway Jul 28, 2025
4d6d774
feat: PaymentRepository 구현 (#171)
EndlessMilkyway Jul 28, 2025
c9ea9f9
feat: 결제 처리 요청 DTO 구현 (#171)
EndlessMilkyway Jul 28, 2025
630748b
feat: 결제 처리 응답 DTO 구현 (#171)
EndlessMilkyway Jul 28, 2025
1fd351a
feat: 결제 취소 응답 DTO 구현 (#171)
EndlessMilkyway Jul 28, 2025
13466b1
feat: 결제 목록 응답 DTO 구현 (#171)
EndlessMilkyway Jul 28, 2025
737d034
refactor: 사용하지 않는 리파지토리 메서드 제거 (#171)
EndlessMilkyway Jul 28, 2025
f9ef0cd
feat: PaymentInfo DTO 구현 (#171)
EndlessMilkyway Jul 28, 2025
05787f7
refactor: 열차 조회 좌석 상태 판정 로직 개선, 중복 변수 및 로직 개선 (#197)
Ogu1208 Jul 28, 2025
2a573ef
feat: 열차 전체 인원 조회, 객차 타입별 인원 조회 쿼리 통합 (#197)
Ogu1208 Jul 29, 2025
6c42dbb
refactor: 열차 조회 서비스 클래스 네이밍 변경, 행 정렬 (#197)
Ogu1208 Aug 2, 2025
ea6c908
[REFACTOR] 열차 조회 로직 개선
Ogu1208 Aug 2, 2025
67881b5
chore: 테스트 lombok 라이브러리 추가 (#195)
chanwonlee Jul 28, 2025
a250636
test: TrainFixture 추가 (#195)
chanwonlee Jul 28, 2025
8bdba52
test: MemberFixture 추가 (#195)
chanwonlee Jul 29, 2025
f9bd7c0
test: TrainTestHelper 좌석 조회 기능 추가 (#195)
chanwonlee Jul 29, 2025
63beace
test: TrainScheduleTestHelper 클래스 추가 (#195)
chanwonlee Jul 29, 2025
c3824f7
chore: 패키지명 변경 util -> helper (#195)
chanwonlee Jul 29, 2025
6ef2996
refactor: createReservation 파라미터 변경 (#195)
chanwonlee Jul 29, 2025
eca56f5
test: 예약 성공 테스트 구현 (#195)
chanwonlee Jul 29, 2025
16f0422
fix: 좌석 조회 시 limit를 SQL에서 처리하도록 수정 (#195)
chanwonlee Jul 30, 2025
2dd34ae
fix: @Param import문 수정 (#195)
chanwonlee Aug 2, 2025
4391495
refactor: fixture 메서드명 개선 (#195)
chanwonlee Aug 2, 2025
4d223a8
refactor: ReservationServiceTest 코드 구조 개선 (#195)
chanwonlee Aug 2, 2025
99ab9d9
[TEST] 기차 테스트 Helper 클래스 추가
chanwonlee Aug 3, 2025
e949c42
feat: @SoftDelete 어노테이션 추가 (#190)
Jimin730 Jul 26, 2025
cf5a2b8
chore: spring batch 관련 설정 추가 (#190)
Jimin730 Jul 28, 2025
a41b54a
feat: 회원 영구 삭제 배치 설정 및 스케줄러 구현 (#190)
Jimin730 Jul 28, 2025
e406c3b
feat: 배치 작업을 위한 쿼리 추가 (#190)
Jimin730 Aug 2, 2025
4d516b7
refactor: 로그 추가 (#190)
Jimin730 Aug 2, 2025
a85a51a
feat: nativeQuery 사용 (#190)
Jimin730 Aug 2, 2025
3aa0956
feat: 불필요한 코드 제거 (#190)
Jimin730 Aug 2, 2025
05444ae
refactor: @SQLRestriction 사용 및 softDelete() 메서드 추가 (#190)
Jimin730 Aug 4, 2025
4337604
refactor: @SQLDelete 사용 (#190)
Jimin730 Aug 4, 2025
8c76e51
refactor: 삭제 조회 3년으로 정책 변경 (#190)
Jimin730 Aug 4, 2025
a929249
feat: @OnDelete 어노테이션 추가 (#190)
Jimin730 Aug 4, 2025
f5221ce
feat: isDelete 명시적 false 추가 (#190)
Jimin730 Aug 5, 2025
fc8f989
feat: stream 사용으로 변경 (#190)
Jimin730 Aug 5, 2025
17906e9
feat: 인덱스 적용 (#190)
Jimin730 Aug 5, 2025
698e00c
feat: 재시도 로직 추가 (#190)
Jimin730 Aug 5, 2025
239d3d3
feat: id값만 받아오도록 쿼리 수정 (#190)
Jimin730 Aug 5, 2025
03a001c
[FEATURE] 회원 삭제 soft delete 방식 구현
Jimin730 Aug 5, 2025
3910c8f
feat: 좌석 예약 저장소에서 특정 예약에 속한 Seat와 PassengerType을 받아오는 메서드 구현 (#200)
EndlessMilkyway Aug 3, 2025
fb60c73
feat: ReservationStatus 환불 가능 여부 메서드 수정 (#200)
EndlessMilkyway Aug 3, 2025
0ad9b3c
feat: Reservation 엔티티에 결제 처리, 결제 취소, 결제 환불 관련 메서드 구현 (#200)
EndlessMilkyway Aug 3, 2025
01311bd
feat: Payment 엔티티 환불 가능 여부 확인 메서드 수정 (#200)
EndlessMilkyway Aug 3, 2025
7cdb84a
feat: 결제 관련 로직 처리 시 예약과 티켓 관련 처리를 수행하는 PaymentBookingService 구현 (#200)
EndlessMilkyway Aug 3, 2025
3bdd223
feat: 결제 승인 불가 에러 코드 추가 (#200)
EndlessMilkyway Aug 3, 2025
6f102fc
feat: 결제 고유 코드 생성 클래스 추가 (#200)
EndlessMilkyway Aug 3, 2025
600bee7
feat: ReservationApplicationService의 티켓 생성 로직 비활성화 (#200)
EndlessMilkyway Aug 3, 2025
3327d51
feat: 티켓 발행 시 필요한 좌석 관련 정보들을 정의한 SeatInfoProjection 구현 (#200)
EndlessMilkyway Aug 3, 2025
c20d7ab
feat: 결제 승인 서비스 레이어 구현 (#200)
EndlessMilkyway Aug 4, 2025
ca1567c
feat: 결제 승인 컨트롤러 레이어 구현 (#200)
EndlessMilkyway Aug 4, 2025
b9b011d
feat: PaymentBookingService 삭제 및 통합 (#200)
EndlessMilkyway Aug 4, 2025
09d97b6
feat: ReservationApplicationService 티켓 생성 코드 삭제 (#200)
EndlessMilkyway Aug 4, 2025
c92994c
feat: 결제 요청 DTO 결제 수단 별로 분리 (#200)
EndlessMilkyway Aug 4, 2025
6ba455b
feat: DTO 수정에 따른 결제 요청 서비스 레이어 수정 (#200)
EndlessMilkyway Aug 4, 2025
a8fe96d
feat: DTO 수정에 따른 결제 요청 컨트롤러 레이어 수정 (#200)
EndlessMilkyway Aug 4, 2025
533cf7e
feat: PaymentBookingService 삭제 및 통합
EndlessMilkyway Aug 4, 2025
e8e5bb8
fix: 충돌 수정 (#200)
EndlessMilkyway Aug 4, 2025
aac0d01
refactor: 금액 유효성 검증 부분 제거 (#200)
EndlessMilkyway Aug 5, 2025
beea003
[FEATURE] 결제 처리 기능 구현
EndlessMilkyway Aug 5, 2025
2fbd72b
fix: MemberNo -> memberNo 수정 (#212)
chanwonlee Aug 5, 2025
a29e899
fix: 데이터 클리너 DELETE -> TRUNCATE 변경 (#212)
chanwonlee Aug 5, 2025
8dd0c12
refactor: trainFixture를 TrainTestHelper로 통합 (#212)
chanwonlee Aug 5, 2025
d161343
feat: 커스텀 기차 생성 메서드 구현(#212)
chanwonlee Aug 5, 2025
43ba86a
refactor: 스케줄 생성 객체 간소화 (#212)
chanwonlee Aug 5, 2025
3da447f
refactor: ReservationService 테스트 개선 (#212)
chanwonlee Aug 5, 2025
338082e
refactor: trainSchedule의 도착, 출발 시간을 자동으로 할당 (#212)
chanwonlee Aug 5, 2025
65e9fb1
[REFACTOR] TestFixture 코드 축소 및 커스텀 생성 기능 추가
chanwonlee Aug 5, 2025
d56c2cd
feat: SeatReservation 삭제 메서드 구현 (서비스, 레포지토리) (#203)
Friox Aug 4, 2025
c59a211
feat: Ticket 삭제 메서드 구현 (서비스, 레포지토리) (#203)
Friox Aug 4, 2025
d92913d
feat: SeatReservation, Ticket 404 ErrorCode 추가 (#203)
Friox Aug 4, 2025
8850fa6
feat: cancelReservation 메서드 구현 (#203)
Friox Aug 4, 2025
70dc331
feat: Ticket - QR CASCADE REMOVE 설정 (#203)
Friox Aug 5, 2025
6127eef
docs: 주석 제거 (#203)
Friox Aug 5, 2025
5e2c471
refactor: 코드 포매팅 (#203)
Friox Aug 5, 2025
1eea10a
feat: Transactional 어노테이션 추가, 메서드 재배치 (#203)
Friox Aug 5, 2025
f31f139
feat: Transactional 어노테이션 추가 (#203)
Friox Aug 5, 2025
873f744
[FEATURE] Payment 관련 Reservation 서비스 메서드 추가
Friox Aug 5, 2025
865564d
feat: 결제 내역 조회 시 사용할 프로젝션 구현 (#211)
EndlessMilkyway Aug 5, 2025
83c245f
feat: 결제 내역 조회 시 QueryDSL을 사용하기 위해 리파지토리 인터페이스 구현 (#211)
EndlessMilkyway Aug 5, 2025
b598596
feat: QueryDSL 인터페이스에 대한 클래스 구현 (#211)
EndlessMilkyway Aug 5, 2025
4381aaf
feat: Payment 리파지토리 레이어에 QueryDSL 리파지토리 상속관계 추가 (#211)
EndlessMilkyway Aug 5, 2025
18dedd5
feat: 결제 취소 컨트롤러 레이어 구현 (#211)
EndlessMilkyway Aug 5, 2025
d9e6c36
feat: 결제 취소 및 환불 서비스 레이어 구현 (#211)
EndlessMilkyway Aug 5, 2025
4096711
refactor: 예약 상태를 취소로 변경하는 메서드 이동 (#211)
EndlessMilkyway Aug 5, 2025
eefbf1c
refactor: 결제 내역 조회 컨트롤러 레이어 구현 (#211)
EndlessMilkyway Aug 5, 2025
6e13581
refactor: 결제 내역 조회 서비스 레이어 구현 (#211)
EndlessMilkyway Aug 5, 2025
1241d45
[FEATURE] 결제 취소 기능 및 결제 내역 조회 기능 구현
EndlessMilkyway Aug 6, 2025
c4b1a49
feat: 멤버 ID로 모든 Reservation을 삭제하는 레포지토리 메서드 추가 (#209)
Friox Aug 6, 2025
b6004b0
feat: 멤버 ID로 모든 Reservation을 삭제하는 서비스 메서드 추가 (#209)
Friox Aug 6, 2025
19d5148
feat: 멤버로 모든 Reservation을 삭제하는 서비스 메서드 추가 (#209)
Friox Aug 6, 2025
83307ed
feat: memberDelete 메서드 ReservationApplicationService 연동 (#209)
Friox Aug 6, 2025
80e3964
[FEATURE] Member soft-delete 관련 Reservation 서비스 메서드 추가
Friox Aug 6, 2025
2d48d1b
fix: allowed-origins 잘못된 입력값 수정 (#226)
chanwonlee Aug 6, 2025
a414f43
fix: SameSite=None 누락으로 인한 쿠키 미전송 문제 해결 (#226)
chanwonlee Aug 6, 2025
72b6bdd
[BUG] 프론트 연동 오류
chanwonlee Aug 6, 2025
24eb40c
test: ReservationTestHelper 클래스 추가 (#202)
Yunsung-Jo Aug 6, 2025
fd9be1a
test: MemberFixture에 OTHER_MEMBER 추가(#202)
Yunsung-Jo Aug 6, 2025
3f9bcd0
test: 좌석 조회 메서드 추가 (#202)
Yunsung-Jo Aug 6, 2025
f328ee9
test: 장바구니 기능 테스트 코드 작성 (#202)
Yunsung-Jo Aug 6, 2025
9546c57
test: 빈 응답 테스트 추가 (#202)
Yunsung-Jo Aug 6, 2025
638a35c
[TEST] 장바구니 기능 테스트
Yunsung-Jo Aug 7, 2025
41cea72
test: jwt key 길이 조정 (#218)
Jimin730 Aug 6, 2025
e9a7941
test: auth 관련 테스트 코드 작성 (#218)
Jimin730 Aug 6, 2025
ad59a8f
test: 로그아웃 분기 테스트 추가 (#218)
Jimin730 Aug 6, 2025
4dbc62e
test: 줄바꿈 수정 (#218)
Jimin730 Aug 6, 2025
1c7b364
test: 중복 코드 분리 (#218)
Jimin730 Aug 7, 2025
33fb9ff
test: updatePassword 메서드 사용 (#218)
Jimin730 Aug 7, 2025
c758f12
[TEST] AuthService 테스트 코드 작성
Jimin730 Aug 7, 2025
0997689
test: 기본 이메일 전송 및 검증 테스트 코드 작성 (#219)
Jimin730 Aug 6, 2025
0bf5b75
test: greenMail 라이브러리 의존성 추가 (#219)
Jimin730 Aug 6, 2025
ac1c99f
test: greenMail 관련 설정 추가 (#219)
Jimin730 Aug 6, 2025
425fec1
test: 회원번호 찾기 요청 및 검증 테스트 코드 작성 (#219)
Jimin730 Aug 6, 2025
edd37d3
test: 비밀번호 찾기 요청 및 검증 테스트 코드 작성 (#219)
Jimin730 Aug 6, 2025
7046cd8
test: 휴대폰 번호, 비밀번호 변경 테스트 코드 작성 (#219)
Jimin730 Aug 6, 2025
525dc77
test: 이메일 변경 테스트 코드 작성 (#219)
Jimin730 Aug 6, 2025
3417f51
test: 코드 줄바꿈 (#219)
Jimin730 Aug 6, 2025
d871158
test: MockMailConfig 제거 (#219)
Jimin730 Aug 6, 2025
b463e3f
[TEST] 이메일 인증 관련 테스트 코드 작성
Jimin730 Aug 7, 2025
f035fb5
fix: parseClaims 접근제어자 protected -> public로 변경 (#208)
chanwonlee Aug 6, 2025
bf458cd
chore: token 관련 클래스 테스트 커버리지 추가 (#208)
chanwonlee Aug 6, 2025
15160a9
test: TokenGenerator 테스트 코드 작성 (#208)
chanwonlee Aug 6, 2025
a50e476
test: TokenExtractor 테스트 코드 작성 (#208)
chanwonlee Aug 6, 2025
573460a
test: TokenValidator 테스트 코드 작성 (#208)
chanwonlee Aug 6, 2025
69ec243
refactor: 불필요한 @Autowired 제거 (#208)
chanwonlee Aug 7, 2025
fa2fe63
refactor: given, when, then 주석 추가 (#208)
chanwonlee Aug 7, 2025
56e2f6f
[TEST] Token 기능 테스트
chanwonlee Aug 7, 2025
b5daed6
test: 비회원 등록, 회원 정보 조회 테스트 코드 작성 (#205)
Jimin730 Aug 5, 2025
0dc1398
test: 회원 이메일 조회 테스트 코드 작성 (#205)
Jimin730 Aug 5, 2025
d5f1901
test: 회원번호 생성 테스트 코드 작성 (#205)
Jimin730 Aug 6, 2025
2da612f
test: 회원 삭제 테스트 코드 작성 (#205)
Jimin730 Aug 6, 2025
fc772ea
[TEST] Member 서비스 테스트 코드 작성
Jimin730 Aug 7, 2025
5a04921
refactor: getMyTickets 메서드에서 username을 사용하도록 변경 (#225)
Friox Aug 6, 2025
09e1945
refactor: getMyTickets 메서드에서 username을 서비스로 전달하도록 변경 (#225)
Friox Aug 6, 2025
1ed11ed
docs: getMyTickets 메서드 주석 삭제 (#225)
Friox Aug 6, 2025
5b42c2c
[REFACTOR] Ticket - getMyTickets 매개변수 변경
Friox Aug 7, 2025
944ca18
test: ReservationService 테스트 코드 작성 (#210)
Friox Aug 6, 2025
8e8a979
test: SeatReservationService 테스트 코드 작성 (#210)
Friox Aug 6, 2025
0ecd569
test: TicketService 테스트 코드 작성 (#210)
Friox Aug 6, 2025
ebbdf09
refactor: SeatReservationService 테스트 코드 메서드명 수정 (#210)
Friox Aug 6, 2025
4ee5e35
refactor: TicketService 테스트 코드 메서드명 수정 (#210)
Friox Aug 6, 2025
fa83dd9
docs: 만료된 예약 조회 관련 테스트 DisplayName 변경 (#210)
Friox Aug 7, 2025
3707634
[TEST] Reservation 관련 서비스 테스트
Friox Aug 7, 2025
374615b
fix: seatReservationId 제거 (#236)
Friox Aug 7, 2025
b10a836
[BUG] Ticket 도메인 getMyTickets 관련 조회 오류 수정
Friox Aug 7, 2025
046446d
test: 운임 계산 테스트 코드 작성 (#216)
Yunsung-Jo Aug 6, 2025
5980b28
[TEST] 운임 계산 서비스 테스트
Yunsung-Jo Aug 7, 2025
f5cfdd6
test: ReservationApplicationService 테스트 코드 작성 (#207)
chanwonlee Aug 5, 2025
b86b3b5
fix: 객차 타입 조회 로직 수정 (#207)
chanwonlee Aug 5, 2025
bded490
fix: DTO로 전달된 승객 정보 List를 복사해서 사용하도록 수정 (#207)
chanwonlee Aug 5, 2025
0a6f63f
fix: 운행 순서 검증 로직 추가 (#207)
chanwonlee Aug 5, 2025
1953d65
test: 잘못된 운행 순서 예외 테스트 추가 (#207)
chanwonlee Aug 5, 2025
cf60b3c
test: 예매 동시성 테스트 코드 작성 (#207)
chanwonlee Aug 6, 2025
3e417fe
fix: 동시성 오류 해결을 위해 Seat 락 추가 (#207)
chanwonlee Aug 6, 2025
9e117b8
style: 테스트 메서드 네이밍 수정 (#207)
chanwonlee Aug 6, 2025
73e6ca4
refactor: given, when, then 주석 추가 (#207)
chanwonlee Aug 7, 2025
60cca6c
test: 조회한 SeatReservation 개수 검증 추가 (#207)
chanwonlee Aug 7, 2025
84a9cd1
refactor: 겹치는 구간 검증 위치 변경 (#207)
chanwonlee Aug 7, 2025
0401b11
[TEST] 예약 생성 기능 테스트
chanwonlee Aug 7, 2025
2137d98
test: TrainSeatQueryService 테스트 코드 작성 (#220)
chanwonlee Aug 6, 2025
b04061d
refactor: given, when, then 주석 추가 (#220)
chanwonlee Aug 7, 2025
81f3d5b
[TEST] TrainSeatQueryService 테스트
chanwonlee Aug 7, 2025
114294f
refactor: 열차 조회 Controller가 ApplicationService를 통해 접근하도록 수정 (#201)
Ogu1208 Aug 5, 2025
dffe89b
refactor: 추천 객차 선택 로직의 가독성 개선 (동작 동일) (#201)
Ogu1208 Aug 5, 2025
eacd679
test: TrainSearchApplicationService 테스트코드 작성 (각 메서드, 전체 플로우 시나리오) (#201)
Ogu1208 Aug 5, 2025
724f3c3
test: trainTestHelper, ReservationTestHelper에 커스텀 데이터 생성 메서드 추가 (#201)
Ogu1208 Aug 6, 2025
c3b3f45
test: 출발 시간 조건에 따라 해당 시간 이후 출발하는 열차들이 시간순으로 필터링되는지 확인 테스트 (#201)
Ogu1208 Aug 6, 2025
c31ba19
feat: 좌석 상태에서 AVAILABLE, LIMITED 기준을 전체 좌석의 25% 비율 기준으로 판단하도록 수정 (#201)
Ogu1208 Aug 6, 2025
8ead284
feat: 입석 가능 여부 판단 로직 수정 : 일반실 예약 불가능 && 입석 요청 인원 수용 가능 (#201)
Ogu1208 Aug 6, 2025
41a87f0
test: 다양한 기존 예약 상태에 따라 좌석 상태와 입석 정보의 표시 여부 검증 (#201)
Ogu1208 Aug 6, 2025
2da5e47
test: 열차 조회 - 입석 관련 좌석 및 상태 계산 , standingInfo 검증 테스트 (#201)
Ogu1208 Aug 6, 2025
25d9f21
test: 열차 조회 - 비즈니스적으로 잘못된 검색 조건일 경우 예외 발생 테스트 (#201)
Ogu1208 Aug 6, 2025
02eaf17
test: 열차 조회 - TrainSearchRequestTest DTO Validation 테스트 (#201)
Ogu1208 Aug 6, 2025
65307da
test: 다양한 검색 시나리오에서 검색 결과가 없을 경우 빈 리스트를 반환을 검증하는 테스트코드 작성 (#201)
Ogu1208 Aug 6, 2025
290c49a
test: 열차 조회 - 다구간으로 구간 예약 겹침(overlap)만 반영해 잔여 좌석을 정확히 계산하는지 테스트 (#201)
Ogu1208 Aug 6, 2025
ba0e6c7
test: 열차 조회 - 존재하지 않는 스케줄 ID 조회 오류, 페이징이 올바르게 동작(중복, 정렬)하는지 테스트(#201)
Ogu1208 Aug 6, 2025
baef7c9
test: 열차 조회 - 조회하는 구간의 요금 정보가 없는 경우 예외 발생 테스트 작성 (#201)
Ogu1208 Aug 6, 2025
6b1e5b5
test: TrainTestHelper 코드 충돌 해결 (#201)
Ogu1208 Aug 7, 2025
5f92551
test: 열차 조회 - 사용하지 않는 메서드 및 의존성 주입 삭제 (#201)
Ogu1208 Aug 7, 2025
d64f4a2
[TEST] 열차 조회 서비스 테스트(TrainSearchApplicationService, TrainSearchService)
Ogu1208 Aug 7, 2025
f404344
feat: PaymentFixture 구현 (#224)
EndlessMilkyway Aug 7, 2025
5461c86
feat: PaymentService 테스트 작성 (#224)
EndlessMilkyway Aug 7, 2025
e70d7a3
style: 코드 스타일 수정 (#224)
EndlessMilkyway Aug 7, 2025
e002f64
[TEST] 결제 관련 기능 테스트 코드 작성
EndlessMilkyway Aug 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 0 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,3 @@ out/

### VS Code ###
.vscode/

### dev.yml
application-dev.yml

2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ COPY --from=stage1 /app/build/libs/*.jar app.jar
COPY files ./files

# 실행 : CMD 또는 ENTRYPOINT를 통해 컨테이너를 배열 형태의 명령어로 실행
ENTRYPOINT ["java", "-jar", "app.jar"]
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "app.jar"]
55 changes: 55 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
id 'java'
id 'org.springframework.boot' version '3.5.0'
id 'io.spring.dependency-management' version '1.1.7'
id 'jacoco'
}

group = 'com.sudo'
Expand Down Expand Up @@ -30,13 +31,23 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.springframework.boot:spring-boot-starter-batch'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testRuntimeOnly 'com.h2database:h2'
testImplementation 'com.github.codemonstur:embedded-redis:1.4.3'
testImplementation "com.navercorp.fixturemonkey:fixture-monkey-starter:1.1.14"
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.batch:spring-batch-test'
testImplementation 'com.icegreen:greenmail:2.1.3'
testImplementation 'com.icegreen:greenmail-junit5:2.1.3'


/* JWT */
// https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api
Expand Down Expand Up @@ -83,3 +94,47 @@ clean {
delete file(querydslSrcDir)
}

test {
useJUnitPlatform()
finalizedBy 'jacocoTestReport'
}

jacoco {
toolVersion = '0.8.13'
}

jacocoTestReport {
reports {
html.required = true
xml.required = true
csv.required = false
}

afterEvaluate {
classDirectories.setFrom(
sourceSets.main.output.asFileTree.matching {
include "**/application/**"
include "**/infrastructure/*RepositoryCustomImpl.class"
include "**/security/jwt/Token*.class"
exclude "**/train/infrastructure/excel/**"
exclude "**/application/dto/**"
}
)
}

finalizedBy 'jacocoTestCoverageVerification'
}

jacocoTestCoverageVerification {
violationRules {
rule {
element = 'CLASS'

excludes = [
'*.test.*',
'*.Q*'
]
}
}
}

4 changes: 2 additions & 2 deletions k8s/depl_svc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ spec:
# 컨테이너가 사용할수 있는 리소스의 최대치
limits:
cpu: "1"
memory: "500Mi"
memory: "1Gi"
# 컨테이너가 시작될떄 보장받아야 하는 최소 자원
requests:
cpu: "0.5"
memory: "250Mi"
memory: "512Mi"
env:
# name값과 yml의 ${변수} 의 변수명과 일치해야함
- name: DB_URL
Expand Down
1 change: 1 addition & 0 deletions lombok.config
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lombok.addLombokGeneratedAnnotation = true
110 changes: 110 additions & 0 deletions src/main/java/com/sudo/railo/auth/application/AuthService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package com.sudo.railo.auth.application;

import java.time.Duration;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.sudo.railo.auth.application.dto.request.LoginRequest;
import com.sudo.railo.auth.application.dto.request.SignUpRequest;
import com.sudo.railo.auth.application.dto.response.ReissueTokenResponse;
import com.sudo.railo.auth.application.dto.response.SignUpResponse;
import com.sudo.railo.auth.application.dto.response.TokenResponse;
import com.sudo.railo.auth.exception.TokenError;
import com.sudo.railo.auth.security.jwt.TokenExtractor;
import com.sudo.railo.auth.security.jwt.TokenGenerator;
import com.sudo.railo.global.exception.error.BusinessException;
import com.sudo.railo.global.redis.AuthRedisRepository;
import com.sudo.railo.global.redis.LogoutToken;
import com.sudo.railo.member.application.MemberNoGenerator;
import com.sudo.railo.member.domain.Member;
import com.sudo.railo.member.domain.MemberDetail;
import com.sudo.railo.member.domain.Membership;
import com.sudo.railo.member.domain.Role;
import com.sudo.railo.member.exception.MemberError;
import com.sudo.railo.member.infrastructure.MemberRepository;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class AuthService {

private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
private final MemberNoGenerator memberNoGenerator;
private final AuthenticationManager authenticationManager;
private final TokenGenerator tokenGenerator;
private final TokenExtractor tokenExtractor;
private final AuthRedisRepository authRedisRepository;

@Transactional
public SignUpResponse signUp(SignUpRequest request) {

if (memberRepository.existsByMemberDetailEmail(request.email())) {
throw new BusinessException(MemberError.DUPLICATE_EMAIL);
}

String memberNo = memberNoGenerator.generateMemberNo();
LocalDate birthDate = LocalDate.parse(request.birthDate(), DateTimeFormatter.ISO_LOCAL_DATE);

MemberDetail memberDetail = MemberDetail.create(memberNo, Membership.BUSINESS, request.email(), birthDate,
request.gender());
Member member = Member.create(request.name(), request.phoneNumber(), passwordEncoder.encode(request.password()),
Role.MEMBER, memberDetail);

memberRepository.save(member);

return new SignUpResponse(memberNo);
}

@Transactional
public TokenResponse login(LoginRequest request) {

UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
request.memberNo(), request.password());

Authentication authentication = authenticationManager.authenticate(authenticationToken);
TokenResponse tokenResponse = tokenGenerator.generateTokenDTO(authentication);

// 레디스에 리프레시 토큰 저장
authRedisRepository.saveRefreshToken(request.memberNo(), tokenResponse.refreshToken());

return tokenResponse;
}

@Transactional
public void logout(String accessToken, String memberNo) {

// Redis 에서 해당 memberNo 로 저장된 RefreshToken 이 있는지 여부 확인 후, 존재할 경우 삭제
if (authRedisRepository.getRefreshToken(memberNo) != null) {
authRedisRepository.deleteRefreshToken(memberNo);
}

// 해당 AccessToken 유효 시간을 가져와 BlackList 에 저장
Duration expiration = tokenExtractor.getAccessTokenExpiration(accessToken);
LogoutToken logoutToken = new LogoutToken("logout", expiration);
authRedisRepository.saveLogoutToken(accessToken, logoutToken, expiration);
}

@Transactional
public ReissueTokenResponse reissueAccessToken(String refreshToken) {

String memberNo = tokenExtractor.getMemberNo(refreshToken);

String restoredRefreshToken = authRedisRepository.getRefreshToken(memberNo);

if (!refreshToken.equals(restoredRefreshToken)) {
throw new BusinessException(TokenError.NOT_EQUALS_REFRESH_TOKEN);
}

return tokenGenerator.reissueAccessToken(refreshToken);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.sudo.railo.auth.application;

import java.security.SecureRandom;

import org.springframework.stereotype.Service;

import com.sudo.railo.global.redis.AuthRedisRepository;
import com.sudo.railo.auth.application.dto.response.SendCodeResponse;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class EmailAuthService {

private final EmailSendService emailSendService;
private final AuthRedisRepository authRedisRepository;

/**
* 이메일 인증 코드 전송
* */
public SendCodeResponse sendAuthCode(String email) {
String code = createAuthCode();
emailSendService.sendEmail(email, code);
authRedisRepository.saveAuthCode(email, code);
return new SendCodeResponse(email);
}

/**
* 이메일 인증 코드 검증
* */
public boolean verifyAuthCode(String email, String authCode) {
String findCode = authRedisRepository.getAuthCode(email);
boolean isVerified = authCode.equals(findCode);

if (isVerified) {
authRedisRepository.deleteAuthCode(email);
}

return isVerified;
}

/**
* 랜덤 인증 코드 생성
* */
private String createAuthCode() {
SecureRandom random = new SecureRandom();
return String.format("%06d", random.nextInt(1000000));
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.sudo.railo.member.application;
package com.sudo.railo.auth.application;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import com.sudo.railo.global.exception.error.BusinessException;
import com.sudo.railo.member.exception.AuthError;
import com.sudo.railo.auth.exception.AuthError;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
Expand All @@ -15,7 +15,7 @@
@Slf4j
@Service
@RequiredArgsConstructor
public class EmailAuthService {
public class EmailSendService {

private final JavaMailSender mailSender;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.sudo.railo.member.application.dto.request;
package com.sudo.railo.auth.application.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

@Schema(description = "회원번호 기반 로그인 요청 DTO")
public record MemberNoLoginRequest(
public record LoginRequest(

@Schema(description = "회원의 고유 번호", example = "202506260001")
@NotBlank(message = "회원번호는 필수입니다.")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sudo.railo.member.application.dto.request;
package com.sudo.railo.auth.application.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sudo.railo.member.application.dto.request;
package com.sudo.railo.auth.application.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sudo.railo.member.application.dto.request;
package com.sudo.railo.auth.application.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.sudo.railo.auth.application.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

@Schema(description = "로그인 응답 DTO")
public record LoginResponse(

@Schema(description = "토큰의 타입 (예: Bearer)", example = "Bearer")
String grantType,

@Schema(description = "발급된 액세스 토큰", example = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")
String accessToken,

@Schema(description = "액세스 토큰의 만료 시간", example = "1750508812329")
Long accessTokenExpiresIn
) {
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sudo.railo.member.application.dto.response;
package com.sudo.railo.auth.application.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sudo.railo.member.application.dto.response;
package com.sudo.railo.auth.application.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sudo.railo.member.application.dto.response;
package com.sudo.railo.auth.application.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sudo.railo.member.application.dto.response;
package com.sudo.railo.auth.application.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sudo.railo.member.application.dto.response;
package com.sudo.railo.auth.application.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sudo.railo.member.application.dto.response;
package com.sudo.railo.auth.application.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

Expand Down
Loading
Loading