Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking β€œSign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release: πŸŽ‡ Release v1.0.0 #159

Merged
merged 172 commits into from
Aug 27, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
172 commits
Select commit Hold shift + click to select a range
868c5d1
chore: init project
psychology50 Mar 6, 2024
f69d725
feat: λ©€ν‹° λͺ¨λ“ˆν™”
psychology50 Mar 6, 2024
6861ea9
feat: common-곡톡 μ–΄λ…Έν…Œμ΄μ…˜ μ •μ˜
psychology50 Mar 7, 2024
1dc53dd
docs: ν”„λ‘œμ νŠΈ μ„€λͺ… 및 λͺ¨λ“ˆ 별 Conventionκ³Ό 디렉토리 ꡬ쑰 μž„μ‹œ μž‘μ„±
psychology50 Mar 7, 2024
5648f6f
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Mar 7, 2024
71e98c0
docs: ν”„λ‘œμ νŠΈ readme μž¬μž‘μ„±
psychology50 Mar 7, 2024
cd7c7cd
docs: ν”„λ‘œμ νŠΈ μ†Œκ°œ README μ˜€νƒˆμž μˆ˜μ •
psychology50 Mar 7, 2024
1b1cd84
Merge pull request #1 from CollaBu/feat/PW-108-init-project
psychology50 Mar 7, 2024
bd57f32
docs: PULL_REQUEST_TEMPLATE.md μž‘μ„±
psychology50 Mar 9, 2024
2cf48c1
fix: ν…œν”Œλ¦Ώ 경둜 μˆ˜μ •
psychology50 Mar 9, 2024
a7e4b44
Merge pull request #3 from CollaBu/feat/pr-template
psychology50 Mar 9, 2024
18caaad
feat: 7-bit error code enum 및 interface μ •μ˜ && causedBy record μ •μ˜
psychology50 Mar 11, 2024
0913e46
rename: 곡톡 μ˜ˆμ™Έ 클래슀 및 μΈν„°νŽ˜μ΄μŠ€ 주석 μΆ”κ°€
psychology50 Mar 11, 2024
e03f917
feat: CausedBy 검증 둜직 μΆ”κ°€ && rename: CausedBy λ©”μ„œλ“œλ³„ 주석 μΆ”κ°€
psychology50 Mar 12, 2024
bf787c1
rename: Domain Code 주석 μˆ˜μ •
psychology50 Mar 12, 2024
18e5674
rename: Field Code 주석 μˆ˜μ •
psychology50 Mar 12, 2024
5660173
rename: CausedBy 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œλͺ… valueOf -> of둜 μˆ˜μ •
psychology50 Mar 12, 2024
88a058a
fix: CausedBy code 자릿수 검증 둜직 μˆ˜μ • && test: CausedBy 객체 6가지 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„±
psychology50 Mar 12, 2024
5b3ba6d
rename: CausedBy 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œ 주석 μˆ˜μ •
psychology50 Mar 12, 2024
23127bf
Merge pull request #4 from CollaBu/feat/PW-124-common-error
psychology50 Mar 12, 2024
419521e
✨ JwtProvider μΈν„°νŽ˜μ΄μŠ€ 및 AT, RT Provider κ΅¬ν˜„μ²΄ μ •μ˜ (#6)
psychology50 Mar 14, 2024
a27a3d9
✨ JDBC & JPA & QueryDsl Configuration μ„€μ • (#7)
psychology50 Mar 18, 2024
0814611
Conventional Commit을 μœ„ν•œ Git Hooks μ„€μ • (#8)
jinlee1703 Mar 18, 2024
032e894
✨ Redis Configuration μ„€μ • (#9)
psychology50 Mar 18, 2024
1ddf37c
✨ OpenAPI Swagger config μ„€μ • (#10)
psychology50 Mar 19, 2024
560598c
✏️ Reason Code Zero bit 제거 β†’ 500λ²ˆλŒ€ Zero bit μƒμˆ˜ μΆ”κ°€ (#11)
psychology50 Mar 19, 2024
2073046
Swagger κ΄€λ ¨ ν™˜κ²½ λ³€μˆ˜ μ˜€νƒ€ μˆ˜μ • (#12)
jinlee1703 Mar 19, 2024
0ccd493
✨ 응닡 곡톡화 및 μ „μ—­ μ˜ˆμ™Έ 처리 (#14)
psychology50 Mar 20, 2024
e8ca4bb
✨ User Domain μ„€μ • (#15)
psychology50 Mar 20, 2024
7507217
✨️ νšŒμ›κ°€μž… API (#16)
psychology50 Mar 22, 2024
23ecc67
Dockfile μž‘μ„± (#17)
jinlee1703 Mar 25, 2024
0d5adfe
✨ 일반 νšŒμ›κ°€μž… μ „ν™”λ²ˆν˜Έ 인증 API (#18)
psychology50 Mar 26, 2024
1b41db4
CI/CD νŒŒμ΄ν”„λΌμΈ ꡬ좕 (#19)
jinlee1703 Mar 26, 2024
e09ab66
CD Workflow μˆ˜μ • (#21)
jinlee1703 Mar 26, 2024
39f97e9
✨ Spring Security 초기 μ„€μ • (+ Test case μ—λŸ¬ κ΄€λ ¨) (#22)
psychology50 Mar 27, 2024
f39cdb7
✨ 둜그인 API (#23)
psychology50 Mar 27, 2024
44145e7
✏️ νšŒμ›κ°€μž… API κ°œμ„  (+ Domain Service Runtime μ˜ˆμ™Έ λ°œμƒ 제거) (#24)
psychology50 Mar 28, 2024
4b7a313
✨ Jwt 인증 ν•„ν„° (#25)
psychology50 Mar 28, 2024
6334e72
πŸ“‘ Readme v0.0.2 (#26)
psychology50 Mar 29, 2024
f925160
✏️ Swagger + Security μˆ˜μ • (#30)
psychology50 Mar 31, 2024
b6943e4
✨ λ‹‰λ„€μž„ 쀑볡검사 API (#31)
psychology50 Apr 1, 2024
9d910ab
✨ OIDC κΈ°λŠ₯ μΈν„°νŽ˜μ΄μŠ€ν™” (+ component scan에 λŒ€ν•œ κ³ μ°°) (#32)
psychology50 Apr 3, 2024
9b7bde2
✨ OAuth OIDC νšŒμ›κ°€μž… 및 둜그인 API (#33)
psychology50 Apr 4, 2024
23a413f
✨ External-api λͺ¨λ“ˆ 톡합 ν…ŒμŠ€νŠΈ ν™˜κ²½ ꡬ좕 (#34)
psychology50 Apr 5, 2024
afd13b6
πŸ› OIDC signature 검증없이 header, payload μΆ”μΆœ 둜직 μˆ˜μ • (#35)
psychology50 Apr 6, 2024
e000d6e
✨ μΈμ¦μ½”λ“œ SMS 전솑 (#37)
psychology50 Apr 9, 2024
0a3c1a6
πŸ“ Swagger μ˜ˆμ™Έ 응닡 λ¬Έμ„œ κ°œμ„  (#39)
psychology50 Apr 10, 2024
5a68de6
πŸ› Google id token issuer mismatch 이슈 ν•΄κ²° (#40)
psychology50 Apr 10, 2024
596aaf7
✏️ User name ν•„λ“œ μœ νš¨μ„± 검사 κΈ°μ€€ λ³€κ²½ (#44)
psychology50 Apr 12, 2024
5f585c3
✨ User, Oauth Entity Soft Delete 반영 (#43)
psychology50 Apr 12, 2024
2434130
✏️ OAuth 계정 연동 μ‹€νŒ¨ ν•΄κ²° 및 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μΆ”κ°€ (#45)
psychology50 Apr 13, 2024
faf79d7
✏️ 인증번호 전솑 api 톡합 (#46)
psychology50 Apr 15, 2024
26a4231
πŸ“ λͺ¨λ“ˆ 별 README.md μΆ”κ°€ (#47)
psychology50 Apr 15, 2024
2b53f45
✨ λ‘œκ·Έμ•„μ›ƒ API (#49)
psychology50 Apr 17, 2024
bffb3b6
✨ Device Token 등둝/μˆ˜μ •/μ‚­μ œ API (#51)
psychology50 Apr 18, 2024
c594fd1
fix: oauth entity λ‚΄ provider converter μ •μ˜ (#52)
psychology50 Apr 18, 2024
42e9700
✨ λ¬Έμ˜ν•˜κΈ° API (#36)
asn6878 Apr 20, 2024
a981c44
πŸ”§ 인증 κΈ°λŠ₯ λ¦¬νŒ©ν† λ§ (#53)
psychology50 Apr 21, 2024
5e4cd9b
✨ μ‚¬μš©μž 본인 ν”„λ‘œν•„ 쑰회 API (#55)
psychology50 Apr 22, 2024
2e614ad
✨ 둜그인 μƒνƒœ 확인 API (#56)
psychology50 Apr 24, 2024
c6d595a
일반 νšŒμ› 아이디 μ°ΎκΈ° API κ΅¬ν˜„ (#48)
jinlee1703 Apr 24, 2024
1fe2abf
✏️ 인증번호 전솑 API 톡합에 λ”°λ₯Έ Deprecated API μ‚­μ œ (#57)
psychology50 Apr 24, 2024
f000034
✨ OIDC μ •μ±…μ—μ„œ id token에 nonce ν•„λ“œ μΆ”κ°€ (#58)
psychology50 Apr 24, 2024
b267155
✨ μ‚¬μš©μž 아이디/이름 μˆ˜μ • API (#59)
psychology50 Apr 26, 2024
f262134
✨ μ‚¬μš©μž μ•Œλ¦Ό μ„€μ • API (#60)
psychology50 Apr 26, 2024
bb3477b
πŸ› 아이디 μ°ΎκΈ° API μš”μ²­ μ‹œ νœ΄λŒ€ν° 번호 및 인증 μ½”λ“œλ₯Ό μž…λ ₯ν•˜μ§€ μ•Šμ„ 경우 INTERNAL_SERVER_ERROR 해결…
jinlee1703 Apr 26, 2024
4ebcd9a
✨ λΉ„λ°€λ²ˆν˜Έ 검증/λ³€κ²½ API (#62)
psychology50 Apr 27, 2024
9ac8149
✨ External Api Controller λ‘œκΉ…μ„ μœ„ν•œ AOP κ΅¬ν˜„ (#64)
psychology50 Apr 27, 2024
12f1f07
πŸ› RTR μ˜€λ™μž‘ 검증 (아무 문제 μ—†μ—ˆλ‹€..) (#66)
psychology50 Apr 30, 2024
fc8c11f
✨ 인증된 μ‚¬μš©μžμ˜ μ†Œμ…œ 계정 연동 API (#67)
psychology50 Apr 30, 2024
9ffaf2d
πŸ› OAuth 둜그인/νšŒμ›κ°€μž… μ‹œ Soft Delete μ •μ±… 반영 검사 (#69)
psychology50 May 1, 2024
731515a
✨ 인증된 μ‚¬μš©μžμ˜ OAuth 연동 해지 API (#70)
psychology50 May 1, 2024
e65fe63
✏️ 마이 ν”„λ‘œν•„ 쑰회 μ‹œ, μ†Œμ…œ 계정 연동 정보 μΆ”κ°€ (#72)
psychology50 May 2, 2024
e371b86
✨ μ‚¬μš©μž 계정 μ‚­μ œ API (#73)
psychology50 May 4, 2024
f6c23e2
✨ λΉ„λ°€λ²ˆν˜Έ μ°ΎκΈ° API (#71)
asn6878 May 6, 2024
6b24d85
✨ μ§€μΆœ 관리 μ˜μ—­ Domain μ •μ˜ (#74)
psychology50 May 7, 2024
bee64c4
πŸ› μ‚¬μš©μž μ‚­μ œ μ‹œλ‚˜λ¦¬μ˜€ κ°œμ„  (#75)
psychology50 May 7, 2024
bb76066
✨ QueryDsl ν™•μž₯ Repository 및 Util μ •μ˜ (#76)
psychology50 May 8, 2024
6bb492b
✨ λ‹Ήμ›” λͺ©ν‘œ κΈˆμ•‘ μ„€μ • API (#77)
psychology50 May 9, 2024
0a479d2
✨ 월별 μ‚¬μš©μž μ§€μΆœ λ‚΄μ—­ 쑰회 API (#78)
psychology50 May 9, 2024
6132737
✨ μ‚¬μš©μž μ»€μŠ€ν…€ μ§€μΆœ μΉ΄ν…Œκ³ λ¦¬ 등둝 API (#79)
psychology50 May 9, 2024
0dd02c8
✨ μ§€μΆœ λ‚΄μ—­ 등둝 API (#81)
psychology50 May 10, 2024
e1fadf1
✨ μ‚¬μš©μž μ •μ˜ μ§€μΆœ μΉ΄ν…Œκ³ λ¦¬ 쑰회 API (#82)
psychology50 May 10, 2024
9275a4b
✏️ QueryDsl ν™•μž₯ Repository의 Dto λΆˆλ³€μ„± 보μž₯을 μœ„ν•œ λΆ„κΈ° 처리 (#84)
psychology50 May 11, 2024
509d5f2
docs: 전체 보기 κ·Έλ£Ή μΆ”κ°€ (#87)
psychology50 May 12, 2024
9a55439
πŸ› μ‚¬μš©μž 계정 μ‚­μ œ ν›„ λ™μΌν•œ OAuth νšŒμ›κ°€μž… 이후 둜그인 μ—λŸ¬ ν•΄κ²° (#85)
psychology50 May 12, 2024
5555b0e
✏️ ν…ŒμŠ€νŠΈ μž‘μ„± μ‹œ `@AuthenticatePrincipal` μ–΄λ…Έν…Œμ΄μ…˜ λŒ€μ‘ (#86)
psychology50 May 13, 2024
dfe87a1
✨ μ‚¬μš©μž λ…„/μ›” 별 μ§€μΆœ 총합 및 λͺ©ν‘œ κΈˆμ•‘ 쑰회 API (#88)
psychology50 May 15, 2024
5a36c03
✨ λ‹Ήμ›” λͺ©ν‘œ κΈˆμ•‘ μ‚­μ œ API (#90)
psychology50 May 15, 2024
a714d6e
✨ μ§€μΆœ λ‚΄μ—­ 상세 쑰회 API (#89)
asn6878 May 15, 2024
90069ca
πŸ› μ§€μΆœ λ‚΄μ—­ 쑰회 응닡 및 μŠ€μ›¨κ±° 버그 ν”½μŠ€ (#92)
psychology50 May 16, 2024
e045906
✨ Firebase Cloud Messaging κΈ°λ³Έ μ„€μ • (#94)
psychology50 May 20, 2024
a59c590
✨ μ‚¬μš©μž 둜그인 둜그λ₯Ό μœ„ν•œ Interceptor 및 ν™˜κ²½ ꡬ좕 (#95)
psychology50 May 23, 2024
f1aa725
✨ S3 정적 파일 μ—…λ‘œλ“œλ₯Ό μœ„ν•œ Presigned-URL λ°œκΈ‰ API κ΅¬ν˜„ (#97)
jinlee1703 May 28, 2024
13a7043
✨ μ§€μΆœ λ‚΄μ—­ μ‚­μ œ API (#96)
asn6878 May 29, 2024
976c4e6
✨ μ§€μΆœ λ‚΄μ—­ μˆ˜μ • API (#93)
asn6878 May 29, 2024
69ccdc5
✨ Redisson을 ν™œμš©ν•œ λΆ„μ‚° 락(Distributed Lock) ν™˜κ²½ ꡬ좕 및 ν…ŒμŠ€νŠΈ (#98)
psychology50 May 29, 2024
bc1e446
Batch: ✨ Batch 기초 μ„ΈνŒ… 및 CD νŒŒμ΄ν”„λΌμΈ μˆ˜μ • (μˆ˜μ •λ  PR μ»¨λ²€μ…˜ κ΄€λ ¨ λ‚΄μš© 포함) (#99)
psychology50 May 30, 2024
7c9d43f
release: api-v1.0.0 (#100)
psychology50 May 30, 2024
907e8a5
fix: 배포 νŒŒμ΄ν”„λΌμΈ 이미지 λΉŒλ“œ 버전 μΆ”κ°€
psychology50 May 30, 2024
8379b0e
Api: πŸ› νƒœκ·Έ 생성 & 릴리즈 μžλ™ν™” νŒŒμ΄ν”„λΌμΈ ν›„ 배포 workflows call (#101)
psychology50 Jun 1, 2024
dc75a33
Api: πŸ› object-key의 depth μˆ˜μ •μ„ μœ„ν•œ ν…œν”Œλ¦Ώ μˆ˜μ • (#102)
jinlee1703 Jun 2, 2024
8c58d77
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jun 2, 2024
24b1427
Api: ✏️ λͺ©ν‘œ κΈˆμ•‘ ν”Œλ‘œμš° 변경에 λ”°λ₯Έ API μŠ€νŽ™ λ³€κ²½ (#103)
psychology50 Jun 4, 2024
7210b0f
fix: λ¬Έμ˜ν•˜κΈ° 응닡속도 κ°œμ„ μ„ μœ„ν•œ 이벀트 ν•Έλ“€λŸ¬ 비동기 처리 (#106)
asn6878 Jun 5, 2024
a2d469e
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jun 5, 2024
00ac66b
docs: πŸ“ Readme-v0.0.3 (#108)
psychology50 Jun 5, 2024
35710d0
feat: ✨ μ‚¬μš©μž ν”„λ‘œν•„ 이미지 등둝 μš”μ²­ API κ΅¬ν˜„ (#105)
jinlee1703 Jun 5, 2024
791d4fd
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jun 5, 2024
772b23f
fix: ✏️ μ‚¬μš©μž 둜그 관리 μ •μ±… 변경에 λ”°λ₯Έ Device API μˆ˜μ • (#104)
psychology50 Jun 5, 2024
07c6057
fix: ✏️ μ‚¬μš©μž μ •μ˜ μ§€μΆœ μΉ΄ν…Œκ³ λ¦¬ `β‹―` μ•„μ΄μ½˜ 반영 (#107)
psychology50 Jun 5, 2024
f062461
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jun 5, 2024
079a61a
feat: ✨ 졜근 λͺ©ν‘œ κΈˆμ•‘ 쑰회 API (#109)
psychology50 Jun 6, 2024
a48ab9a
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jun 6, 2024
3453d88
fix: ✏️ μ—”ν‹°ν‹° μƒμ„±μž 및 μˆ˜μ • λ©”μ„œλ“œ μœ νš¨μ„± 검사 μΆ”κ°€ (#111)
psychology50 Jun 7, 2024
893efe6
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jun 11, 2024
6458798
Api: ✏️ 월별 μ§€μΆœλ‚΄μ—­ μ‘°νšŒμ‹œ λ°œμƒν•˜λŠ” N+1 문제 κ°œμ„  (#110)
asn6878 Jun 23, 2024
b579501
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jun 25, 2024
a69fc70
πŸ”§ λͺ©ν‘œ κΈˆμ•‘ 유즈 μΌ€μ΄μŠ€ λ¦¬νŒ©ν† λ§ (#112)
psychology50 Jun 25, 2024
9b69bd4
refactor: πŸ”§ μ§€μΆœ λ‚΄μ—­ μœ μ¦ˆμΌ€μ΄μŠ€ λ¦¬νŒ©ν† λ§ (#113)
psychology50 Jun 25, 2024
b976bcc
refactor: πŸ”§ μ§€μΆœ μΉ΄ν…Œκ³ λ¦¬ μœ μ¦ˆμΌ€μ΄μŠ€ λ¦¬νŒ©ν† λ§ (#114)
psychology50 Jun 25, 2024
2422521
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jun 25, 2024
3cbc53b
fix: ✏️ κ°€μž₯ μ΅œκ·Όμ— μ„€μ •ν•œ λͺ©ν‘œ κΈˆμ•‘ 쑰회 API 응닡 μ‹œ λ‚ μ§œ 데이터 μΆ”κ°€ (#115)
psychology50 Jun 26, 2024
254d10f
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jun 26, 2024
8ed7c8c
fix: ✏️ λ¬Έμ˜ν•˜κΈ° API content κΈ€μž 수 μ œν•œ 및 μ‚¬μš©μž 이름 μ •κ·œμ‹ μˆ˜μ • (#116)
asn6878 Jun 26, 2024
66c6907
fix: πŸ› 월별 μ§€μΆœλ‚΄μ—­ 쑰회 쿼리 버그 μˆ˜μ • (#117)
asn6878 Jun 27, 2024
72786c2
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jun 28, 2024
e9d2cc5
Api: ✨ μ‚¬μš©μž ν”„λ‘œν•„ μˆ˜μ • API (#118)
psychology50 Jun 30, 2024
fbfb5e1
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jul 1, 2024
cb8888d
feat: ✨ μΉ΄ν…Œκ³ λ¦¬μ— λ“±λ‘λœ μ†ŒλΉ„ 리슀트 λ¬΄ν•œ 슀크둀 쑰회 API (#120)
psychology50 Jul 3, 2024
2bfd209
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jul 3, 2024
a10e6e8
feat: ✨ μ‚¬μš©μž μ •μ˜ μΉ΄ν…Œκ³ λ¦¬ μˆ˜μ • API (#121)
psychology50 Jul 4, 2024
adbaeed
fix: πŸ› n+1 문제 κ°œμ„  ν…ŒμŠ€νŠΈμ˜ 간헐적 μ‹€νŒ¨λ¬Έμ œ μˆ˜μ • (#122)
asn6878 Jul 4, 2024
74e0081
feat: ✨ μ†ŒλΉ„λ‚΄μ—­ 볡수 μ‚­μ œ API (#119)
asn6878 Jul 4, 2024
e80cf8b
feat: ✨ μ‚¬μš©μž μ •μ˜ μΉ΄ν…Œκ³ λ¦¬ μ‚­μ œ API (#123)
asn6878 Jul 9, 2024
6e4341d
feat: ✨ μ •κΈ° μ§€μΆœ 등둝 μ•Œλ¦Ό 배치 & μŠ€μΌ€μ€„λŸ¬ (#124)
psychology50 Jul 11, 2024
a390ba8
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jul 11, 2024
00e7450
πŸ› OIDC key caching ttl fix (#126)
psychology50 Jul 13, 2024
634f50f
Api: ✏️ μ‚¬μš©μž 아이디, μ „ν™”λ²ˆν˜Έ μˆ˜μ • API 뢄리 (#127)
psychology50 Jul 13, 2024
b5a9877
cd: ✏️ 릴리즈 CD νŒŒμ΄ν”„λΌμΈ μ‹€ν–‰ μŠ€ν‚΅ ν‚€μ›Œλ“œ μΆ”κ°€ (#129)
psychology50 Jul 15, 2024
93943aa
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jul 15, 2024
6935304
ci: ✨ Open API μ½”λ“œ 리뷰 CI νŒŒμ΄ν”„λΌμΈ μΆ”κ°€ (#130)
psychology50 Jul 15, 2024
89a68b8
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jul 15, 2024
ba28c4e
cd: ✏️ 배치 CD νŒŒμ΄ν”„λΌμΈ FCM Admin SDK 생성 step μΆ”κ°€ (#131)
psychology50 Jul 15, 2024
5c1964a
Merge branch 'dev' of https://github.com/CollaBu/pennyway-was into dev
psychology50 Jul 15, 2024
3bc5ea6
fix: πŸ› λͺ©ν‘œ κΈˆμ•‘ DELETE 유즈 μΌ€μ΄μŠ€ 잘λͺ»λœ 필터링 제거 (#132)
psychology50 Jul 15, 2024
127cf5c
fix: ✏️ 총 μ§€μΆœ 총합 κ°’μ˜ μ •μˆ˜ λ²”μœ„ 초과 μΌ€μ΄μŠ€λ₯Ό κ³ λ €ν•˜μ—¬ νƒ€μž… μˆ˜μ • (#133)
psychology50 Jul 16, 2024
869be8d
feat: ✨ μ‚¬μš©μžκ°€ μˆ˜μ‹ ν•œ ν‘Έμ‹œ μ•Œλ¦Ό 리슀트 μ΅œμ‹ μˆœ 쑰회 (#134)
psychology50 Jul 17, 2024
4f51e7b
feat: ✨ 미확인 ν‘Έμ‹œ μ•Œλ¦Ό 읽음 처리 API (#136)
psychology50 Jul 18, 2024
381f3ea
refactor: ✏️ 맀일 μ •κΈ° ν‘Έμ‹œ μ•Œλ¦Ό 배치 μ„±λŠ₯ κ°œμ„  (#137)
psychology50 Jul 24, 2024
3d0b5d1
fix: πŸ› Sms type λ³€ν™˜ μ‹œ, 휴먼 μ—λŸ¬ 제거 및 예방 (#138)
psychology50 Jul 25, 2024
ab0de1e
feat: ✨ 미확인 ν‘Έμ‹œ μ•Œλ¦Ό 쑴재 μ—¬λΆ€ 확인 API (#139)
psychology50 Jul 25, 2024
6bd74c2
fix: πŸ› μ •κΈ° ν‘Έμ‹œ μ•Œλ¦Ό 배치 쿼리 ν”½μŠ€ & ItemReader κΈ°λŠ₯ μˆ˜μ • (#140)
psychology50 Jul 25, 2024
9175dfa
feat: ✨ 맀월 λͺ©ν‘œ κΈˆμ•‘ μ„€μ • 곡지 ν‘Έμ‹œ μ•Œλ¦Ό 배치 (#141)
psychology50 Jul 25, 2024
2f0a100
Api: πŸ› Spending Custom Category Delete Query Fix (#142)
psychology50 Jul 31, 2024
5566c29
feat: ✨ μ‚¬μš©μž μ •μ˜ μΉ΄ν…Œκ³ λ¦¬ 이동 API (#125)
asn6878 Jul 31, 2024
100ad7c
fix: ✏️ μ‚¬μš©μž μ‚­μ œ 둜직 μΆ”κ°€ (#143)
psychology50 Aug 4, 2024
f3c7226
fix: batch application timezone μ„€μ • (#144)
psychology50 Aug 4, 2024
84dab2b
feat: ✨ ν”„λ‘œν•„ 사진 μ‚­μ œ API 및 μˆ˜μ • API ν”½μŠ€, λ¦¬νŒ©ν† λ§ (#145)
psychology50 Aug 7, 2024
03994d7
feat: ✨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν—¬μŠ€ 체크λ₯Ό μœ„ν•œ Actuator μ˜μ‘΄μ„± μΆ”κ°€ (#146)
psychology50 Aug 7, 2024
b88d70c
fix: http not support method exception ν•Έλ“€λŸ¬μ— 반영 (#147)
psychology50 Aug 7, 2024
d7da829
Ignore: πŸ› Devcie Token μ‚­μ œ μ‹œ, μ‚¬μš©μžκ°€ 정보 μ‚­μ œλ˜λŠ” μ—λŸ¬ 핸듀링 (#148)
psychology50 Aug 13, 2024
6d0ee60
fix: missing request cookie exception ν•Έλ“€λŸ¬ μΆ”κ°€ (#149)
psychology50 Aug 13, 2024
1d6a1ca
refactor: πŸ”§ Swagger μ—λŸ¬ μ •μ˜ μ–΄λ…Έν…Œμ΄μ…˜ (#150)
psychology50 Aug 13, 2024
a67b589
refactor: πŸ”§ Redisson Auto Configuration 제거 및 도메인 λͺ¨λ“ˆ 의쑴 μ œμ–΄ (#151)
psychology50 Aug 13, 2024
5f1e909
fix: ✏️ Device Token Session 관리λ₯Ό μœ„ν•œ 둜직 μˆ˜μ • (#152)
psychology50 Aug 13, 2024
f472173
fix: device token 쑰회 μ‹œ, 7일 μ΄λ‚΄μ˜ λ°μ΄ν„°λ§Œ κ°€μ Έμ˜€λŠ” 쑰건 μΆ”κ°€ (#153)
psychology50 Aug 13, 2024
0efc066
fix: πŸ› ꡐ톡비 -> ꡐ톡 (#155)
psychology50 Aug 19, 2024
24d7262
fix: ✏️ OAuth 계정 연동 λˆ„λ½λœ μ˜ˆμ™Έμ²˜λ¦¬ μˆ˜μ • (OAuth 연동 μ •μ±… μˆ˜μ •) (#156)
psychology50 Aug 20, 2024
96d9bd8
fix: πŸ› μΉ΄ν…Œκ³ λ¦¬ 별 μ†ŒλΉ„ λ‚΄μ—­ 리슀트 쑰회 μ •λ ¬ 쑰건 μˆ˜μ • (#157)
psychology50 Aug 22, 2024
f3216b4
πŸ”§ Blue-Green 배포λ₯Ό μœ„ν•œ deploy script μˆ˜μ • (#154)
jinlee1703 Aug 24, 2024
af1a9a5
fix: ✏️ Proxy μ„œλ²„λ‘œ IP Logging μœ„μž„μ„ ν†΅ν•œ WAS μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄ 인터셉터 제거 (#158)
psychology50 Aug 27, 2024
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
Prev Previous commit
Next Next commit
feat: ✨ μ •κΈ° μ§€μΆœ 등둝 μ•Œλ¦Ό 배치 & μŠ€μΌ€μ€„λŸ¬ (#124)
* fix: 배포 νŒŒμ΄ν”„λΌμΈ 이미지 λΉŒλ“œ 버전 μΆ”κ°€

* feat: domain λͺ¨λ“ˆ λ‚΄ notify_type μ •μ˜

* fix: fcm_config @enable_async μΆ”κ°€

* feat: notification_event 객체 생성

* fix: μ•Œλ¦Ό 이벀트 객체 image_url ν•„λ“œ μΆ”κ°€

* fix: ν‘Έμ‹œ μ•Œλ¦Ό 이벀트 class -> record νƒ€μž… λ³€κ²½ 및 νŽΈμ˜μ„± λ©”μ„œλ“œ μΆ”κ°€

* feat: fcm ν‘Έμ‹œ μ•Œλ¦Ό 전솑을 μœ„ν•œ fcm_manager μž‘μ„±

* fix: fcm_manager send_message() λ°˜ν™˜ κ°’ api_future둜 μˆ˜μ •

* feat: ν‘Έμ‹œ μ•Œλ¦Ό 이벀트 ν•Έλ“€λŸ¬ μž‘μ„±

* rename: ν‘Έμ‹œ μ•Œλ¦Ό ν•Έλ“€λŸ¬ 주석 μˆ˜μ •

* chore: batch config μž‘μ„±

* feat: μ •μΉ˜ μ§€μΆœ 관리 μ•Œλ¦Ό job μ„€μ •

* feat: μ •κΈ° μ§€μΆœ 관리 μ•Œλ¦Ό step μ„€μ •

* feat: ν™œμ„±ν™”λœ λ””λ°”μ΄μŠ€ 토큰 탐색 reader μ •μ˜

* feat: ν‘Έμ‹œ μ•Œλ¦Ό ν”„λ‘œμ„Έμ„œ μ •μ˜

* feat: ν‘Έμ‹œ μ•Œλ¦Ό writer μž„μ‹œ μ •μ˜

* feat: job & step 빈 μ£Όμž…

* chore: @enable_scheduling μ–΄λ…Έν…Œμ΄μ…˜ μ„ μ–Έ

* chore: yml νŒŒμΌμ— schedule μ„€μ • μΆ”κ°€

* chore: μ •κΈ° μ•ŒλžŒ cron 정보 .yml 등둝

* fix: ν‘Έμ‹œ μ•Œλ¦Ό 이벀트 @Getter 제거

* feat: 정리 μ•Œλ¦Ό batch scheduler μž‘μ„±

* fix: device_token_repository list_crud_repository -> jpa_repository

* fix: token 쑰회 μ‹œ, ν™œμ„±ν™”λœ ν† ν°λ§Œ μ‘°νšŒν•˜λ„λ‘ λ©”μ„œλ“œ μΆ”κ°€

* fix: fcm_manager getter λ©”μ„œλ“œ μˆ˜μ •

* fix: active_device_token_reader generic 제거

* feat: device_info dto μ •μ˜

* rename: device_token dto 이름 μˆ˜μ •

* fix: device entity μ œλ„€λ¦­ -> device_token_owner dto둜 λ³€κ²½

* feat: device_token_owner ν™œμ„±ν™” 토큰 νŽ˜μ΄μ§€ 쑰회 쿼리 μΆ”κ°€

* feat: 곡지사항 enum νƒ€μž… 생성

* rename: 곡지 사항 μ—΄κ±° νƒ€μž… 이름 μˆ˜μ • announce -> announcement

* fix: notice_type legacy_common_type κ΅¬ν˜„

* feat: μ•Œλ¦Ό νƒ€μž… 컨버터 μž‘μ„±

* feat: 곡지 μ•Œλ¦Ό νƒ€μž… 컨버터 생성

* fix: job_config μ‹€νŒ¨ μΌ€μ΄μŠ€ μž¬μ‹€ν–‰ or 쀑지 ν”Œλ‘œμš° μΆ”κ°€

* feat: notification_repository μ •μ˜

* feat: device_token_owner dto μ‚¬μš©μž 이름 ν•„λ“œ μΆ”κ°€

* fix: device_token_owner dto 쑰회 query μˆ˜μ • (user entity left join μΆ”κ°€)

* style: 인자 μˆœμ„œ λ³€κ²½

* fix: group by u.id 쑰건 μΆ”κ°€

* rename: find_activated_device_token_owners λ©”μ„œλ“œ μΈν„°νŽ˜μ΄μŠ€μ— 주석 μΆ”κ°€

* feat: μ•Œλ¦Ό 벌크 insert λ©”μ„œλ“œ μΆ”κ°€

* feat: notification entity builder 클래슀 생성

* feat: notification repository query dsl interface μž‘μ„±

* feat: μ •κΈ° μ§€μΆœ 등둝 μ•Œλ¦Ό 벌크 μ‚½μž… μ—°μ‚° λ©”μ„œλ“œ μΆ”κ°€

* fix: κΈ°μ‘΄ ν‘Έμ‹œ μ•Œλ¦Ό μ €μž₯ λ©”μ„œλ“œ 제거"

* feat: μ •κΈ° μ§€μΆœ ν‘Έμ‹œ μ•Œλ¦Ό writer batch κ΅¬ν˜„

* fix: notification entity announcement ν•„λ“œ μΆ”κ°€

* fix: notification read batch 호좜 λ©”μ„œλ“œ μˆ˜μ •

* rename: μ •κΈ° 지쀄 등둝 μ•Œλ¦Ό 벌크 μ‚½μž… λ©”μ„œλ“œ 주석 μΆ”κ°€

* fix: ν‘Έμ‹œ μ•Œλ¦Ό 벌크 μ‚½μž… μ—°μ‚° 쑰건절 μˆ˜μ •

* rename: ν‘Έμ‹œ μ•Œλ¦Ό 벌크 μ‚½μž… μ—°μ‚° λ©”μ„œλ“œ 쿼리 주석 μΆ”κ°€

* feat: 곡지 μ•Œλ¦Ό νƒ€μž… ν¬λ§€νŒ… λ©”μ„œλ“œ μΆ”κ°€

* fix: batch writerμ—μ„œ publisher 등둝 μ‹œ 반볡문 ν˜ΈμΆœν•˜λ„λ‘ μˆ˜μ •

* feat: μ •κΈ° μ§€μΆœ 등둝 ν‘Έμ‹œ μ•Œλ¦Ό dto μ •μ˜

* fix: process 배치 λ°˜ν™˜ νƒ€μž… μˆ˜μ •

* fix: step chunk generic κ°’ μˆ˜μ •

* fix: writer batch λ§€κ°œλ³€μˆ˜ νƒ€μž… μˆ˜μ • & 둜직 μˆ˜μ •

* fix: μ •κΈ° μ§€μΆœ 등둝 μ•Œλ¦Ό dto ν•„λ“œμ—μ„œ published_at 제거

* fix: device_token_repository read_device_tokens_activate_is_true λ©”μ„œλ“œ 제거

* chore: @enable_async config 파일 뢄리

* chore: batch_application 경둜 μˆ˜μ •

* fix: notification_event_handler @async μ–΄λ…Έν…Œμ΄μ…˜ μΆ”κ°€

* fix: fcm_manager 빈 μ£Όμž… 방식 μˆ˜μ •

* feat: notification_handler interface μ •μ˜

* fix: notification event handler impl 클래슀λͺ… μˆ˜μ •

* test: μ•Œλ¦Ό μ„€μ • ν—ˆμš© μ‚¬μš©μžμ˜ ν™œμ„±ν™”λœ λ””λ°”μ΄μŠ€ 토큰 쑰회 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„±

* test: μ‚¬μš©μžλ³„ device_token 리슀트 λ‹΄κΈ°λŠ” 것을 ν…ŒμŠ€νŠΈ

* chore: mysql_container only_full_group_by μ˜΅μ…˜ 제거

* test: repository λ©”μ„œλ“œ 호좜 κ²°κ³Ό map μ»¬λ ‰μ…˜μœΌλ‘œ λ§€ν•‘ν•˜μ—¬ κ²°κ³Ό 비ꡐ

* test: λ””λ²„κΉ…μš© log 제거

* fix: device_token_owner device_tokens -> device_token

* fix: ν‘Έμ‹œ μ•Œλ¦Ό ν—ˆμš© μ‚¬μš©μžμ˜ ν™œμ„±ν™”λœ λ””λ°”μ΄μŠ€ 토큰 탐색 μΏΌλ¦¬μ—μ„œ group_by절 제거

* fix: daily_spending_notification dto device_tokens -> device_token ν•„λ“œ μˆ˜μ •

* fix: daily_spending_notification dto 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œ μˆ˜μ • & λ””λ°”μ΄μŠ€ 토큰 μΆ”κ°€ λ©”μ„œλ“œ

* fix: batch output μ œλ„€λ¦­ νƒ€μž… μˆ˜μ •

* fix: 배치 writer λ‚΄λΆ€ 둜직 μˆ˜μ • -> daily_spending_notification 맀핑 둜직 μΆ”κ°€

* test: notification bulk insert method ν…ŒμŠ€νŠΈ

* fix: bulk insert μ‹œ, query_dslμ—μ„œ jdbc_templateλ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ λ³€κ²½

* fix: notification entity read_at nullable ν—ˆμš©

* test: notification 쀑볡 μ €μž₯ μ•ˆ λ˜λŠ” 것을 확인

* fix: reader batch bean 이름 μˆ˜μ •

* chore: batch λͺ¨λ“ˆ fcm config ν™œμ„±ν™”

* chore: batch application μƒμœ„ 경둜둜 이동

* fix: cron value application.ymlμ—μ„œ μ œκ±°ν•˜κ³  직접 μž…λ ₯

* fix: count μΏΌλ¦¬μ—μ„œ select λˆ„λ½ μˆ˜μ •

* rename: reader-processor-writer 주석 μΆ”κ°€

* rename: fcm λ©”μ‹œμ§€ 전솑 μ‹œ 단일/닀쀑 둜그 μΆ”κ°€

* fix: ν‘Έμ‹œ μ•Œλ¦Ό dto device_token 쀑볡 제거λ₯Ό μœ„ν•΄ list -> set νƒ€μž…μœΌλ‘œ μˆ˜μ •

* fix: μ‚¬μš©μž 아이디 리슀트 μ–»κΈ° μœ„ν•œ 둜직 μˆ˜μ • (key_set으둜 νšλ“)

* refactor: notification_event_handler interface λ©”μ„œλ“œ μΆ”κ°€

* rename: notification_event_handler μ£Όμ„μ—μ„œ νƒ€μž… μΈν„°νŽ˜μ΄μŠ€ -> μΈν„°νŽ˜μ΄μŠ€λ‘œ μˆ˜μ •

* rename: notification_event_handler λͺ…μ„Έ μˆ˜μ •

* rename: notification_event_handler_impl -> fcm_notification_event_handler

* rename: find_activated_device_token_owners μ£Όμ„μ—μ„œ group by 절 제거

* rename: save_daily_spending_announce_in_bulk sql μ˜ˆμ‹œ μˆ˜μ •

* rename: reader 둜그 제거

* fix: device_token 쑰회 μ‹œ, count 쿼리λ₯Ό μœ„ν•œ 쑰건 μΆ”κ°€
  • Loading branch information
psychology50 authored Jul 11, 2024
commit 6e4341d5556a58bab2e08a064298d8dfd68334ed
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public abstract class ExternalApiDBTestConfig {
.withDatabaseName("pennyway")
.withUsername("root")
.withPassword("testpass")
.withCommand("--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION")
.withReuse(true);

REDIS_CONTAINER.start();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class PennywayBatchApplication {
public static void main(String[] args) {
SpringApplication.run(PennywayBatchApplication.class, args);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kr.co.pennyway.batch.config;

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class BatchConfig {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package kr.co.pennyway.batch.config;

import kr.co.pennyway.infra.common.importer.EnablePennywayInfraConfig;
import kr.co.pennyway.infra.common.importer.PennywayInfraConfigGroup;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnablePennywayInfraConfig({
PennywayInfraConfigGroup.FCM
})
public class InfraConfig {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package kr.co.pennyway.batch.dto;

import kr.co.pennyway.domain.domains.device.dto.DeviceTokenOwner;
import kr.co.pennyway.domain.domains.notification.type.Announcement;
import lombok.Builder;

import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

@Builder
public record DailySpendingNotification(
Long userId,
String title,
String content,
Set<String> deviceTokens
) {
public DailySpendingNotification {
Objects.requireNonNull(userId, "userId must not be null");
Objects.requireNonNull(title, "title must not be null");
Objects.requireNonNull(content, "content must not be null");
Objects.requireNonNull(deviceTokens, "deviceTokens must not be null");
}

/**
* {@link DeviceTokenOwner}λ₯Ό DailySpendingNotification DTO둜 λ³€ν™˜ν•˜λŠ” 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œ
* <p>
* DeviceToken은 List둜 λ³€ν™˜λ˜μ–΄ 멀버 λ³€μˆ˜λ‘œ κ΄€λ¦¬ν•˜κ²Œ λœλ‹€.
*/
public static DailySpendingNotification from(DeviceTokenOwner owner) {
Announcement announcement = Announcement.DAILY_SPENDING;
Set<String> deviceTokens = new HashSet<>();
deviceTokens.add(owner.deviceToken());

return DailySpendingNotification.builder()
.userId(owner.userId())
.title(announcement.createFormattedTitle(owner.name()))
.content(announcement.getContent())
.deviceTokens(deviceTokens)
.build();
}

public void addDeviceToken(String deviceToken) {
deviceTokens.add(deviceToken);
}

/**
* DeviceToken을 List둜 λ³€ν™˜ν•˜μ—¬ Viewλ₯Ό λ°˜ν™˜ν•œλ‹€.
*/
public List<String> deviceTokensForList() {
return List.copyOf(deviceTokens);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package kr.co.pennyway.batch.job;

import kr.co.pennyway.batch.step.SendSpendingNotifyStepConfig;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@RequiredArgsConstructor
public class DailySpendingNotifyJobConfig {
private final JobRepository jobRepository;
private final SendSpendingNotifyStepConfig sendSpendingNotifyStepConfig;

@Bean
public Job dailyNotificationJob(PlatformTransactionManager transactionManager) {
return new JobBuilder("dailyNotificationJob", jobRepository)
.start(sendSpendingNotifyStepConfig.sendSpendingNotifyStep(transactionManager))
.on("FAILED")
.stopAndRestart(sendSpendingNotifyStepConfig.sendSpendingNotifyStep(transactionManager))
.on("*")
.end()
.end()
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package kr.co.pennyway.batch.processor;

import kr.co.pennyway.domain.domains.device.dto.DeviceTokenOwner;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class NotificationProcessor implements ItemProcessor<DeviceTokenOwner, DeviceTokenOwner> {

@Override
public DeviceTokenOwner process(@NonNull DeviceTokenOwner deviceTokenOwner) throws Exception {
log.info("NotificationProcessor μ‹€ν–‰");
return deviceTokenOwner;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package kr.co.pennyway.batch.reader;

import kr.co.pennyway.domain.domains.device.dto.DeviceTokenOwner;
import kr.co.pennyway.domain.domains.device.repository.DeviceTokenRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.item.data.RepositoryItemReader;
import org.springframework.batch.item.data.builder.RepositoryItemReaderBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Component;

import java.util.HashMap;

@Slf4j
@Component
@RequiredArgsConstructor
public class ActiveDeviceTokenReader {
private final DeviceTokenRepository deviceTokenRepository;

@Bean
public RepositoryItemReader<DeviceTokenOwner> execute() {
return new RepositoryItemReaderBuilder<DeviceTokenOwner>()
.name("execute")
.repository(deviceTokenRepository)
.methodName("findActivatedDeviceTokenOwners")
.pageSize(100)
.sorts(new HashMap<>() {{
put("id", Sort.Direction.ASC);
}})
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package kr.co.pennyway.batch.scheduler;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@RequiredArgsConstructor
public class SpendingNotifyScheduler {
private final JobLauncher jobLauncher;
private final Job dailyNotificationJob;

@Scheduled(cron = "0 0 20 * * ?")
public void runDailyNotificationJob() {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();

try {
jobLauncher.run(dailyNotificationJob, jobParameters);
} catch (JobExecutionAlreadyRunningException | JobRestartException
| JobInstanceAlreadyCompleteException | JobParametersInvalidException e) {
log.error("Failed to run dailyNotificationJob", e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package kr.co.pennyway.batch.step;

import kr.co.pennyway.batch.processor.NotificationProcessor;
import kr.co.pennyway.batch.reader.ActiveDeviceTokenReader;
import kr.co.pennyway.batch.writer.NotificationWriter;
import kr.co.pennyway.domain.domains.device.dto.DeviceTokenOwner;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@RequiredArgsConstructor
public class SendSpendingNotifyStepConfig {
private final JobRepository jobRepository;
private final ActiveDeviceTokenReader reader;
private final NotificationProcessor processor;
private final NotificationWriter writer;

@Bean
public Step sendSpendingNotifyStep(PlatformTransactionManager transactionManager) {
return new StepBuilder("sendSpendingNotifyStep", jobRepository)
.<DeviceTokenOwner, DeviceTokenOwner>chunk(100, transactionManager)
.reader(reader.execute())
.processor(processor)
.writer(writer)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package kr.co.pennyway.batch.writer;

import kr.co.pennyway.batch.dto.DailySpendingNotification;
import kr.co.pennyway.domain.domains.device.dto.DeviceTokenOwner;
import kr.co.pennyway.domain.domains.notification.repository.NotificationRepository;
import kr.co.pennyway.domain.domains.notification.type.Announcement;
import kr.co.pennyway.infra.common.event.NotificationEvent;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ItemWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Component
@RequiredArgsConstructor
public class NotificationWriter implements ItemWriter<DeviceTokenOwner> {
private final NotificationRepository notificationRepository;
private final ApplicationEventPublisher publisher;

@Override
@Transactional
public void write(@NonNull Chunk<? extends DeviceTokenOwner> owners) throws Exception {
log.info("Writer μ‹€ν–‰: {}", owners.size());
LocalDateTime publishedAt = LocalDateTime.now();

Map<Long, DailySpendingNotification> notificationMap = new HashMap<>();

for (DeviceTokenOwner owner : owners) {
notificationMap.computeIfAbsent(owner.userId(), k -> DailySpendingNotification.from(owner)).addDeviceToken(owner.deviceToken());
}

List<Long> userIds = new ArrayList<>(notificationMap.keySet());

notificationRepository.saveDailySpendingAnnounceInBulk(userIds, publishedAt, Announcement.DAILY_SPENDING);

for (DailySpendingNotification notification : notificationMap.values()) {
publisher.publishEvent(NotificationEvent.of(notification.title(), notification.content(), notification.deviceTokensForList(), ""));
}
}
}
12 changes: 12 additions & 0 deletions pennyway-batch/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@ spring:
local: common, domain, infra
dev: common, domain, infra

batch:
job:
enabled: false

task:
scheduling:
pool:
size: 5
shutdown:
await-termination: true # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ’…λ£Œ μ‹œ λͺ¨λ“  Taskκ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°
await-termination-period: 60000 # λŒ€κΈ° μ‹œκ°„ 60초

---
spring:
config:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package kr.co.pennyway.domain.common.converter;

import jakarta.persistence.Converter;
import kr.co.pennyway.domain.domains.notification.type.Announcement;

@Converter
public class AnnouncementConverter extends AbstractLegacyEnumAttributeConverter<Announcement> {
private static final String ENUM_NAME = "곡지 νƒ€μž…";

public AnnouncementConverter() {
super(Announcement.class, false, ENUM_NAME);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package kr.co.pennyway.domain.common.converter;

import jakarta.persistence.Converter;
import kr.co.pennyway.domain.domains.notification.type.NoticeType;

@Converter
public class NoticeTypeConverter extends AbstractLegacyEnumAttributeConverter<NoticeType> {
private static final String ENUM_NAME = "μ•Œλ¦Ό νƒ€μž…";

public NoticeTypeConverter() {
super(NoticeType.class, false, ENUM_NAME);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package kr.co.pennyway.domain.domains.device.dto;

/**
* λ””λ°”μ΄μŠ€ 토큰과 μœ μ € 아이디λ₯Ό 담은 DTO
*/
public record DeviceTokenOwner(
Long userId,
String name,
String deviceToken
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package kr.co.pennyway.domain.domains.device.repository;

import kr.co.pennyway.domain.domains.device.dto.DeviceTokenOwner;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public interface DeviceTokenCustomRepository {
/**
* μ‚¬μš©μž 아이디, 이름 그리고 λ””λ°”μ΄μŠ€ 토큰 리슀트λ₯Ό μ‘°νšŒν•˜μ—¬, {@link DeviceTokenOwner} 객체둜 λ°˜ν™˜ν•œλ‹€.
* <p>
* 이 λ•Œ, μ‚¬μš©μžμ˜ κ³„μ’ŒλΆ μ•Œλ¦Ό 섀정이 ν™œμ„±ν™”λ˜μ–΄ μžˆμ–΄μ•Ό ν•˜λ©°, λ””λ°”μ΄μŠ€ 토큰은 ν™œμ„±ν™”λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.
* <p>
*
* @apiNote 이 λ©”μ„œλ“œλŠ” νŽ˜μ΄μ§• 처리λ₯Ό ν•˜κ³  있으며, μ‚¬μš©μž 아이디λ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•œλ‹€.
* 이 λ•Œ, sizeκ°€ 100이고 ν•œ λͺ…μ˜ μ‚¬μš©μžκ°€ μ—¬λŸ¬ 개의 λ””λ°”μ΄μŠ€ 토큰(각각 pkκ°€ 99, 100, 101)을 가지고 μžˆλ‹€λ©΄,
* 101λ²ˆμ— λŒ€ν•œ 토큰은 λ‹€μŒ νŽ˜μ΄μ§€λ‘œ λ„˜μ–΄κ°€κ²Œ λ˜λ―€λ‘œ 이에 λŒ€ν•œ μ˜ˆμ™Έ μ²˜λ¦¬κ°€ ν•„μš”ν•˜λ‹€.
*
* <pre>
* {@code
* SELECT d.token, u.id, u.name
* FROM device_token d
* LEFT JOIN user u ON d.user_id = u.id
* WHERE d.activated = true AND u.account_book_notify = true
* ORDER BY u.id ASC
* LIMIT ${pageable.pageSize} OFFSET ${pageable.offset}
* ;
* }
* </pre>
*/
Page<DeviceTokenOwner> findActivatedDeviceTokenOwners(Pageable pageable);
}
Loading