Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
2b36483
[refactor] 회원가입 생일, 성별 필드 삭제
rivertw777 Dec 17, 2024
eff1b14
Merge pull request #72 from TicketPing/feature/user
rivertw777 Dec 17, 2024
53cbe8e
[fix] JwtFilter Preflight 요청 허용
rivertw777 Dec 18, 2024
b5b6adf
Merge pull request #73 from TicketPing/feature/gateway
rivertw777 Dec 18, 2024
7afb7f9
[refact #74] 공연, 공연장, 스케줄, 좌석 가격 ERD 수정
Dec 20, 2024
4e6bd11
[fix] 요청 헤더 스펠링 변경
rivertw777 Dec 21, 2024
1cf4723
Merge pull request #75 from TicketPing/feature/queue-manage
rivertw777 Dec 21, 2024
65ecc5c
Merge branch 'feature/performance' of https://github.com/TicketPing/T…
rivertw777 Dec 21, 2024
abc6ec2
Merge branch 'dev' of https://github.com/TicketPing/TicketPing-Final …
Dec 21, 2024
22f5edb
Merge pull request #76 from TicketPing/feature/performance
mii2026 Dec 21, 2024
fe72d4c
[refact] 공연 더미 데이터 생성 시 좌석 정보 캐싱 추가
Dec 21, 2024
e9d3d51
Merge branch 'dev' into feature/performance
mii2026 Dec 21, 2024
c614ac6
Merge pull request #77 from TicketPing/feature/performance
mii2026 Dec 21, 2024
ae1007b
Merge branch 'dev' of https://github.com/TicketPing/TicketPing-Final …
rivertw777 Dec 21, 2024
a99b3ff
[fix #78] 회원가입 입력 값 검증 오류 수정
Dec 22, 2024
76c61d9
[fix #78] 로그인 입력값 검증 오류 해결
Dec 22, 2024
aa4252a
Merge pull request #79 from TicketPing/feature/auth
mii2026 Dec 22, 2024
466e347
[feat #80] 게이트웨이 CustomAuthenticationEntryPoint 구현
rivertw777 Dec 23, 2024
4bc6b8a
Merge pull request #81 from TicketPing/feature/gateway
mii2026 Dec 25, 2024
d632d0c
[refactor #82] 공연 서비스 ERD 수정
Dec 25, 2024
cde2479
Merge pull request #83 from TicketPing/feature/performance
rivertw777 Dec 25, 2024
3443d77
[fix] JwtFilter 로직 수정
rivertw777 Dec 25, 2024
91cd569
Merge pull request #84 from TicketPing/feature/gateway
rivertw777 Dec 25, 2024
91c36db
[feat] 주문, 결제 서비스 QueueCheckFilter 적용
rivertw777 Dec 25, 2024
4c7ecb0
Merge pull request #85 from TicketPing/feature/gateway
rivertw777 Dec 26, 2024
7e26b62
[feat #86] payment 서비스 PG사 연동 (TOSS)
rivertw777 Dec 27, 2024
93b6de7
[fix] ApiType 수정
rivertw777 Dec 27, 2024
1caea5a
[refactor #88] 좌석 서비스 redis redisson 클라이언트로 변경
Dec 27, 2024
184dced
Merge pull request #87 from TicketPing/feature/payment
mii2026 Dec 28, 2024
71b4eaa
Merge pull request #89 from TicketPing/feature/performance
mii2026 Dec 28, 2024
99e0c97
[refactor #90] performance 서비스 전체적으로 코드 정리
Dec 28, 2024
6b731d2
[feat #90] 공연 좌석 전체 캐싱 스케줄러 추가
Dec 29, 2024
192c691
[refactor #92] 주문 생성 API에서 좌석 선점 로직 제거
Dec 29, 2024
cc5d810
[refactor #92] 공연 서비스에 좌석 선점 로직 추가
Dec 29, 2024
45d166a
Merge pull request #91 from TicketPing/feature/performance
mii2026 Dec 29, 2024
67d5947
[refactor #92] 주문 생성 API 수정
Dec 29, 2024
3221e5b
[refactor #92] 주문 생성 API 중복 검증 추가 및 응답 dto 프론트에 맞게 수정
Dec 30, 2024
3dabc20
Merge pull request #93 from TicketPing/feature/performance
mii2026 Dec 30, 2024
dfc3215
[refactor #94] 좌석 선점 취소 API 추가
Dec 30, 2024
2295d6e
Merge pull request #95 from TicketPing/feature/performance
mii2026 Dec 30, 2024
eaffaec
[refactor #96] 공연 단건 조회 반환값 수정
Dec 30, 2024
3db59b2
Merge pull request #97 from TicketPing/feature/performance
mii2026 Dec 30, 2024
ba1cd86
[feat #98] 주문 검증 시 ttl 검증 및 연장 기능 추가
Dec 31, 2024
96b93ce
Merge pull request #99 from TicketPing/feature/order
mii2026 Dec 31, 2024
d4cf7d5
[feat #100] 게이트웨이 대기열 체크 필터에 좌석 선점 API, 주문 검증 API 추가
Dec 31, 2024
31129e6
Merge pull request #101 from TicketPing/feature/gateway
mii2026 Dec 31, 2024
1ec7a41
[refactor #102] 결제 완료 후 좌석 상태 변경 카프카로 변환
Dec 31, 2024
9681dc9
[refactor #102] 주문 서비스 코드 정리
Dec 31, 2024
4411cae
Merge pull request #103 from TicketPing/feature/order
mii2026 Dec 31, 2024
a5bfe43
[refactor #104] 자신의 주문 목록 조회 페이징 및 정리
Dec 31, 2024
4eb77b6
Merge pull request #105 from TicketPing/feature/order
mii2026 Dec 31, 2024
385a31e
[refactor #106] 자신의 주문 목록 확인에서 결제 대기 상태 제외
Jan 1, 2025
d31db20
Merge pull request #107 from TicketPing/feature/order
mii2026 Jan 1, 2025
fe686e6
[feat #108] 공연 10분 전 좌석 캐싱 스케줄러 실패 시 디스코드 알림 추가
Jan 2, 2025
f5bd2ff
[fix #108] 예매 10-0분 전 공연 조회 쿼리 0분은 포함 안되게 수정
Jan 2, 2025
9f61284
[fix #108] docker-compose 파일에 discord 웹훅 주소 추가
Jan 2, 2025
0ec5adc
Merge pull request #109 from TicketPing/feature/performance
mii2026 Jan 2, 2025
240376f
[feature #110] 모니터링 알람 추가
Jan 2, 2025
8803337
Merge pull request #111 from TicketPing/feature/monitoring
mii2026 Jan 2, 2025
87b066a
[refactor #113] 공연 엔티티 관련 코드 정리
Jan 3, 2025
2dc8ba4
[refactor #113] 스케줄 엔티티 관련 코드 정리
Jan 3, 2025
1255bfb
[refactor #113] 좌석 캐싱 스케줄러 관련 코드 정리
Jan 3, 2025
1a965a0
[refactor #113] 좌석 엔티티 관련 코드 정리
Jan 3, 2025
30a36cf
Merge pull request #114 from TicketPing/feature/performance
mii2026 Jan 3, 2025
1892721
[refactor #115] 주문 생성 API 입력값 request body로 수정
Jan 3, 2025
63245c7
Merge pull request #116 from TicketPing/feature/order
mii2026 Jan 3, 2025
8b013cb
[refactor #112] 주문 서비스 키 만료 이벤트 삭제
Jan 3, 2025
d5f05bc
[feat #112] 완료된 결제 확인 API 구현
Jan 3, 2025
8e180fa
[refactor #112] 공연 서비스 쿼리문 정리
Jan 3, 2025
21678db
[refactor #112] 공연 서비스 상수 정리
Jan 3, 2025
14ff5ce
[feat #112] 주문 삭제 이벤트, 좌석 선점 취소 이벤트 구현
Jan 3, 2025
69409ac
[feat #112] 좌석 선점 취소 이벤트 구현
Jan 3, 2025
556ac1e
Merge pull request #117 from TicketPing/feature/performance
mii2026 Jan 3, 2025
e338e74
[refactor #118] 서킷브레이커 TimeLimiter 설정 추가
Jan 7, 2025
be89ebf
Merge pull request #119 from TicketPing/feature/gateway
mii2026 Jan 7, 2025
6656c8f
[fix #120] 유레카 서버 설정 수정
Jan 7, 2025
2531683
Merge pull request #121 from TicketPing/feature/eureka
mii2026 Jan 7, 2025
82f5b26
[refactor #122] 토큰 재발급 API에서 accessToken 검증 제거
Jan 8, 2025
01301da
[refactor #122] auth 서비스 공통 상수 SeatConstants로 정리
Jan 8, 2025
193dbaf
[refactor #122] auth 서비스 application 레이어 infrastructure 레이어 분리
Jan 8, 2025
3c0d492
Merge pull request #123 from TicketPing/feature/auth
mii2026 Jan 8, 2025
941629b
[fix #124] 좌석 선점 만료 이벤트 분산락 키 이름 수정
Jan 8, 2025
435d99b
Merge pull request #125 from TicketPing/feature/performance
mii2026 Jan 8, 2025
c9086ea
[refactor] README.md 예매 시퀀스 다이어그램 수정
mii2026 Jan 8, 2025
0af6a0a
[refactor] README.md 기술적 의사결정 추가
mii2026 Jan 8, 2025
6f2060b
[refactor] README.md ERD 다이어그램 수정
mii2026 Jan 8, 2025
0966f46
[feat] 공연 더미 데이터 추가
rivertw777 Jan 8, 2025
a0d2848
Merge pull request #126 from TicketPing/feature/performance
rivertw777 Jan 8, 2025
d024de9
README.md 프론트 화면 추가
mii2026 Jan 10, 2025
4b74c2e
README.md 좌석 선점 내용 추가 및 디자인 정리
mii2026 Jan 10, 2025
40a61bc
README.md 목차 번호 수정
mii2026 Jan 10, 2025
81fd128
README.md 잘못된 링크 수정
mii2026 Jan 10, 2025
1114cd0
README.md 이미지 크기 확대
mii2026 Jan 10, 2025
6565f1b
README.md 표 오타 수정
mii2026 Jan 10, 2025
0703af1
README.md 오타 수정
mii2026 Jan 10, 2025
ead8fc2
README.md 오타 수정
mii2026 Jan 10, 2025
6cc1698
Update README.md
rivertw777 Jan 11, 2025
d54f573
Update README.md
rivertw777 Jan 11, 2025
c4ac2fc
[refactor] 메서드 이름 수정
rivertw777 Jan 12, 2025
521cc0c
Merge pull request #127 from TicketPing/feature/performance
rivertw777 Jan 12, 2025
879deee
README.md 예매 시퀀스 다이어그램 수정
mii2026 Jan 13, 2025
4c1ef30
Update README.md
mii2026 Jan 13, 2025
c361bf4
[refactor] TimeLimiter 시간 제한 10s -> 15s 수정
Jan 13, 2025
cb571ec
Merge pull request #128 from TicketPing/feature/gateway
mii2026 Jan 13, 2025
ef7ed7b
[feat #129] Auth 서비스 feignclient 서킷 브레이커 추가
Jan 15, 2025
22941a6
[feat #129] Order 서비스 feignclient 서킷 브레이커 추가
Jan 15, 2025
b39ce0d
[feat #129] 게이트웨이 webclient 서킷 브레이커 추가
Jan 15, 2025
dc272f0
[refactor #129] 서킷브레이커 알람 서버 인스턴스별로 수정
Jan 15, 2025
d3821a7
Merge pull request #130 from TicketPing/feature/circuitbreaker
mii2026 Jan 15, 2025
3752d74
[feat #132] 작업열 토큰 TTL 연장 API 구현
rivertw777 Jan 17, 2025
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ out/

application-private.yml
application**local.yml
application**test.yml

docker-compose/.env

Expand Down
114 changes: 94 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,25 @@

<br>

### 대기열 화면
<br>
<p align="center">
<img src="https://github.com/user-attachments/assets/4f73176c-d9e3-4965-bf35-ba08869a1647" alt="대기열 화면">
</p>
<br>

### 예매 화면
<br>
<p align="center">
<img src="https://github.com/user-attachments/assets/c04aca0d-089d-4327-a59e-42064b45b2c9" alt="예매 화면" style="width: 700px; height: auto;">
</p>
<br>

## 🎯 프로젝트 목표

- **MSA**: 특정 서비스에 대한 부하가 증가할 때 해당 서비스만 독립적으로 스케일 아웃할 수 있는 MSA 적용

- **느슨한 결합**: 메시지 큐를 활용한 비동기 처리로 각 서비스 간의 의존성을 최소화
- **느슨한 결합**: 메시지 큐를 활용한 비동기 처리로 각 서비스 간의 의존성 최소화

- **고가용성**: 서버 장애 시에도 서비스가 지속적으로 운영될 수 있도록 고가용성 보장

Expand Down Expand Up @@ -135,23 +149,68 @@ CPU 사용량과 Load Average가 상대적으로 낮은 것을 확인할 수 있
<br>

<details>
<summary><h4>결과 상세</h4></summary>
<ul>
<li>
<h2>MVC</h2>
<img src="https://github.com/user-attachments/assets/318073b3-cb86-4871-bc21-ea7b4e319cf8" alt="mvc result" style="max-width: 100%; height: auto;">
<img src="https://github.com/user-attachments/assets/d63be685-863c-451c-bb73-f9ecc86b24a5" alt="mvc cpu" style="max-width: 100%; height: auto;">
<img src="https://github.com/user-attachments/assets/5c6a90cc-18ba-4cdc-8d07-b15c43bd9b7e" alt="mvc load" style="max-width: 100%; height: auto;">
</li>
<li>
<h2>WebFlux</h2>
<img src="https://github.com/user-attachments/assets/6c93c553-9789-49ac-ac7e-c374bf524842" alt="wf result" style="max-width: 100%; height: auto;">
<img src="https://github.com/user-attachments/assets/0ee46ed3-8400-49c2-ad17-466cd7b1bb91" alt="wf cpu" style="max-width: 100%; height: auto;">
<img src="https://github.com/user-attachments/assets/361909fe-4c7c-48d0-b11c-b9b57d1a74db" alt="wf load" style="max-width: 100%; height: auto;">
</li>
</ul>
<summary><h4>결과 상세</h4></summary>

- MVC

<img src="https://github.com/user-attachments/assets/318073b3-cb86-4871-bc21-ea7b4e319cf8" alt="mvc result" style="max-width: 100%; height: auto;">
<img src="https://github.com/user-attachments/assets/d63be685-863c-451c-bb73-f9ecc86b24a5" alt="mvc cpu" style="max-width: 100%; height: auto;">
<img src="https://github.com/user-attachments/assets/5c6a90cc-18ba-4cdc-8d07-b15c43bd9b7e" alt="mvc load" style="max-width: 100%; height: auto;">

- WebFlux

<img src="https://github.com/user-attachments/assets/6c93c553-9789-49ac-ac7e-c374bf524842" alt="wf result" style="max-width: 100%; height: auto;">
<img src="https://github.com/user-attachments/assets/0ee46ed3-8400-49c2-ad17-466cd7b1bb91" alt="wf cpu" style="max-width: 100%; height: auto;">
<img src="https://github.com/user-attachments/assets/361909fe-4c7c-48d0-b11c-b9b57d1a74db" alt="wf load" style="max-width: 100%; height: auto;">

</details>

<br>

## 🥇 Jmeter 성능 비교를 통한 좌석 선점 방식 선정

Redis 데이터의 동시성 문제를 해결할 수 있는 Lua Script를 이용한 원자적 처리와, 분산락을 이용한 처리 두 가지 방법을 고민하였습니다.

### 장단점 비교

  | 장점 | 단점
-- | -- | --
Lua Script | - 네트워크 호출을 최소화할 수 있음 <br> - 락 해제 오류에 대한 위험성 없음 | - Redis 기본 함수를 알아야 함 <br> - Spring 실행 시 디버깅이 어려움
분산락 | - Spring 코드로 디버깅이 편리 <br> - Redis 함수를 알지 못해도 쉽게 구현 가능 | - 분산락을 얻기 위한 네트워크 호출이 늘어남 <br> - 분산락이 해제되지 않을 가능성이 존재

<br>

### Jmeter 성능 테스트

좌석 선점은 빠른 속도가 중요하다고 생각해 로컬 컴퓨터에서 `1,000`명의 동시 좌석 선점 속도를 비교해보았습니다.

(CPU: AMD Ryzen 7 5700G, RAM: 32GB)

<img src="https://github.com/user-attachments/assets/4261228a-4a3c-40b7-80ca-12cd1e9314d2" alt="image" width="90%">

동일 환경에서 테스트한 결과 Lua Script에서 응답 속도가 2배 빠르고, 처리량도 더 높은 것을 확인할 수 있었습니다.

<details>
<summary><h4>결과 상세</h4></summary>

- Lua Script

![LuaScript](https://github.com/user-attachments/assets/1623bcf9-29fc-4b7c-b9ac-726b1a39436a)

- 분산락

![Distributed Lock](https://github.com/user-attachments/assets/157b9dc0-ffab-402f-89b8-061ef566cbab)

</details>

<br>

### 결론

두 방식의 장단점과 실제 성능 결과를 바탕으로 속도도 빠르고 더 안정성도 높은 Lua Script를 활용해 좌석 선점을 구현하였습니다.

<br>

## 📃 다이어그램

### 🧑 유저 플로우
Expand Down Expand Up @@ -180,7 +239,8 @@ CPU 사용량과 Load Average가 상대적으로 낮은 것을 확인할 수 있
<summary><h3>🎫 예매 시퀀스 다이어그램</h3></summary>
<br>

![ticketping_sa-예매 시퀀스 drawio (6)](https://github.com/user-attachments/assets/339a32a1-1c52-45dc-b605-6125262b3891)
![ticketping_sa-예매 시퀀스 drawio](https://github.com/user-attachments/assets/1dca9e45-dfa9-40fe-9d9b-045a10d46495)


</details>

Expand All @@ -192,7 +252,8 @@ CPU 사용량과 Load Average가 상대적으로 낮은 것을 확인할 수 있
<summary><h3>✏️ ERD</h3></summary>
<br>

![ticketping-erd](https://github.com/user-attachments/assets/4604f251-4e39-4856-8d67-853d29622a86)
![image](https://github.com/user-attachments/assets/b7e067c7-ea8a-4a93-bc49-9466b7b1219b)


</details>

Expand All @@ -216,15 +277,27 @@ CPU 사용량과 Load Average가 상대적으로 낮은 것을 확인할 수 있

- [🥶 Kafka Cluster 적용하기](https://github.com/TicketPing/TicketPing-Final/wiki/%F0%9F%A5%B6-Kafka-Cluster-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0)

- [✅ 인증 인가 구상하기](https://github.com/TicketPing/TicketPing-Final/wiki/%E2%9C%85-%EC%9D%B8%EC%A6%9D-%EC%9D%B8%EA%B0%80-%EA%B5%AC%EC%83%81%ED%95%98%EA%B8%B0)

- [🎫 좌석 예매 흐름 구상하기](https://github.com/TicketPing/TicketPing-Final/wiki/%F0%9F%8E%AB-%EC%A2%8C%EC%84%9D-%EC%98%88%EB%A7%A4-%ED%9D%90%EB%A6%84-%EA%B5%AC%EC%83%81%ED%95%98%EA%B8%B0)

- [💺 좌석 데이터 캐싱 구상하기](https://github.com/TicketPing/TicketPing-Final/wiki/%F0%9F%92%BA-%EC%A2%8C%EC%84%9D-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%BA%90%EC%8B%B1-%EA%B5%AC%EC%83%81%ED%95%98%EA%B8%B0)

- [↩️ Redis Keyspace Notifications을 이용한 좌석 선점 만료 구현](https://github.com/TicketPing/TicketPing-Final/wiki/%E2%86%A9%EF%B8%8F-Redis-Keyspace-Notifications%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A2%8C%EC%84%9D-%EC%84%A0%EC%A0%90-%EB%A7%8C%EB%A3%8C-%EA%B5%AC%ED%98%84)

- [⏰ Grafana를 이용한 통합 모니터링 및 알람 구축](https://github.com/TicketPing/TicketPing-Final/wiki/%E2%8F%B0-Grafana%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%86%B5%ED%95%A9-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EB%B0%8F-%EC%95%8C%EB%9E%8C-%EA%B5%AC%EC%B6%95)

- [⚡ 게이트웨이에 서킷브레이커 구축](https://github.com/TicketPing/TicketPing-Final/wiki/%E2%9A%A1-%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%EC%97%90-%EC%84%9C%ED%82%B7%EB%B8%8C%EB%A0%88%EC%9D%B4%EC%BB%A4-%EA%B5%AC%EC%B6%95)

<br>

## ⚽️ 트러블슈팅

- [🎁 Lua Script를 활용한 대기열 진입 동시성 문제 해결](https://github.com/TicketPing/TicketPing-Final/wiki/%F0%9F%8E%81-Lua-Script%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%8C%80%EA%B8%B0%EC%97%B4-%EC%A7%84%EC%9E%85-%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0)

- [🗣️ Redis Cluster 적용 이후 Lua Script 실행 오류 문제 해결](https://github.com/TicketPing/TicketPing-Final/wiki/%F0%9F%97%A3%EF%B8%8F-Redis-Cluster-%EC%A0%81%EC%9A%A9-%EC%9D%B4%ED%9B%84-Lua-Script-%EC%8B%A4%ED%96%89-%EC%98%A4%EB%A5%98-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0)
- [🥇 Lua Script를 이용한 좌석 선점 동시성 문제 해결](https://github.com/TicketPing/TicketPing-Final/wiki/%F0%9F%A5%87-Lua-Script%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A2%8C%EC%84%9D-%EC%84%A0%EC%A0%90-%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0)

- [🖍️ Redis @class로 인해 다른 서버에서 캐시를 읽지 못하는 문제 해결](https://github.com/TicketPing/TicketPing-Final/wiki/%F0%9F%96%8D%EF%B8%8F-Redis-@class%EB%A1%9C-%EC%9D%B8%ED%95%B4-%EB%8B%A4%EB%A5%B8-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EC%BA%90%EC%8B%9C%EB%A5%BC-%EC%9D%BD%EC%A7%80-%EB%AA%BB%ED%95%98%EB%8A%94-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0)
- [🗣️ Redis Cluster 적용 이후 Lua Script 실행 오류 문제 해결](https://github.com/TicketPing/TicketPing-Final/wiki/%F0%9F%97%A3%EF%B8%8F-Redis-Cluster-%EC%A0%81%EC%9A%A9-%EC%9D%B4%ED%9B%84-Lua-Script-%EC%8B%A4%ED%96%89-%EC%98%A4%EB%A5%98-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0)

<br>

Expand Down Expand Up @@ -255,6 +328,7 @@ CPU 사용량과 Load Average가 상대적으로 낮은 것을 확인할 수 있
- 공연 서비스 개발 <br>
- 주문 서비스 개발 <br>
- 게이트웨이 JWT 인증 필터 개발 <br>
- 게이트웨이 서킷 브레이커 설정 <br>
- 모니터링 시스템 구축 <br>
</td>
<td align="center"><a href="https://github.com/mii2026">GitHub</a></td>
Expand Down
42 changes: 42 additions & 0 deletions common/circuit-breaker/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.4'
id 'io.spring.dependency-management' version '1.1.6'
}

group = 'com.ticketPing'
version = '0.0.1-SNAPSHOT'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

bootJar {
enabled = false
}

jar {
enabled = true
}

dependencies {
api 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'


}

tasks.named('test') {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package circuit.config;

import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import io.github.resilience4j.circuitbreaker.event.CircuitBreakerOnErrorEvent;
import io.github.resilience4j.circuitbreaker.event.CircuitBreakerOnFailureRateExceededEvent;
import io.github.resilience4j.circuitbreaker.event.CircuitBreakerOnStateTransitionEvent;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;

@Slf4j
@Configuration
@RequiredArgsConstructor
public class CircuitBreakerEventConfig {

private final CircuitBreakerRegistry circuitBreakerRegistry;

@PostConstruct
public void registerCircuitBreakerEventListeners() {
circuitBreakerRegistry.getAllCircuitBreakers().forEach(circuitBreaker -> {
circuitBreaker.getEventPublisher()
.onStateTransition(this::logStateTransition)
.onFailureRateExceeded(this::logFailureRateExceeded)
.onError(this::logErrorEvent);
});
}

private void logStateTransition(CircuitBreakerOnStateTransitionEvent event) {
log.info("CircuitBreaker '{}' state changed from {} to {}",
event.getCircuitBreakerName(),
event.getStateTransition().getFromState(),
event.getStateTransition().getToState());
}

private void logFailureRateExceeded(CircuitBreakerOnFailureRateExceededEvent event) {
log.warn("CircuitBreaker '{}' failure rate exceeded: {}%",
event.getCircuitBreakerName(),
event.getFailureRate());
}

private void logErrorEvent(CircuitBreakerOnErrorEvent event) {
log.error("CircuitBreaker '{}' recorded an error: {}",
event.getCircuitBreakerName(),
event.getThrowable().getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
spring:
cloud:
openfeign:
circuitbreaker: enabled

resilience4j:
circuitbreaker:
configs:
default:
registerHealthIndicator: true
slidingWindowType: COUNT_BASED
slidingWindowSize: 10
minimumNumberOfCalls: 10
failureRateThreshold: 50
slowCallRateThreshold: 100
slowCallDurationThreshold: 10s
waitDurationInOpenState: 10s
permittedNumberOfCallsInHalfOpenState: 3
recordSlowCalls: true
record-exceptions:
- java.util.concurrent.TimeoutException
- java.net.SocketTimeoutException
- java.net.UnknownHostException
- java.net.ConnectException
- feign.RetryableException
- feign.FeignException.GatewayTimeout
- feign.FeignException.BadGateway
- feign.FeignException.TooManyRequests
- feign.FeignException.ServiceUnavailable
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import lombok.Getter;

@Getter
public class ApplicationException extends RuntimeException{
public class ApplicationException extends RuntimeException {

private final ErrorCase exceptionCase;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class GlobalExceptionHandler {
private final ObjectMapper objectMapper;

@ExceptionHandler(ApplicationException.class)
public ResponseEntity<CommonResponse> handleDnaApplicationException(ApplicationException e) {
public ResponseEntity<CommonResponse> handleApplicationException(ApplicationException e) {
CommonResponse response = CommonResponse.error(e.getExceptionCase());
return ResponseEntity
.status(response.getStatus())
Expand Down
1 change: 1 addition & 0 deletions common/core/src/main/java/response/CommonResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public static <T> CommonResponse<T> success(T data) {

public static CommonResponse<Object> success() {
return CommonResponse.builder()
.message("success")
.build();
}

Expand Down
8 changes: 7 additions & 1 deletion common/core/src/main/resources/application-eureka.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
eureka:
client:
service-url:
defaultZone: ${EUREKA_SERVER}
defaultZone: ${EUREKA_SERVER}

spring:
cloud:
loadbalancer:
ribbon:
enabled: true

This file was deleted.

23 changes: 23 additions & 0 deletions common/dtos/src/main/java/performance/OrderSeatResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package performance;

import lombok.AccessLevel;
import lombok.Builder;

import java.time.LocalDate;
import java.util.UUID;

@Builder(access = AccessLevel.PRIVATE)
public record OrderSeatResponse(
UUID performanceId,
String performanceName,
UUID scheduleId,
LocalDate startDate,
UUID performanceHallId,
String performanceHallName,
UUID companyId,
UUID seatId,
Integer row,
Integer col,
String seatGrade,
Integer cost
) { }
24 changes: 0 additions & 24 deletions common/dtos/src/main/java/performance/PaymentRequestDto.java

This file was deleted.

Loading
Loading