From 790f5a32df9452937aab62e0667ea56205484111 Mon Sep 17 00:00:00 2001 From: gomin0 Date: Sun, 4 Aug 2024 14:37:54 +0900 Subject: [PATCH] =?UTF-8?q?[BUG]=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EB=B0=8F=20firebase=20=EC=82=AD=EC=A0=9C=EB=90=9C=EA=B1=B0?= =?UTF-8?q?=20=EB=B3=B5=EA=B5=AC=20(#171)=20(#172)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial commit * ๐ŸŽ‰ feat: Initial commit * :sparkles: feat: ์ดˆ๊ธฐ ์…‹ํŒ… (#1) (#2) * Update issue templates * [FEATURE] accounts ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ์ž‘์„ฑ (#3) (#4) * :rocket: chore: JPA dependency ์ถ”๊ฐ€ (#3) * :sparkles: feat: BaseEntity ์ž‘์„ฑ (#3) * :sparkles: feat: User ์—”ํ‹ฐํ‹ฐ ์ž‘์„ฑ (#3) * :sparkles: feat: Profile ์—”ํ‹ฐํ‹ฐ ์ž‘์„ฑ (#3) * :sparkles: feat: ์„ฑ๋ณ„ enum ํด๋ž˜์Šค ์ž‘์„ฑ (#3) * โœจfeat: myTeam ์—”ํ‹ฐํ‹ฐ ๊ตฌํ˜„ (#7) * [FEATURE] ๋กœ๊ทธ์ธ&ํšŒ์›๊ฐ€์ž… ๊ตฌํ˜„ (#5) (#6) * :rocket: chore: dependency ์ถ”๊ฐ€ (#5) * :rocket: chore: application.yml ์ž‘์„ฑ (#5) * :sparkles: feat: ๋„๋ฉ”์ผ ํŒŒ์ผ ์œ„์น˜ ๋ณ€๊ฒฝ (#5) * :sparkles: feat: ๋กœ๊ทธ์ธid ์‚ญ์ œ (#5) * :sparkles: feat: security, jwt ์ถ”๊ฐ€ (#5) * :sparkles: feat: base ์—๋Ÿฌ ์ž‘์„ฑ (#5) * :sparkles: feat: ApiResponse ์ž‘์„ฑ (#5) * :sparkles: feat: base ์—๋Ÿฌ ์ž‘์„ฑ (#5) * :sparkles: feat: ๊ธฐ๋ณธ login, signup ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์„ฑ (#5) * :sparkles: feat: CustomUserDetailService ์ž‘์„ฑ (#5) * :sparkles: feat: AccountsService ์ž‘์„ฑ (#5) * :sparkles: feat: UserJpaRepository ์ž‘์„ฑ (#5) * :sparkles: feat: ๊ธฐ๋ณธ Login Dto ์ž‘์„ฑ (#5) * :sparkles: feat: ๊ธฐ๋ณธ Signup Dto ์ž‘์„ฑ (#5) * :sparkles: feat: ๊ธฐ๋ณธ UserLoginRequestDto ์ˆ˜์ • (#5) * :sparkles: feat: responseDto createdAt ์ˆ˜์ • (#5) * :sparkles: feat: AccountsController ์ˆ˜์ • (#5) * :sparkles: feat: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” import๋ฌธ ์‚ญ์ œ (#5) * :sparkles: security, jwt ๋”์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ์‚ฌ์šฉ ์ˆ˜์ • (#5) * :sparkles: JwtProvider ์ˆ˜์ • (#5) * โœจfeat: CalendarEvent ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • (#7) * โœจfeat: Team ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • (#7) * โœจfeat: TeamMember ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • (#7) * โœจfeat: Role(ENUM) ์—”ํ‹ฐํ‹ฐ ์ถ”๊ฐ€๊ตฌํ˜„ (#7) * [FEATURE] Swagger ์„ค์ • (#9) (#11) * :rocket: chore: Swagger dependency ์ถ”๊ฐ€ (#9) * :rocket: chore: com.google.guava ๋ฒ„์ „ ์ˆ˜์ • (#9) * :sparkles: feat: Swagger url ์ถ”๊ฐ€ (#9) * :sparkles: feat: SwaggerConfig ์ž‘์„ฑ (#9) * [FEATURE] Tactic ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ์ž‘์„ฑ (#10) (#13) * :sparkles: feat: Position enum ํด๋ž˜์Šค ์ž‘์„ฑ (#10) * :sparkles: feat: Tactic ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์ž‘์„ฑ (#10) * :sparkles: feat: TacticComment ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์ž‘์„ฑ (#10) * :sparkles: feat: TacticLike ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์ž‘์„ฑ (#10) * :sparkles: feat: TacticPositionDetail ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์ž‘์„ฑ (#10) * :sparkles: feat: @Table ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€ (#10) * :lipstick: feat: ์ปค๋ฐ‹ ํ‘ธ์‰ฌ ํ…Œ์ŠคํŠธ (#10) * [REFACTOR] ์—”ํ‹ฐํ‹ฐ ๊ฒฝ๋กœ ์ˆ˜์ •(#14) (#15) * :recycle:refactor: CalendarEvent BaseEntity ๊ฒฝ๋กœ ์ˆ˜์ • (#14) * :recycle:refactor: Tactic&Team ๋งคํ•‘(#14) * :recycle:refactor: Team&Tactic ๋งคํ•‘(#14) * [REFACTOR] TeamMember BaseEntity ๊ฒฝ๋กœ ์ˆ˜์ • ๋ฐ User์™€์˜ ๋งคํ•‘(#16) (#18) * :recycle:refactor: CalendarEvent BaseEntity ๊ฒฝ๋กœ ์ˆ˜์ • (#14) * :recycle:refactor: Tactic&Team ๋งคํ•‘(#14) * :recycle:refactor: Team&Tactic ๋งคํ•‘(#14) * :recycle:refactor: BaseEntity ๊ฒฝ๋กœ ์ˆ˜์ • ๋ฐ User ์—”ํ‹ฐํ‹ฐ์™€์˜ ๋งคํ•‘(#16 ) * [FEATURE] User ์—”ํ‹ฐํ‹ฐ์— ์—ฐ๊ด€๊ด€๊ณ„ ์ถ”๊ฐ€ (#19) * :sparkles: feat: ์ปฌ๋Ÿผ๋ช… ์ง€์ • (#17) * :sparkles: feat: ์—ฐ๊ด€๊ด€๊ณ„ ์ง€์ • (#17) * :sparkles: feat: User ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • (#17) * :sparkles: feat: Profile ์ปฌ๋Ÿผ๋ช… ์ˆ˜์ • (#17) * [FEATUER] Spring Security, JWT ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ API ์ถ”๊ฐ€ (#21) (#22) * :sparkles: feat: AccountResolver ์–ด๋…ธํ…Œ์ด์…˜ ์ƒ์„ฑ (#21) * :sparkles: feat: test, ํ† ํฐ ์žฌ๋ฐœ๊ธ‰, ์ด๋ฉ”์ผ๋กœ ํšŒ์› ์กฐํšŒ API ์ž‘์„ฑ (#21) * :sparkles: feat: AccountsQueryService ์ž‘์„ฑ (#21) * :recycle: refactor: AccountsService ์ˆ˜์ • (#21) * :sparkles: feat: ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž… ํ…Œ์ŠคํŠธ (#21) * :recycle: refactor: ํŒŒ์ผ ์œ„์น˜ ์ˆ˜์ • (#21) * :recycle: refactor: User ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • (#21) * :recycle: refactor: SecurityConfig ํŒŒ์ผ ๋ฆฌํŒฉํ† ๋ง (#21) * :sparkles: feat: CorsConfig ์ž‘์„ฑ (#21) * :recycle: refactor: User์— ์žˆ๋˜ UserDetails ์ด๋™ (#21) * :sparkles: feat: CustomUserDetailService์ˆ˜์ • (#21) * :sparkles: feat: HttpResponseUtil ์ถ”๊ฐ€ (#21) * :sparkles: feat: Security JWT ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ (#21) * :sparkles: feat: refreshToken ์ถ”๊ฐ€ (#21) * :sparkles: feat: findUserByEmail ์ž‘์„ฑ (#21) * :recycles: refactor: JwtProvider ๋ฆฌํŒฉํ† ๋ง ๋ฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (#21) * :lipstick: style: ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ import๋ฌธ ์‚ญ์ œ ๋ฐ ๋งค์„œ๋“œ ์ฃผ์„ ์ฒ˜๋ฆฌ (#21) * :recycles: refactor: ์ง€์› ์ค‘๋‹จ๋œ ๋งค์„œ๋“œ ์ˆ˜์ • (#21) * :recycles: refactor: ๋ณ€์ˆ˜ ์ค‘๋ณต ์ธ๋ผ์ธํ™” (#21) * :recycles: refactor: ๋ณ€์ˆ˜ ์ค‘๋ณต ์ธ๋ผ์ธํ™” (#21) * :recycles: refactor: User ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • (#21) * [FEATURE] ๋ฐฉ๊ตฌ์„ํŒ€ CRUD (#23) (#25) * โ™ป๏ธrefactor: team ์˜คํƒ€ ์ˆ˜์ • ๋ฐ Dto ๊ตฌํ˜„(#23 ) * โ™ป๏ธrefactor: team Repository, Service, ExceptionHandler ์ถ”๊ฐ€(#23 ) * โ™ป๏ธrefactor: Team ๊ด€๋ จ ErrorCode ์ถ”๊ฐ€(#23 ) * โ™ป๏ธrefactor: Team Controller ์ถ”๊ฐ€(#23 ) * โœจfeat: Team ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€(#23 ) * โœจfeat: Team ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€(#23 ) * โœจfeat: ๋ฐฉ๊ตฌ์„ํŒ€ ์ƒ์„ฑ ๋ฐ swaggerConfig "access token -> X-AUTH-TOKEN์œผ๋กœ ๋ณ€๊ฒฝ" (#23 ) * โœจfeat: ๋ฐฉ๊ตฌ์„ํŒ€ ์ƒ์„ฑ ๋ฐ swaggerConfig "access token -> X-AUTH-TOKEN์œผ๋กœ ๋ณ€๊ฒฝ" (#23 ) * โœจfeat: ๋ฐฉ๊ตฌ์„ํŒ€ ์—…๋ฐ์ดํŠธ" (#23 ) * โœจfeat: ๋ฐฉ๊ตฌ์„ํŒ€ ์‚ญ์ œ" (#23 ) * โ™ป๏ธrefactor: ๋ฐฉ๊ตฌ์„ํŒ€ CRUD ์ตœ์ข… ๊ฒ€ํ† " (#23 ) --------- Co-authored-by: gomin0 * [FEATURE] Tactic ์ž‘์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ ๊ตฌํ˜„ (#20) (#26) * :sparkles: feat: ์ „์ˆ ์—๋Ÿฌ์ฝ”๋“œ ์ •์˜ (#20) * :sparkles: feat: updateTactic๋ฉ”์„œ๋“œ ์ •์˜ (#20) * :sparkles: feat: TacticController ๊ตฌํ˜„ (#20) * :sparkles: feat: TacticExceptionHandler ์ •์˜ (#20) * :sparkles: feat: TacticRepository ๊ตฌํ˜„ (#20) * :sparkles: feat: DTO ๊ตฌํ˜„ (#20) * :sparkles: feat: TacticService ๊ตฌํ˜„ (#20) --------- Co-authored-by: gomin0 * [BUG] ๋ฒ„๊ทธ ์ˆ˜์ • (#28) * :bug: fix: ErrorCode ๋ฒ„๊ทธ ์ˆ˜์ • (#24) * :bug: fix: User ์—”ํ‹ฐํ‹ฐ ๋ฒ„๊ทธ ์ˆ˜์ • (#24) * :bug: fix: Token ์ˆ˜์ • ๋ณต๊ตฌ (#24) * :bug: fix: TacticRepository ์ˆ˜์ • (#24) * :sparkles: feat: email unique ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * :sparkles: feat: Team ์—”ํ‹ฐํ‹ฐ CascadeType ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๊ธฐ ๋งค์„œ๋“œ (#29) * :sparkles: feat: CustomUserDetails, Service ์ˆ˜์ • (#29) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์‚ญ์ œ (#29) * [FEATURE] ์ด๋ฉ”์ผ๋กœ ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๋Š” ๋งค์„œ๋“œ ์ถ”๊ฐ€ (#29) (#30) * :sparkles: feat: email unique ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * :sparkles: feat: Team ์—”ํ‹ฐํ‹ฐ CascadeType ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๊ธฐ ๋งค์„œ๋“œ (#29) * :sparkles: feat: CustomUserDetails, Service ์ˆ˜์ • (#29) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์‚ญ์ œ (#29) * :sparkles: feat: User ์—”ํ‹ฐํ‹ฐ team์— Cascade ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * [FEATURE] kakao ์†Œ์…œ ํšŒ์›๊ฐ€์ž… & ๋กœ๊ทธ์ธ ๊ตฌํ˜„ (#33) * :rocket: chore: freemarker, gson ์˜์กด์„ฑ ์ถ”๊ฐ€ (#24) * :sparkles: feat: RestTemplate Bean ๋“ฑ๋ก (#24) * :sparkles: feat: ์นด์นด์˜ค ๋กœ๊ทธ์ธ ftl ํŒŒ์ผ (#24) * :sparkles: feat: KakaoService ์ž‘์„ฑ (#24) * :sparkles: feat: KakaoController login, redirect ์ž‘์„ฑ (#24) * :sparkles: feat: RetKakaoOAuth ์ž‘์„ฑ (#24) * :sparkles: feat: ์นด์นด์˜ค url ํ—ˆ์šฉ ์ถ”๊ฐ€ (#24) * :sparkles: feat: provider ์ถ”๊ฐ€ (#24) * :sparkles: feat: findByEmailAndProvider ์ถ”๊ฐ€ (#24) * :sparkles: feat: RetKakaoOAuth ์ž‘์„ฑ (#24) * :sparkles: feat: KakaoProfile ์ž‘์„ฑ (#24) * :sparkles: feat: Profile, User์— set ์ถ”๊ฐ€ (#24) * :sparkles: feat: ์นด์นด์˜ค ํšŒ์›๊ฐ€์ž… ์ถ”๊ฐ€ (#24) * :sparkles: feat: Dto ์ž‘์„ฑ (#24) * :sparkles: feat: URL ์ถ”๊ฐ€ (#24) * :sparkles: feat: kakao service ์ž‘์„ฑ (#24) * :sparkles: feat: ErrorCode ์ถ”๊ฐ€ (#24) * :sparkles: feat: ์นด์นด์˜ค ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์„ฑ (#24) * :sparkles: feat: ์นด์นด๋กœ ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ controller ๊ตฌํ˜„ (#24) * :sparkles: feat: ์นด์นด๋กœ ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ service ๊ตฌํ˜„ (#24) * :sparkles: feat: ์†Œ์…œ ํšŒ์›๊ฐ€์ž… ๊ตฌํ˜„ (#24) * :sparkles: feat: ํ”„๋กœํ•„ ์—”ํ‹ฐํ‹ฐ User JsonIgnore ์ฒ˜๋ฆฌ (#24) * :sparkles: feat: ์ด๋ฉ”์ผ ์ฒ˜๋ฆฌ (#24) * [FEATURE] Tactic ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ • ๋ฐ Read ์ถ”๊ฐ€ (#31) (#35) * :recycle: feat: record๋ฅผ ์‚ฌ์šฉํ•œ dto ๋ฆฌํŽ™ํ† ๋ง (#31) * :sparkles: feat: Read์— ํ•„์š”ํ•œ service ๊ตฌํ˜„ (#31) * :bug: feat: static ํ‚ค์›Œ๋“œ ๋ฒ„๊ทธ ์ˆ˜์ • (#31) * :bug: feat: record์—์„œ getter ๊ฐ€์ ธ์˜ค๋Š” ๋ณ€์ˆ˜๋ช… ์ˆ˜์ • (#31) * :sparkles: feat: Read ๊ฐœ๋ณ„, ์ „์ฒด api ์ž‘์„ฑ (#31) * :recycle: feat: private ๋ณ€์ˆ˜ ์„ ์–ธ์œผ๋กœ ์ˆ˜์ • (#31) * :recycle: feat: ๊ด€๋ จ errorcode ์ถ”๊ฐ€ ๋ฐ ์ž‘์„ฑํ•œ ์œ ์ € ํ™•์ธํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€ (#31) * :recycle: feat: TacticQueryService ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑ (#31) * :sparkles: feat: USER_NOT_MATCHED ์—๋Ÿฌ ์ฝ”๋“œ ์ž‘์„ฑ (#31) * :recycle: feat: TacticQueryService ์ฝ”๋“œ๋กœ ์ˆ˜์ • (#31) * :sparkles: feat: createTactic ์‚ฌ์šฉ์ž ์ •๋ณด ๋„ฃ๋Š” ๋กœ์ง ์ถ”๊ฐ€ (#31) --------- Co-authored-by: gomin0 * [REFACTOR] TeamDto Record๋กœ ๋ณ€๊ฒฝ & AccountServiceUtils ์ ์šฉ (#32) (#36) * โ™ป๏ธrefactor: "์ „์ฒด dto record๋กœ ๋ณ€๊ฒฝ(#32)" * โœจfeat: "AccountServiceUtils ์ ์šฉ(#32)" * โœจfeat: "์ตœ์ข… ๋งˆ๋ฌด๋ฆฌ(#32)" * โ™ป๏ธrefactor: "Team ์ˆ˜์ •, ์‚ญ์ œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€(#32)" --------- Co-authored-by: gomin0 * [BUG] Tactic, AccountsController ๋ฒ„๊ทธ ํ”ฝ์Šค (#38) (#39) * :sparkles: feat: email unique ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * :sparkles: feat: Team ์—”ํ‹ฐํ‹ฐ CascadeType ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๊ธฐ ๋งค์„œ๋“œ (#29) * :sparkles: feat: CustomUserDetails, Service ์ˆ˜์ • (#29) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์‚ญ์ œ (#29) * :bug: fix: test ์‚ญ์ œ (#38) * :bug: fix: anonymous ๋””ํดํŠธ๊ฐ’ ๋ฒ„๊ทธ ์ˆ˜์ • (#38) * :recycle: feat: updateTactic์œผ๋กœ ๋ฉ”์„œ๋“œ ๋ช… ์ˆ˜์ • (#37) * :recycle: feat: @NotBlank ์–ด๋…ธํ…Œ์ด์…˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค๋ช… ์ˆ˜์ • (#37) * :recycle: feat: nickname, provider ์ถ”๊ฐ€ (#37) * :recycle: feat: ๊ธฐ์กด Request dto create/update dto๋กœ ๋ถ„๋ฆฌ (#37) * :recycle: feat: ๋ˆ„๋ฝ๋œ ํ•„๋“œ(๊ณต๊ฒฉ/์ˆ˜๋น„ ํฌ๋ฉ”์ด์…˜) ์ถ”๊ฐ€ (#37) * :recycle: feat: ๋ณ€๊ฒฝ๋œ dto๋กœ ์ปจํŠธ๋กค๋Ÿฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์ • (#37) * :recycle: feat: ํ•„์š”์—†๋Š” ๋ฉ”์„œ๋“œ ์‚ญ์ œ (#37) * :bug: feat: Update ์‹œ, primaryํ‚ค๊ฐ€ ๋ฐ”๋€Œ๋Š” ๋ฌธ์ œ ์ˆ˜์ • (#37) * :recycle: feat: @Setter ์‚ญ์ œ ๋ฐ ํ•„์š”ํ•œ setter๋งŒ ๊ตฌํ˜„ (#37) * [FEATURE] Redis ์ ์šฉ (#34) (#43) * :sparkles: feat: email unique ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * :sparkles: feat: Team ์—”ํ‹ฐํ‹ฐ CascadeType ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๊ธฐ ๋งค์„œ๋“œ (#29) * :sparkles: feat: CustomUserDetails, Service ์ˆ˜์ • (#29) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์‚ญ์ œ (#29) * :rocket: chore: redis dependency ์ถ”๊ฐ€ (#34) * :sparkles: feat: validateRefreshToken ์ ์šฉ (#34) * :sparkles: feat: redis Config, Util ์ž‘์„ฑ (#34) * :sparkles: feat: redis ์ ์šฉ (#34) * :lipstick: style: ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” import ๋ฌธ ์‚ญ์ œ (#34) * โœจfeature: "๋‚ด ํŒ€์— ์ „์ˆ  ์ ์šฉํ•˜๊ธฐ(#40)" * ๐Ÿ›fix: "createdAt null๊ฐ’ ๋ฌธ์ œ ํ•ด๊ฒฐ(#40)" * โ™ป๏ธrefactor: "TeamService์— ์‚ฌ์šฉ์ž ์ธ์ฆ ๋กœ์ง ๋‹ค์‹œ ์ถ”๊ฐ€(#40)" * [FEATURE] ๋กœ๊ทธ์•„์›ƒ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๊ตฌํ˜„ (#44) (#46) * :sparkles: feat: email unique ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * :sparkles: feat: Team ์—”ํ‹ฐํ‹ฐ CascadeType ์กฐ๊ฑด ์ถ”๊ฐ€ (#29) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๊ธฐ ๋งค์„œ๋“œ (#29) * :sparkles: feat: CustomUserDetails, Service ์ˆ˜์ • (#29) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์‚ญ์ œ (#29) * :sparkles: feat: getExpTime ์ž‘์„ฑ (#44) * :sparkles: feat: password set๋งค์„œ๋“œ ์ž‘์„ฑ (#44) * :sparkles: feat: forgotPw url ํ—ˆ์šฉ (#44) * :sparkles: feat: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ Dto (#44) * :sparkles: feat: ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ Dto (#44) * :sparkles: feat: ๋กœ๊ทธ์•„์›ƒ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๊ตฌํ˜„ (#44) * โ™ป๏ธrefactor: "MyTeam์— tactic ์ ์šฉ ์ˆ˜์ •(#47)" * :sparkles: feat: ๋Œ“๊ธ€ ๊ด€๋ จ Request DTO ๊ตฌํ˜„ (#42) * :sparkles: feat: ๋Œ“๊ธ€ ๊ด€๋ จ Response DTO ๊ตฌํ˜„ (#42) * :sparkles: feat: CommentRepository ๊ตฌํ˜„ (#42) * :sparkles: feat: ๋Œ“๊ธ€ CUD ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„ (#42) * :sparkles: feat: ๋Œ“๊ธ€ CUD ์„œ๋น„์Šค ๊ตฌํ˜„ (#42) * :sparkles: feat: ๋Œ“๊ธ€ ์—”ํ‹ฐํ‹ฐ์—์„œ ํ•„์š”ํ•œ Setter๋งŒ ๊ตฌํ˜„ (#42) * :sparkles: feat: ํ•„์š”ํ•œ ์—๋Ÿฌ์ฝ”๋“œ ์ถ”๊ฐ€ (#42) * :recycle: feat: {commentId}๋งŒ ์žˆ๊ฒŒ ์ฝ”๋“œ ์ˆ˜์ • (#42) * โœจfeature:ํŒ€์— ํŒ€์› ์ดˆ๋Œ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#50) * โœจfeature:ํŒ€์— ํŒ€์› ์ดˆ๋Œ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#50) * :sparkles: feat: LikeRepository ๊ตฌํ˜„ (#52) * :sparkles: feat: ์ข‹์•„์š” ๊ด€๋ จ ApiResponse ์ถ”๊ฐ€ (#52) * :sparkles: feat: ์ข‹์•„์š” ๊ด€๋ จ Controller ๊ตฌํ˜„ (#52) * :recycle: feat: Like ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ์ž ์ˆ˜์ • (#52) * :sparkles: feat: ์ข‹์•„์š” ์ƒ์„ฑ ๋ฐ ์ทจ์†Œ ๋กœ์ง ๊ตฌํ˜„ (#52) * โœจfeature:ํŒ€์— ํŒ€์› ๊ฐ•ํ‡ด ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#50) * โœจfeature:ํŒ€์› ์กฐํšŒ ๊ตฌํ˜„ (#50) * โ™ป๏ธrefactor:ํŒ€์› ์ดˆ๋Œ€, ๊ฐ•ํ‡ด, ํŒ€ ์กฐํšŒ ์‹œ leaderId ์กฐํšŒ๊นŒ์ง€ refactor (#50) * โ™ป๏ธrefactor:ํŒ€์› ์ดˆ๋Œ€, ๊ฐ•ํ‡ด, ํŒ€ ์กฐํšŒ ์‹œ leaderId ์กฐํšŒ๊นŒ์ง€ refactor (#50) * โ™ป๏ธrefactor:ํŒ€์› ์ดˆ๋Œ€, ๊ฐ•ํ‡ด, ํŒ€ ์กฐํšŒ ์‹œ leaderId ์กฐํšŒ๊นŒ์ง€ refactor (#50) * :sparkles: feat: ๋‚ด ์ „์ˆ  ๋ชฉ๋ก๋ณด๊ธฐ Controller ๊ตฌํ˜„ (#56) * :sparkles: feat: ๋‚ด ์ „์ˆ  ๋ชฉ๋ก๋ณด๊ธฐ Service ๊ตฌํ˜„ (#56) * โ™ป๏ธrefactor:ํŒ€ ์กฐํšŒ ์‹œ ํŒ€์›, ์ ์šฉ๋œ ์ „์ˆ  ์ถ”๊ฐ€ (#50) * โ™ป๏ธrefactor:ํŒ€ ์กฐํšŒ ์‹œ ํŒ€์›, ์ ์šฉ๋œ ์ „์ˆ  ์ถ”๊ฐ€ (#50) * โ™ป๏ธrefactor:ํŒ€ ์กฐํšŒ ์‹œ ํŒ€์›, ์ ์šฉ๋œ ์ „์ˆ  ์ถ”๊ฐ€ (#50) * โ™ป๏ธrefactor:ํŒ€ ์กฐํšŒ ์‹œ ํŒ€์›, ์ ์šฉ๋œ ์ „์ˆ  ์ถ”๊ฐ€ (#50) * โ™ป๏ธrefactor:์ „์ˆ  ์ ์šฉ ์‹œ ๋ณธ์ธ ์ „์ˆ ์‚ฌ์šฉ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ & GetTeamResponsedto ์žฌ๊ตฌํ˜„(#50) * โœจfeature:๋‚ดํŒ€ ๋ชฉ๋ก ์กฐํšŒ(#59) * โœจfeature:๋‚ด ์ „์ˆ  ๋ชฉ๋ก ์กฐํšŒ(#59) * โœจfeature:๋‚ด ์ „์ˆ  ๋ชฉ๋ก ์กฐํšŒ(#59) * :sparkles: feat: CreateProfileRequestDto ์ž‘์„ฑ (#48) * :sparkles: feat: ํ”„๋กœํ•„ ๊ด€๋ จ ์—๋Ÿฌ ์ฝ”๋“œ ์ถ”๊ฐ€ (#48) * :sparkles: feat: ํ”„๋กœํ•„ ๊ด€๋ จ ๋ถ€๋ถ„ ์ฃผ์„ ์ฒ˜๋ฆฌ (#48) * :sparkles: feat: set ๋งค์„œ๋“œ ์ถ”๊ฐ€ (#48) * :sparkles: feat: UpdateProfileRequestDto ์ž‘์„ฑ (#48) * :sparkles: feat: ํ”„๋กœํ•„ ์ƒ์„ฑ, ์ˆ˜์ • ์„œ๋น„์Šค ์ž‘์„ฑ (#48) * :sparkles: feat: ๋‚ด ํ”„๋กœํ•„, ๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ”„๋กœํ•„ ์กฐํšŒ ์„œ๋น„์Šค (#48) * :sparkles: feat: ๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ”„๋กœํ•„ ResponseDto (#48) * :sparkles: feat: ProfileResponseDto ์ž‘์„ฑ (#48) * :sparkles: feat: ProfileJpaRepository ์ž‘์„ฑ (#48) * :sparkles: feat: ProfileExceptionHandler ์ž‘์„ฑ (#48) * :sparkles: feat: Profile ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์„ฑ (#48) * :lipstick: style: ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” import ๋ฌธ ์ œ๊ฑฐ (#48) * :recycle: feat: ์ „์ˆ  ๊ฒŒ์‹œ๋ฌผ ๊ฐœ๋ณ„์กฐํšŒ์‹œ ์‚ฌ์šฉํ•˜๋Š” TacticDetailRes DTO ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑ (#61) * :recycle: feat: TacticController์— TacticDetailRes DTO ์ ์šฉ (#61) * :recycle: feat: TacticQueryService์— TacticDetailRes DTO ์ ์šฉ (#61) * :recycle: feat: TacticDetailResponse DTO์— ์ข‹์•„์š” ๊ฐœ์ˆ˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ๊ฐœ์ˆ˜ ์กฐํšŒ ๊ตฌํ˜„ (#61) * โ™ป๏ธ refactor: ํŒ€์› ๋ฆฌ์ŠคํŠธ ์กฐํšŒ ์‹œ LEADER๋„ ํฌํ•จ๋˜๊ฒŒ refactor * โ™ป๏ธ refactor: ํŒ€์› ๋ฆฌ์ŠคํŠธ ์กฐํšŒ ์‹œ LEADER๋„ ํฌํ•จ๋˜๊ฒŒ refactor (์ฒ˜์Œ์— ํŒ€ ์ƒ์„ฑ ์‹œ ์ž๋™์ ์œผ๋กœ ํŒ€๋ฉค๋ฒ„ db์— leader ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜๊ฒŒ ๊ตฌํ˜„) * โ™ป๏ธ refactor: tactic ์ ์šฉ ์•ˆํ•ด๋„ null๊ฐ’์œผ๋กœ ๋ณด์ด๊ฒŒ ์ ์šฉ(#65) * โœจfeat: ํฌ์ง€์…˜ ํ• ๋‹น ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#62) * โœจfeat: ํฌ์ง€์…˜ ํ• ๋‹น ๊ธฐ๋Šฅ ๊ตฌํ˜„, ์ค‘๋ณต์ด ๋˜์–ด๋„ null๊ฐ’ ๋„ฃ์–ด์„œ ๊ตฌํ˜„ (#62) * โœจfeat: ํฌ์ง€์…˜ ํ• ๋‹น ๊ธฐ๋Šฅ ๊ตฌํ˜„, ์ค‘๋ณต์ด ๋˜์–ด๋„ null๊ฐ’ ๋„ฃ์–ด์„œ ๊ตฌํ˜„ (#62) * โœจfeat: ํฌ์ง€์…˜ ํ• ๋‹น ๊ธฐ๋Šฅ ๊ตฌํ˜„, ์ค‘๋ณต์ด ๋˜์–ด๋„ null๊ฐ’ ๋„ฃ์–ด์„œ ๊ตฌํ˜„ (#62) * โœจfeat: ํฌ์ง€์…˜ ํ• ๋‹น ์‹œ, ๋ฐฉ์žฅ๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋” ๊ตฌํ˜„ (#62) * โœจfeat: ํฌ์ง€์…˜ ํ• ๋‹น&ํ•ด์ œ ์‹œ, ํ•ด๋‹น ํŒ€์—๋งŒ ์†ํ•ด์žˆ๋Š” ํŒ€์›๋งŒ ํ• ๋‹น&ํ•ด์ œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌํ˜„ ์ถ”๊ฐ€ ๊ทธ๋ฆฌ๊ณ  ํฌ์ง€์…˜ ํ•ด์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#62) * โœจfeat: ํฌ์ง€์…˜ ํ• ๋‹น&ํ•ด์ œ ์‹œ, ํ•ด๋‹น ํŒ€์—๋งŒ ์†ํ•ด์žˆ๋Š” ํŒ€์›๋งŒ ํ• ๋‹น&ํ•ด์ œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌํ˜„ ์ถ”๊ฐ€ ๊ทธ๋ฆฌ๊ณ  ํฌ์ง€์…˜ ํ•ด์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#62) * :recycle: feat: UserSignupRequestDto์˜ nickname ์ฃผ์„ ์ฒ˜๋ฆฌ ๋ฐ˜์˜ (#67) * :recycle: feat: TacticController ์ฃผ์„์ฒ˜๋ฆฌ ing... (#67) * :recycle: feat: TacticDetailResponse ๋‹‰๋„ค์ž„ ์ถ”๊ฐ€ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ (#67) * :recycle: feat: TacticResponse ๋‹‰๋„ค์ž„ ์ถ”๊ฐ€ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ (#67) * :recycle: feat: ์ „์ˆ  ๊ฒŒ์‹œ๋ฌผ๊ณผ ๋Œ“๊ธ€ post ์‹œ, ํ”„๋กœํŒŒ์ผ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š์„ ๋•Œ์˜ ๋กœ์ง ์ฒ˜๋ฆฌ (#67) * :recycle: feat: ์ž˜๋ชป ์“ด ์ •๋ณด ์ˆ˜์ • (#67) * :recycle: feat: TacticRepository์— findAllByAnonymousFalse() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ (#67) * :recycle: feat: TacticQueryService์— ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ ์ ์šฉ (#67) * :recycle: feat: ๊ด€๋ จ ์ •๋ณด ์›๋ณต (#67) * :recycle: feat: NullPointerException ์ฒ˜๋ฆฌ ๋กœ์ง ์ˆ˜์ •ํ•˜์—ฌ ๊ตฌํ˜„ (#67) * :recycle: feat: ๋‹‰๋„ค์ž„ ์‚ญ์ œ (#67) * โ™ป๏ธrefactor: ์กฐํšŒ ์‹œ ๋ฉค๋ฒ„, ๋ฆฌ๋” nickName์œผ๋กœ ๋ณ€๊ฒฝ ๋ฐ ์ถ”๊ฐ€(#75) * โ™ป๏ธrefactor: ์กฐํšŒ ์‹œ ๋ฉค๋ฒ„, ๋ฆฌ๋” nickName์œผ๋กœ ๋ณ€๊ฒฝ ๋ฐ ์ถ”๊ฐ€ํ•˜๊ณ , ์„œ๋น„์Šค๋‹จ์—์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ตฌํ˜„(#75) * :sparkles: feat: ๋ฆฌํฌ์ŠคํŠธ ๊ด€๋ จ api ์ž‘์„ฑ - Controller (#74) * :sparkles: feat: ์ต๋ช…์„ฑ์„ true๋กœ ๊ณ ์ •ํ•˜๋Š” toEntity ๋ฉ”์„œ๋“œ ์ž‘์„ฑ (#74) * :sparkles: feat: ๋ฆฌํฌ์ŠคํŠธ ๋กœ์ง ๊ตฌํ˜„ - Service (#74) * :sparkles: feat: ํ•„์š”ํ•œ ์—๋Ÿฌ ์ถ”๊ฐ€ (#74) * :recycle: refactor: ์—๋Ÿฌ ๋‚ด์šฉ ์ˆ˜์ • (#74) * :recycle: refactor: setCopyDetail ์„ธํ„ฐ ๊ตฌํ˜„ (#74) * :fire: delete: toEntity ๊ด€๋ จ ์ฝ”๋“œ ์‚ญ์ œ (#74) * :recycle: refactor: ๊ฒŒ์‹œ๋ฌผ ์นดํ”ผ ๋กœ์ง ์ˆ˜์ • (#74) * :recycle: refactor: Controller ์ˆ˜์ • (#74) * :recycle: refactor: ๋‹‰๋„ค์ž„ info ์ถ”๊ฐ€ (#74) * :recycle: refactor: private ์ ‘๊ทผ ์ˆ˜์ค€์œผ๋กœ ์„ค์ • (#74) * [REFACTOR] ์œ ์ € ํ”„๋กœํ•„ ํ™•์ธ ๊ณตํ†ต ๋งค์„œ๋“œ ์ ์šฉ (#80) * :recycle: refactor: TODO ์ถ”๊ฐ€ (#79) * :recycle: refactor: checkUserProfile ๊ณตํ†ต ๋งค์„œ๋“œ ์ƒ์„ฑ (#79) * :lipstick: style: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” import๋ฌธ ์‚ญ์ œ (#79) * :recycle: refactor: AccountsExceptionHandler๋กœ ์ˆ˜์ • (#79) * [FEATURE] ํšŒ์› ํƒˆํ‡ด & ํƒˆํ‡ด ํšŒ์› ๋ณต๊ตฌ (#82) * :sparkles: feat: @EnableScheduling ๋“ฑ๋ก (#81) * :sparkles: feat: deleted, deleteAt ์ปฌ๋Ÿผ ์ถ”๊ฐ€ (#81) * :sparkles: feat: UserJpaRepository ์ถ”๊ฐ€ (#81) * :sparkles: feat: User ErrorCode ์ถ”๊ฐ€ (#81) * :sparkles: feat: ํšŒ์› ํƒˆํ‡ด, ํƒˆํ‡ด ํšŒ์› ๋ณต๊ตฌ ๊ตฌํ˜„ (#81) * :recycle: refactor: findByEmail ์‚ฌ์šฉ์œผ๋กœ ๋ณ€๊ฒฝ (#81) * :recycle: refactor: setDeleted ์‚ญ์ œ (#81) * [REFACTOR] Accounts ์„œ๋น„์Šค ๋ฆฌํŒฉํ† ๋ง (#84) * :recycle: refactor: ์—”ํ‹ฐํ‹ฐ ๋งค์„œ๋“œ ์ถ”๊ฐ€ (#83) * :recycle: refactor: ๋งค์„œ๋“œ ์‚ฌ์šฉ์œผ๋กœ ์ˆ˜์ • (#83) * [FEATURE] ์ด๋ฉ”์ผ ์ธ์ฆ & ์ธ์ฆ ์ฝ”๋“œ ํ™•์ธ (#88) * :rocket: chore: spring-boot-starter-mail ์ถ”๊ฐ€ (#86) * :sparkles: feat: ์ด๋ฉ”์ผ ์ธ์ฆ ํ™•์ธ์šฉ Dto ์ถ”๊ฐ€ (#86) * :sparkles: feat: ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฉ”์‹œ์ง€ ์ถ”๊ฐ€ (#86) * :sparkles: feat: EmailConfig ์ถ”๊ฐ€ (#86) * :sparkles: feat: ์ด๋ฉ”์ผ ์ „์†ก, ์ฝ”๋“œ ํ™•์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (#86) * :sparkles: feat: ์ด๋ฉ”์ผ ์ „์†ก, ์ฝ”๋“œ ํ™•์ธ ๊ธฐ๋Šฅ ์—ด์–ด์ฃผ๊ธฐ (#86) * :lipstick: style: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” import๋ฌธ ์‚ญ์ œ (#86) * โ™ป๏ธrefactor: setter ์ œ๊ฑฐ, ๊ณตํ†ต ๋ฉ”์„œ๋“œ ๊ตฌํ˜„, ๊ทธ๋ฆฌ๊ณ  TeamTacticService์—์„œ์˜ addTactic return๋ฌธ ์ˆ˜์ • ์™„๋ฃŒ(#87) * โ™ป๏ธrefactor: setter ์ œ๊ฑฐ, ๊ณตํ†ต ๋ฉ”์„œ๋“œ ๊ตฌํ˜„, ๊ทธ๋ฆฌ๊ณ  TeamTacticService์—์„œ์˜ addTactic return๋ฌธ ์ˆ˜์ • ์™„๋ฃŒ(#87) * [REFACTOR] Tactic ๋„๋ฉ”์ธ ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง(#85) (#89) * :recycle: refactor: TacticController์— ์ฃผ์„ ์„ค๋ช… (#85) * :recycle: refactor: ์ „์ˆ ๊ฒŒ์‹œํŒ ์ˆ˜์ •ํ•˜๊ธฐ ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง ์‚ฌํ•ญ ์™„๋ฃŒ (#85) * :recycle: refactor: ์ „์ˆ ๊ฒŒ์‹œํŒ ๋Œ“๊ธ€ ์ˆ˜์ •ํ•˜๊ธฐ ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง ์‚ฌํ•ญ ์™„๋ฃŒ - 1 (#85) * :recycle: refactor: ์ „์ˆ ๊ฒŒ์‹œํŒ ๋Œ“๊ธ€ ์ˆ˜์ •ํ•˜๊ธฐ ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง ์‚ฌํ•ญ ์™„๋ฃŒ - 2 (#85) * :recycle: refactor: TacticService ๋น„๊ต์—ฐ์‚ฐ ์‹œ id๋กœ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋ฆฌํŒฉํ† ๋ง ์‚ฌํ•ญ ์™„๋ฃŒ (#85) * :recycle: refactor: tactic์ชฝ ์—”ํ‹ฐํ‹ฐ fetch = FetchType.LAZY ์„ค์ • (#85) * :recycle: refactor: tactic์ชฝ ์—”ํ‹ฐํ‹ฐ fetch = FetchType.LAZY ์„ค์ • - User ํ•„๋“œ ๋ถ€๋ถ„ (#85) * :recycle: refactor: tactic์ชฝ ์—”ํ‹ฐํ‹ฐ fetch = FetchType.LAZY ์„ค์ • - list ๊ด€๋ จ๋ถ€๋ถ„ ์›๋ณต (#85) * โ™ป๏ธrefactor: ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” update๋ฉ”์„œ๋“œํ†ตํ•ฉํ•ด์„œ ์ฒ˜๋ฆฌ ์™„๋ฃŒ (#87) * โ™ป๏ธrefactor: ํŒ€ ์—…๋ฐ์ดํŠธ ์‹œ ๋น ์ง„ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ (#87) * โ™ป๏ธrefactor: ํ•„์š”์—†๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ (ex. updateTeamMember) (#87) * โ™ป๏ธrefactor: updateUserRoleAndTeam ์ˆ˜์ • (#87) * โ™ป๏ธrefactor: ํŒ€์› ๊ฐ•ํ‡ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ˆ˜์ • (#87) * Revert "[REFACTOR] Team ์—”ํ‹ฐํ‹ฐ ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง(#87)" * [REFACTOR] Team ์—”ํ‹ฐํ‹ฐ ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง(#93) (#94) * :recycle: refactor: ๋งค์„œ๋“œ ์ถ”๊ฐ€ (#93) * :recycle: refactor: Dto ์ˆ˜์ • (#93) * :recycle: refactor: ๊ณตํ†ต ๋งค์„œ๋“œ ๋ฝ‘๊ธฐ (#93) * :recycle: refactor: ์„œ๋น„์Šค ์ˆ˜์ • (#93) * :recycle: refactor: ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” import๋ฌธ, ๋ณ€์ˆ˜ ์‚ญ์ œ, ์ธ๋ผ์ธํ™” (#93) * :recycle: refactor: ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” import๋ฌธ, ๋ณ€์ˆ˜ ์‚ญ์ œ, ์ธ๋ผ์ธํ™” (#93) * [REFACTOR] TeamTacticService ์—๋Ÿฌ ์ˆ˜์ •(#97) (#98) * โ™ป๏ธrefactor: addTactic ๋ฆฌํ„ด๊ฐ’ ์ˆ˜์ •(#97) * โ™ป๏ธrefactor: set -> update๋กœ ์ˆ˜์ •(#97) * โ™ป๏ธrefactor: == ์—ฐ์‚ฐ ๋Œ€์‹  equals()๋กœ ๋ณ€๊ฒฝ(#97) * โ™ป๏ธrefactor: ๊ณตํ†ต๋ฉ”์„œ๋“œ ์›๋ณต(#97) * โ™ป๏ธrefactor: TeamServiceUtils ํด๋ž˜์Šค ์‚ญ์ œ(#97) * [REFACTOR] ํŒ€ ๋ฉค๋ฒ„ ํฌ์ง€์…˜ ํ• ๋‹น ๋ฐ ํ•ด์ œ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ(#97) (#102) * โ™ป๏ธrefactor: addTactic ๋ฆฌํ„ด๊ฐ’ ์ˆ˜์ •(#97) * โ™ป๏ธrefactor: set -> update๋กœ ์ˆ˜์ •(#97) * โ™ป๏ธrefactor: == ์—ฐ์‚ฐ ๋Œ€์‹  equals()๋กœ ๋ณ€๊ฒฝ(#97) * โ™ป๏ธrefactor: ๊ณตํ†ต๋ฉ”์„œ๋“œ ์›๋ณต(#97) * โ™ป๏ธrefactor: TeamServiceUtils ํด๋ž˜์Šค ์‚ญ์ œ(#97) * โ™ป๏ธrefactor: ๋ฉค๋ฒ„ ํฌ์ง€์…˜ ํ• ๋‹น ๋ฐ ํ•ด์ œ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ(#97) * [FEATURE] ํŒ€ ์บ˜๋ฆฐ๋” CRUD ๊ตฌํ˜„ (#105) * โœจfeature: ํŒ€ ์บ˜๋ฆฐ๋” ์ƒ์„ฑ ๊ตฌํ˜„(#103) * โœจfeature: ํŒ€ ์บ˜๋ฆฐ๋” ์ƒ์„ฑ ๊ตฌํ˜„(#103) * โœจfeature: ๊ธฐ๋ณธ์ ์ธ ํŒ€ ์บ˜๋ฆฐ๋” CRUD ๊ตฌํ˜„(#103) * โœจfeature: ๊ธฐ๋ณธ์ ์ธ ํŒ€ ์บ˜๋ฆฐ๋” CRUD ๊ตฌํ˜„(#103) * โœจfeature: ์ผ์ • ์ƒ์„ฑ ์‹œ, teamId๋ฅผ pathVariable๋กœ ์ ์šฉ(#103) * โœจfeature: ํŒ€ ์บ˜๋ฆฐ๋” ๊ฐœ๋ณ„ ์กฐํšŒ ์ƒ์„ฑ(#103) * โœจfeature: ์ด๋ฒคํŠธ ๋‚ ์งœ ๊ธฐ์ž… ์ƒ์„ฑ, updateํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” dto๋กœ ๋ฐ›๊ฒŒ๋” ์ˆ˜์ •, getMatchEvents์—์„œ ์ž˜๋ชป๋œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ˆ˜์ •(#103) * โœจfeature: ๋‹จ์ผ ์กฐํšŒ ์‹œ ์ฟผ๋ฆฌ ์—๋Ÿฌ ์ˆ˜์ •(#103) * [REFACTOR] ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ user ๊ฐ€์ ธ์˜ค๊ธฐ (#106) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์ƒ์„ฑ (#99) * :recycle: refactor: @LoginUser ๋กœ user ๊ฐ€์ ธ์˜ค๊ธฐ (#99) * :recycle: refactor: url ์ˆ˜์ • (#99) * :lipstick: style: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” import๋ฌธ ์‚ญ์ œ (#99) * [REFACTOR] ๋กœ๊ทธ์ธ ์œ ์ € ์–ด๋…ธํ…Œ์ด์…˜ ์ˆ˜์ • (#108) * :sparkles: feat: ๋กœ๊ทธ์ธ ์œ ์ € ๊ฐ€์ ธ์˜ค๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์ƒ์„ฑ (#99) * :recycle: refactor: @LoginUser ๋กœ user ๊ฐ€์ ธ์˜ค๊ธฐ (#99) * :recycle: refactor: url ์ˆ˜์ • (#99) * :lipstick: style: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” import๋ฌธ ์‚ญ์ œ (#99) * :sparkles: feat: ์–ด๋…ธํ…Œ์ด์…˜ ๋“ฑ๋ก (#99) * :recycle: refactor: ์–ด๋…ธํ…Œ์ด์…˜ ์ˆ˜์ • (#99) * :recycle: refactor: ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • (#99) * :recycle: refactor: ์„œ๋น„์Šค ์ˆ˜์ • (#99) * :lipstick: style: import๋ฌธ ๋“ฑ ์‚ญ์ œ (#99) * [REFACTOR] ์œ ์ € ์„œ๋น„์Šค ๋ฆฌํŒฉํ† ๋ง (#110) * :recycle: refactor: encoder ์ˆ˜์ • (#104) * :recycle: refactor: @NotBlank ์ถ”๊ฐ€ (#104) * :recycle: refactor: @Valid ์ถ”๊ฐ€ (#104) * :lipstick: style: import๋ฌธ ์‚ญ์ œ (#104) * :recycle: refactor: accounts ๊ณตํ†ต ์„œ๋น„์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ, ์ ์šฉ ๋ฐ ์Šคํƒœํ”„ ํ™•์ธ ๋กœ์ง ์ถ”๊ฐ€ (#104) * :recycle: refactor: ํ”„๋กœํ•„ ์ˆ˜์ • ์ด๋ฉ”์ผ ์ˆ˜์ • ๋ถ„๋ฆฌ (#104) * :sparkles: feat: ์ด๋ฉ”์ผ ๋ณ€๊ฒฝ ์ถ”๊ฐ€ (#104) * :lipstick: style: import๋ฌธ ์‚ญ์ œ (#104) * :recycle: refactor: ํŒŒ์ผ ๊ตฌ์กฐ ๋ณ€๊ฒฝ (#104) * :recycle: refactor: repository ์ˆ˜์ • (#104) * :recycle: refactor: setUser ์‚ญ์ œ (#104) * [REFACTOR] TacticPositionDetail ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • ๋ฐ ์ฝ”๋“œ ๋ฆฌํŽ™ํ† ๋ง (#111) * :recycle: refactor: @LoginUser ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ˆ˜์ • (#100) * :recycle: refactor: Service์—์„œ ์—…๋ฐ์ดํŠธ ๊ด€๋ จ ๋ถˆํ•„์š”ํ•œ User ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ญ์ œ (#100) * :recycle: refactor: TacticPositionDetail ๊ด€๋ จ api ์ถ”๊ฐ€ -1 (์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ์ˆ˜์ •) (#100) * :recycle: refactor: TacticPositionDetail ๊ด€๋ จ api ์ถ”๊ฐ€ -2 (์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ์ˆ˜์ •) (#100) * :recycle: refactor: TacticPositionDetail ๊ด€๋ จ api ์ถ”๊ฐ€ -3 (์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ์ˆ˜์ •) (#100) * :recycle: refactor: ์ „์ˆ  ์ƒ์„ธ ์ •๋ณด ์ƒ์„ฑ ์‹œ, ํ”„๋กœํ•„ ์ฒดํฌ ๋ถ€๋ถ„ ์ƒ๋žต (#100) * :recycle: refactor: @Valid ์ถ”๊ฐ€ (#100) * :recycle: refactor: @NotNull๋กœ ๋ณ€๊ฒฝ (#100) * :recycle: refactor: ์ „์ˆ ๊ณผ ํฌ์ง€์…˜ ์ƒ์„ธ ์„ค๋ช… ๋ฌถ์–ด์„œ ์ƒ์„ฑ, ์ˆ˜์ • ๊ธฐ๋Šฅ ๋ฆฌํŽ™ํ† ๋ง (#100) * :recycle: refactor: ์ „์ˆ  ๊ฒŒ์‹œํŒ ์ „์ฒด ์กฐํšŒ ์‹œ ํŽ˜์ด์ง• ์ ์šฉ (#100) * :recycle: refactor: ๋Œ€๋Œ“๊ธ€์„ ์œ„ํ•œ TacticComment ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • (#100) * :recycle: refactor: ๋Œ€๋Œ“๊ธ€์„ ์œ„ํ•œ ๋กœ์ง ๊ตฌํ˜„ (#100) * :recycle: refactor: ์ž์‹  ์ „์ˆ  ๋ณด๊ธฐ ํŽ˜์ด์ง• ์ถ”๊ฐ€ ๋ฐ, ๋ชจ๋“  ํŽ˜์ด์ง• ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์ตœ์‹ ์ˆœ์œผ๋กœ ์ˆ˜์ • (#100) * :recycle: refactor: ๋””ํ…Œ์ผ ๊ฐœ๋ณ„ ์‚ญ์ œ ๋กœ์ง ์‚ญ์ œ (#100) * :recycle: refactor: 11๋ช… ํฌ์ง€์…˜๋ณ„ ๊ฐœ๋ณ„ ์กฐํšŒ๋กœ ์ธํ•œ ์‚ญ์ œ (#100) * :recycle: refactor: save๋กœ ์ˆ˜์ • (#100) --------- Co-authored-by: gomin0 * [FEATURE] FCM ํ‘ธ์‹œ ์•Œ๋ฆผ ์„œ๋น„์Šค ๊ตฌํ˜„ (#114) * :rocket: chore: FCM ๊ด€๋ จ gradle ์ถ”๊ฐ€ (#109) * :sparkles: feat: FCMํ† ํฐ redis๋กœ ๊ด€๋ฆฌ (#109) * :sparkles: feat: FCMํ† ํฐ redis๋กœ ๊ด€๋ฆฌ (#109) * :sparkles: feat: FCM ํ‘ธ์‹œ ์•Œ๋ฆผ ์„œ๋น„์Šค (#109) * :rocket: chore: FCM ํ‚ค ํŒŒ์ผ gitignore (#109) * [REFACTOR] ์ข‹์•„์š” ๊ธฐ๋Šฅ์— Redis ์ ์šฉํ•˜๊ธฐ (#116) * :recycle: refactor: ์ข‹์•„์š” ๊ฐœ์ˆ˜ Redis๋กœ ๊ด€๋ฆฌ (#101) * :recycle: refactor: ํ”ผ๋“œ๋ฐฑ ์‚ฌํ•ญ ์ˆ˜์ • (#101) * :recycle: refactor: ๋Œ“๊ธ€ ๊ณ„์ธตํ˜•์œผ๋กœ Response ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ • (#101) * [REFACTOR] MyTeam ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง (#112) * โ™ป๏ธrefactor: @LoginUser ์ ์šฉ(#107) * โ™ป๏ธrefactor: repository ๋ฉ”์„œ๋“œ์— fetch join ์ ์šฉ(#107) * โ™ป๏ธrefactor: Service ์ธก ๋ฆฌํŒฉํ† ๋ง(#107) * โ™ป๏ธrefactor: ๋‚ด ํŒ€์—์„œ์˜ ์ „์ˆ  ํ•ด์ œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€(#107) * โ™ป๏ธrefactor: dto์™€ ์ปจํŠธ๋กค๋Ÿฌ์— ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ ์ถ”๊ฐ€(#107) * โ™ป๏ธrefactor: tactic ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์— ๋ถˆํ•„์š”ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ œ๊ฑฐ(#107) * ์ž„์‹œ ์ปค๋ฐ‹ * โ™ป๏ธrefactor: ํŒ€ ์ „์ˆ  ์ถ”๊ฐ€ ์‹œ, positionDetail ์ ์šฉ(#107) * โ™ป๏ธrefactor: ํŒ€ ์ „์ˆ  ์ถ”๊ฐ€ ์‹œ, positionDetail ์ ์šฉ(#107) * โ™ป๏ธrefactor: ํŒ€ ๋ฉค๋ฒ„ ๊ฐœ๋ณ„ ํด๋ฆญ ์‹œ, tacticpositionDetail + ๋ฉค๋ฒ„ ๋‹‰๋„ค์ž„ ๊ฐ™์ด ๋ฐ˜ํ™˜๋˜๋„๋ก ๋ณ€๊ฒฝ(#107) * โ™ป๏ธrefactor: ํŒ€ ๋ฉค๋ฒ„ ๊ฐœ๋ณ„ ํด๋ฆญ ์‹œ, tacticpositionDetail + ๋ฉค๋ฒ„ ๋‹‰๋„ค์ž„ ๊ฐ™์ด ๋ฐ˜ํ™˜๋˜๋„๋ก ๋ณ€๊ฒฝ(#107) * โ™ป๏ธrefactor: ๋งˆ์ง€๋ง‰ ์ฝ”๋“œ ์ •๋ฆฌ#107) * โ™ป๏ธrefactor: ์ตœ์ข… ์ฝ”๋“œ ์ •๋ฆฌ(#107) * โ™ป๏ธrefactor: ์ตœ์ข… ์ฝ”๋“œ ์ •๋ฆฌ(#107) * [FEATURE] ์ž์œ ๊ฒŒ์‹œํŒ CRUD ๊ตฌํ˜„ (#115) * ์ž„์‹œ์ปค๋ฐ‹ * โœจfeature: ๊ธฐ๋ณธ์ ์ธ ๊ฒŒ์‹œํŒ ๋„๋ฉ”์ธ ์ƒ์„ฑ * โœจfeature: ๋Œ“๊ธ€ ๊ธฐ๋Šฅ ์ œ์™ธํ•œ ์ž์œ ๊ฒŒ์‹œํŒ CRUD ๊ตฌํ˜„ ์™„๋ฃŒ * โœจfeature: ๋Œ“๊ธ€ ๊ธฐ๋Šฅ ์ œ์™ธํ•œ ์ž์œ ๊ฒŒ์‹œํŒ CRUD ๊ตฌํ˜„ ์™„๋ฃŒ * โœจfeature: ๋ถˆํ•„์š”ํ•œ ํด๋ž˜์Šค ์‚ญ์ œ * โœจfeature: Board.java cascade ์ ์šฉ ๋ฐ ๋ถˆํ•„์š”ํ•œ ํด๋ž˜์Šค ํŒŒ์ผ ์‚ญ์ œ(#113) * โœจfeature: ์ƒ์„ฑdto์™€ ์กฐํšŒdto์™€ ์กฐํšŒ dto ๋ถ„๋ฆฌ ํ›„ nullPointerException ํ•ด๊ฒฐ(#113) * โœจfeature: ๊ฒŒ์‹œ๋ฌผ ์ˆ˜์ • ์‹œ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ธ์ฆ ์ œ๊ฑฐ(#113) * โœจfeature: ์ž์œ ๊ฒŒ์‹œํŒ ๋Œ“๊ธ€ ๋ฐ ๋Œ€๋Œ“๊ธ€ ๊ธฐ๋Šฅ ์ƒ์„ฑ(#113) * โœจfeature: ์ข‹์•„์š” ๋“ฑ๋ก ํ•ด์ œ ๋ฆฌํŒฉํ† ๋ง(#113) * โœจfeature: ๋Œ“๊ธ€ ๋ฐ ๋Œ€๋Œ“๊ธ€ ๊ตฌํ˜„(#113) * โœจfeature: ์ตœ์ข… ์ฝ”๋“œ ์—…๋กœ๋“œ(#113) * โœจfeature: ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ˆ˜์ •(#113) --------- Co-authored-by: gomin0 * :rocket: chore: gitignore ์ˆ˜์ • * [BUG] ์ข‹์•„์š” ๊ฐœ์ˆ˜ redis ์ ์šฉ ๋ฒ„๊ทธ ์ˆ˜์ • (#120) (#121) * :bug: fix: ์ข‹์•„์š” ๊ฐœ์ˆ˜ redis ์‚ฌ์šฉ ๋ฒ„๊ทธ ์ˆ˜์ • (#120) * :lipstick: style: import๋ฌธ ์‚ญ์ œ (#120) * [DOCS] swagger ์ƒ์„ธ ์„ค์ • (#118) (#119) * :memo: docs: swagger ์„ค๋ช… ์ถ”๊ฐ€ (#118) * :recycle: refactor: provider ์‚ญ์ œ (#118) * :lipstick: style: import๋ฌธ ์‚ญ์ œ (#118) * :recycle: refactor: stringbuilder ์‚ฌ์šฉ (#118) * [DOCS] swagger ์ƒ์„ธ ์„ค์ • - ์ „์ˆ , ํŒ€, ์ž์œ  ๊ฒŒ์‹œํŒ (#128) * :memo: docs: ์Šค์›จ๊ฑฐ ์„ค๋ช… ์„ค์ • (#123) * :recycle: refactor: ์„œ๋น„์Šค ๋กœ์ง ์ˆ˜์ • (#123) * :lipstick: style: import๋ฌธ ์‚ญ์ œ (#123) * :recycle: refactor: ํฌ๋ฉ”์ด์…˜ ์‚ญ์ œ (#123) * :recycle: refactor: ๋Œ“๊ธ€ ๊ฐœ์ˆ˜ redis ์ ์šฉ (#124) (#127) * Update README.md * [FEATURE] CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• (#131) (#132) * โœจ feat: main.yml ์ž‘์„ฑ (#131) * โœจ feat: appspect.yml๋ฐ sh ํŒŒ์ผ ์ž‘์„ฑ (#131) * โœจ feat: gitingore ์ˆ˜์ • (#131) * :sparkles: feat: start.sh ์ˆ˜์ • (#131) * :sparkles: feat: start.sh ์ˆ˜์ • (#131) * :sparkles: feat: build.gradle (#131) * [REFACTOR] ๋Œ“๊ธ€&์ข‹์•„์š” ๊ฐœ์ˆ˜ Redis ์ฒ˜๋ฆฌ ๋ฐ ๋Œ€๋Œ“๊ธ€ ๊ตฌ์กฐ ํ•ด๊ฒฐ(#117) (#125) * โ™ป๏ธrefactor: ์ข‹์•„์š” redis ์ ์šฉ(#117) * โ™ป๏ธrefactor: ๋Œ€๋Œ“๊ธ€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๋ฐ ๋Œ“๊ธ€ ์ˆ˜ ๋ ˆ๋””์Šค์— ์ ์šฉ(#117) * โ™ป๏ธrefactor: ๋Œ€๋Œ“๊ธ€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๋ฐ ๋Œ“๊ธ€ ์ˆ˜ ๋ ˆ๋””์Šค์— ์ ์šฉ ๋ฐ ์ข‹์•„์š” ๋ ˆ๋””์Šค ์ ์šฉ(#117) * โ™ป๏ธrefactor: service ์ธก ์˜ค๋ฅ˜ ์ˆ˜์ •(#117) * โ™ป๏ธrefactor: redisUtil ๋ถ€๋ถ„ boardSaveLikeCount & boardGetLikeCount ์ถ”๊ฐ€ ๋ฐ ์ ์šฉ(#117) * โ™ป๏ธrefactor: tacticPositionDetail ํ”ผ๋“œ๋ฐฑ์— ๋งž๊ฒŒ ์ˆ˜์ •(#117) * โ™ป๏ธrefactor: MyTeam ๊ฐœ๋ณ„ ์กฐํšŒ ์‹œ, ํ•ด๋‹น ํŒ€์— ์†ํ•ด์žˆ์ง€ ์•Š๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€(#117) * โ™ป๏ธrefactor: MyTeam ๊ฐœ๋ณ„ ์กฐํšŒ ์‹œ, ํ•ด๋‹น ํŒ€์— ์†ํ•ด์žˆ์ง€ ์•Š๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ(controller ์ˆ˜์ •)(#117) * โ™ป๏ธrefactor: MyTeamList ์กฐํšŒ ์‹œ, ๋ณธ์ธ์ด ๋ฐฉ์žฅ์ธ ํŒ€๊ณผ ํŒ€์›์ธ ํŒ€ ๋‘˜๋‹ค ์กฐํšŒ๋˜๊ฒŒ ์ˆ˜์ • ์™„๋ฃŒ ๋ฐ ํŒ€ ๊ฐœ๋ณ„ ์กฐํšŒ ์‹œ ๋ณธ์ธ ํŒ€์ด ์•„๋‹ ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€(#117) * โ™ป๏ธrefactor: ์ข‹์•„์š” ๋ ˆ๋””์Šค ์ ์šฉ ์ˆ˜์ •(getLikeCount -> boardGetLikeCount ์ถ”๊ฐ€)(#117) * โ™ป๏ธrefactor: ๋Œ“๊ธ€ ๊ฐฏ์ˆ˜ redis ์ ์šฉ ์™„๋ฃŒ(#117) * โ™ป๏ธrefactor: ์ฝ”๋“œ ์ตœ์ข… ์ •๋ฆฌ(#117) * โ™ป๏ธrefactor: TacticService์—์„œ ํ•„์š”์—†๋Š” ์ฝ”๋“œ ์ •๋ฆฌ(#117) * โ™ป๏ธrefactor: BoardResponseDto์—์„œ ๋Œ“๊ธ€, ์ข‹์•„์š” ๊ฐฏ์ˆ˜ ์ˆ˜์ •(#117) * โ™ป๏ธrefactor: BoardResponseDto๊ฐ€ ๋ถˆํ•„์š”ํ•˜์—ฌ BoardResponseDto -> BoardListDto๋กœ ๋ณ€๊ฒฝ ํ›„ ์ฝ”๋“œ ๊ฐ„์†Œํ™” ํ•จ(#117) * โ™ป๏ธrefactor: ๋ณ€๊ฒฝ๋œ ๊ฒฝ๋กœ ์ˆ˜์ •(#117) * โ™ป๏ธrefactor: RedisConfig์—์„œ ํ•„์š”์—†๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ(#117) * :sparkles: feat: ymlํŒŒ์ผ ์ˆ˜์ • (#131) * โ™ป๏ธrefactor: Conflict ํ•ด๊ฒฐ ์ค‘ ์—๋Ÿฌ์‚ฌํ•ญ ์ˆ˜์ •(#133) (#134) * :sparkles: feat: ymlํŒŒ์ผ ์ˆ˜์ • (#131) * :sparkles: feat: sh ํŒŒ์ผ ์ˆ˜์ • (#131) * :sparkles: feat: shํŒŒ์ผ ์ˆ˜์ • (#131) * :sparkles: feat: ymlํŒŒ์ผ ์ˆ˜์ • (#131) * :sparkles: feat: ymlํŒŒ์ผ ์ˆ˜์ • (#131) * :sparkles: feat: fcmConfigํŒŒ์ผ ์ˆ˜์ • (#131) * :sparkles: feat: main.ymlํŒŒ์ผ ์ˆ˜์ • (#131) * :sparkles: feat: main.yml ํŒŒ์ผ ์ˆ˜์ • (#131) * :sparkles: feat: fcmConfigํŒŒ์ผ ์ˆ˜์ • (#131) * :sparkles: feat: main.ymlํŒŒ์ผ ์ˆ˜์ • (#131) * :sparkles: feat: main.yml ํŒŒ์ผ ์ˆ˜์ • (#131) * Update README.md * [FEATURE] ์‚ฌ์šฉ์ž ์‹ ๊ณ  ๋ฐ ์ฐจ๋‹จ & staffController ๊ตฌํ˜„ (#141) * โœจFEATURE: ์‚ฌ์šฉ์ž&๊ฒŒ์‹œ๋ฌผ ์‹ ๊ณ ์—”ํ‹ฐํ‹ฐ, ์„œ๋น„์Šค, dto, ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๊ตฌํ˜„ (#126) * โœจFEATURE: ์‹ ๊ณ  ๊ธฐ๋Šฅ, ์‹ ๊ณ  ํ›„ ์กฐ์น˜ ๊ธฐ๋Šฅ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๋ฐ yml ํŒŒ์ผ ๋ณ€๊ฒฝ (#126) * โœจFEATURE: ์Šคํƒœํ”„ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ํ•ด์ œ ๊ตฌํ˜„ (#126) * โœจFEATURE: ์‹ ๊ณ  ๊ฐ€๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ (#126) * โœจFEATURE: ์‹ ๊ณ  ๊ฐ€๋Šฅ ์ตœ์ข… ๊ตฌํ˜„ ์™„๋ฃŒ (#126) * โœจFEATURE: staff ๊ถŒํ•œ ๋ถ€์—ฌ, ํ•ด์ œ & ์‹ ๊ณ  ๊ธฐ๋ก ์กฐํšŒ ์ตœ์ข… ๊ตฌํ˜„ ์™„๋ฃŒ (#126) * โœจFEATURE: staff ๊ถŒํ•œ ๋ถ€์—ฌ, ํ•ด์ œ & ์‹ ๊ณ  ๊ธฐ๋ก ์กฐํšŒ ์ตœ์ข… ๊ตฌํ˜„ ์™„๋ฃŒ (#126) * โœจFEATURE: staffActionController ๊ถŒํ•œ ์„ค์ • ๊ตฌํ˜„ ์™„๋ฃŒ (#126) * โœจFEATURE: staffActionController ์ „์ฒด ์ฝ”๋“œ ๋งˆ๋ฌด๋ฆฌ ๋ฆฌํŒฉํ† ๋ง (#126) * โœจFEATURE: ์‹ ๊ณ  ์‚ฌ์œ  String -> Enum์œผ๋กœ ๋ณ€๊ฒฝ (#126) * โœจFEATURE: ReportController ์„ค๋ช…์ถ”๊ฐ€ (#126) * :lipstick: style: yml ํŒŒ์ผ ์‚ญ์ œ (# 126) --------- Co-authored-by: gomin0 * [FEATURE] ์นด์นด์˜ค ํ”„๋กœํ•„์—์„œ ์ด๋ฉ”์ผ ๊ฐ€์ ธ์˜ค๊ธฐ (#135) (#136) * :recycle: refactor: ์นด์นด์˜ค ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ์‹œ ์นด์นด์˜ค์—์„œ ์ด๋ฉ”์ผ ๋ฐ›์•„์˜ค๊ธฐ (#135) * :lipstick: style: import๋ฌธ ์‚ญ์ œ (#135) * [REFACTOR] ์„ฑ๋Šฅ ๊ฐœ์„ (์ฟผ๋ฆฌ&์ž์› ์ ์œ ) ๋ฐ ๋กœ์ง ์ˆ˜์ • (#137) (#138) * :recycle: refactor: ์„ฑ๋Šฅ ๊ฐœ์„  (#137) * :recycle: refactor: ๊ฐœ๋ณ„ ์ „์ˆ  ์ƒ์„ฑ, ์ˆ˜์ • ๋กœ์ง ์ˆ˜์ • (#137) * :lipstick: style: import๋ฌธ ์ˆ˜์ • (#137) * [FEATURE] S3 ์„ค์ • + ์‚ฌ์ง„ ์—…๋กœ๋“œ (#139) (#140) * :sparkles: feat: S3 ์„ค์ • ๋ฐ ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—…๋กœ๋“œ (#139) * :recycle: refactor: PathVariable name ๋‹ฌ์•„์ฃผ๊ธฐ (#139) * :recycle: refactor: ํ”„๋กœํ•„ ์‚ฌ์ง„ ์ฒ˜๋ฆฌ (#139) * :recycle: refactor: ์ž์œ  ๊ฒŒ์‹œํŒ ์‚ฌ์ง„ ์ฒ˜๋ฆฌ (#139) * :lipstick: style: ์‚ฌ์šฉ ์•ˆํ•˜๋Š” ๊ฑฐ ์‚ญ์ œ (#139) * :recycle: refactor: ์‚ฌ์ง„ ๊ฐœ์ˆ˜ ์ œํ•œ ์ฒ˜๋ฆฌ (#139) * :recycle: refactor: ์—…๋กœ๋“œ ์กฐ๊ฑด ์ˆ˜์ • (#139) * :recycle: refactor: ์—…๋กœ๋“œ ์กฐ๊ฑด ์ˆ˜์ • (#139) * :ambulance: !hotfix: UserJpaRepository ์‚ญ์ œ (#143) (#144) * [REFACTOR] @Builder.Default + API ๋ช…์„ธ (#146) * :recycle: refactor: @Builder.Default (#145) * :recycle: refactor: API ๋ช…์„ธ (#145) * โœจFEATURE: SWAGGER ํ™”๋ฉด ์ƒ staff ์ „์šฉ API, ์‹ ๊ณ  API ์ œ๋ชฉ ์ถ”๊ฐ€(#148) (#149) * [REFACTOR] ์ „์ˆ  ์„ธ๋ถ€ ์‚ฌํ•ญ ๋ฆฌ์ŠคํŠธ RESPONSE์— ์ถ”๊ฐ€ ๋ฐ ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ˜์˜ (#142) (#151) * :recycle: refactor: ํŒ€์— ์ „์ˆ  ์ ์šฉ ์‹œ, response ์ˆ˜์ • (#142) * :recycle: refactor: ๊ฐœ๋ณ„ ํŒ€ ์ •๋ณด ์กฐํšŒ ์‹œ, api ์„ค๋ช… ์ˆ˜์ • (#142) * :recycle: refactor: ๊ฐœ๋ณ„ ํŒ€ ์ •๋ณด ์กฐํšŒ ์‹œ, response ์ˆ˜์ • (#142) * :recycle: refactor: ๊ฐœ๋ณ„ ์ „์ˆ  ์กฐํšŒ ์‹œ, response ์ˆ˜์ • (#142) * :recycle: refactor: ๊ฐœ๋ณ„ ์ „์ˆ  ์กฐํšŒ ์‹œ, NPE ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ๋ฐ famous coachname ์‚ญ์ œ (#142) * :recycle: refactor: Detail ํ†ตํ•ฉ (attack + defense => subtactic ์œผ๋กœ) (#142) * :recycle: refactor: ํŽ˜์ด์ง• ๊ด€๋ จ Parameter Name Discovery Issue ์ˆ˜์ • ๋ฐ ๋ถˆํ•„์š”ํ•œ import๋ฌธ ์‚ญ์ œ (#142) * โ™ป๏ธREFACTOR: ๋‚ด ํŒ€ ์ •๋ณด ์กฐํšŒ๋Š” ๋ฐฉ์žฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ํŒ€์›๋“ค์ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฆฌํŒฉํ† ๋ง(#152) (#153) * [FEATURE] ํŒ€์› ์ดˆ๋Œ€ ์ˆ˜๋ฝ ๋ฐ ๊ฑฐ์ ˆ ๊ตฌํ˜„(#130) (#147) * โœจFEATURE: ํŒ€์› ๊ฐ•ํ‡ด ๊ธฐ๋Šฅ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ teamId๊ฐ’ ์ถ”๊ฐ€ํ•ด์„œ ํŠน์ • ํŒ€์—์„œ ๊ฐ•ํ‡ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ (#126) * โœจFEATURE: ํŒ€์› ๊ฐ•ํ‡ด ๊ธฐ๋Šฅ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ teamId๊ฐ’ ์ถ”๊ฐ€ํ•ด์„œ ํŠน์ • ํŒ€์—์„œ ๊ฐ•ํ‡ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ (#126) * โœจFEATURE: TeamMember์™€ TeamInvite ๋ถ„๋ฆฌ ํ›„ ํŒ€์› ์ดˆ๋Œ€, ์ดˆ๋Œ€ ์ˆ˜๋ฝ, ์ดˆ๋Œ€ ๊ฑฐ์ ˆ, ํŒ€์› ๊ฐ•ํ‡ด ๊ตฌํ˜„์™„๋ฃŒ (#130) * โœจFEATURE: ๋งˆ์ง€๋ง‰ ์ฝ”๋“œ ์ ๊ฒ€ (#130) * โœจFEATURE: ์—๋Ÿฌ์ฝ”๋“œ ๊ตฌ์ฒดํ™”(#130) * โœจFEATURE: Reject ์ƒํƒœ ์‚ญ์ œ(#130) * โœจFEATURE: ํŒ€ ๋ฉค๋ฒ„ ์ดˆ๋Œ€ ์‹œ, Invitation์ƒํƒœ๊ฐ€ PENDING์ผ ๋•Œ๋‚˜ ACCEPTED ์ผ ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์„ธ๋ถ„ํ™”(#130) * โœจFEATURE: ๋‚ด๊ฐ€ ๋ฐ›์€ ์ดˆ๋Œ€ ์กฐํšŒ(#130) * โœจFEATURE: ๋‚ด๊ฐ€ ๋ฐ›์€ ์ดˆ๋Œ€ ์กฐํšŒ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง(#130) * โœจFEATURE: ๋‚ด๊ฐ€ ๋ฐ›์€ ์ดˆ๋Œ€ ์กฐํšŒ ์ฝ”๋“œ ์ตœ์ข… ๋ฆฌํŒฉํ† ๋ง(#130) * โœจFEATURE: ๋‚ด๊ฐ€ ๋ฐ›์€ ์ดˆ๋Œ€ ์กฐํšŒ ์ฝ”๋“œ ์ตœ์ข… ๋ฆฌํŒฉํ† ๋ง(#130) * โœจFEATURE: ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ œ๊ฑฐ(#130) * โ™ป๏ธREFACTOR: ํ”ผ๋“œ๋ฐฑ ๋‚ด์šฉ ์ˆ˜์ • ์™„๋ฃŒ(#130) * [HOTFIX] TeamMembersRepository ์—๋Ÿฌ ์ˆ˜์ • (#154) (#155) * :ambulance: hotfix: TeamMembersRepository ๋ฒ„๊ทธ ์ˆ˜์ • (#154) * :lipstick: style: import๋ฌธ ์‚ญ์ œ (#154) * [FEATURE] ์ž์œ ๊ฒŒ์‹œํŒ ์‚ฌ์šฉ์ž ์ฐจ๋‹จ ๊ตฌํ˜„ ์™„๋ฃŒ (#156) * :sparkles: BoardBlock ์—”ํ‹ฐํ‹ฐ ๊ตฌํ˜„ * :sparkles: ์ฐจ๋‹จํ•œ ์‚ฌ์šฉ์ž์˜ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ์‹œ ์•ˆ๋ณด์ด๊ฒŒ ๊ตฌํ˜„ * :sparkles: ์ฐจ๋‹จ ํ•ด์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„(#150) * :sparkles: ์ „์ฒด ๊ฒŒ์‹œ๋ฌผ ์กฐํšŒ & ๋‚ด ๊ฒŒ์‹œ๋ฌผ ์ „์ฒด ์กฐํšŒ์—์„œ likeCount, commentCount ์ ์šฉ๋˜๊ฒŒ ์ˆ˜์ •(#150) * :sparkles: ์ฝ”๋“œ ์ตœ์ข… ๊ฒ€์‚ฌ(#150) * :sparkles: ๋Œ“๊ธ€ ์ƒ์„ฑ ์ชฝ ์ˆ˜์ •์™„๋ฃŒ(#150) * :sparkles: Controller์— ๋‚ด๊ฐ€ ์ฐจ๋‹จํ•œ ์‚ฌ์šฉ์ž ์กฐํšŒ ์ œ๋ชฉ ๋ฐ ์„ค๋ช… ์ถ”๊ฐ€(#150) * :sparkles: ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ๊ธฐ๋Šฅ ์ˆ˜์ • ๋ฐ merge ์ „ ์ฝ”๋“œ ์ตœ์ข…์ ๊ฒ€(#150) * :sparkles: ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ๊ธฐ๋Šฅ ์ˆ˜์ • ๋ฐ merge ์ „ ์ฝ”๋“œ ์ตœ์ข…์ ๊ฒ€(#150) * :sparkles: ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ๊ธฐ๋Šฅ ์ˆ˜์ • ๋ฐ merge ์ „ ์ฝ”๋“œ ์ตœ์ข…์ ๊ฒ€(#150) * [REFACTOR] ๋‚ด ํŒ€ ์กฐํšŒ & ์ „์ˆ  ์ ์šฉ ๋ฆฌํŒฉํ† ๋ง (#157) (#158) * :recycle: refactor: ๊ฐœ๋ณ„ ์ „์ˆ  ์กฐํšŒ ์ฃผ์„์ฒ˜๋ฆฌ (#157) * :recycle: refactor: ๋‚ดํŒ€ ๋ชฉ๋ก ์กฐํšŒ, ๊ฐœ๋ณ„ ํŒ€ ์ •๋ณด ์กฐํšŒ ์‹œ response๋กœ ์ „์ˆ  ๊ฐ€์ ธ์˜ค๊ฒŒ (#157) * :recycle: refactor: ํ”„๋กœํ•„ ์ƒ์„ฑ ์‹œ ํ”„๋กœํ•„ ์œ ๋ฌด ๋ถ€ํ„ฐ ํ™•์ธ (#157) * :recycle: refactor: ํŒ€ ์ƒ์„ฑ ์‹œ ํŒ€์ด๋ฆ„์ด๋ž‘ ์ ์šฉ์ „์ˆ  ๋ฐ›์•„์„œ ๋งคํ•‘ (#157) * :recycle: refactor: ํŒ€ ์ƒ์„ฑ ์‹œ ํŒ€์ด๋ฆ„์ด๋ž‘ ์ ์šฉ์ „์ˆ  ๋ฐ›์•„์„œ ๋งคํ•‘ (#157) * :recycle: refactor: ์ „์ˆ  ๋ณ€๊ฒฝ ์‹œ ํŒ€ ๋ฉค๋ฒ„ ํฌ์ง€์…˜ ํ• ๋‹น ์ดˆ๊ธฐํ™” (#157) * :recycle: refactor: ์ „์ˆ  ๋ณ€๊ฒฝ ์‹œ ํŒ€ ๋ฉค๋ฒ„ ํฌ์ง€์…˜ ํ• ๋‹น ์ดˆ๊ธฐํ™” (#157) * [FEATURE] ban๋œ ์‚ฌ์šฉ์ž ์ฒ˜๋ฆฌ & ๊ด€๋ฆฌ์ž์˜ ์•…์˜์  ์ „์ˆ , ๋Œ“๊ธ€, ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ (#159) (#160) * :sparkles: feat: ban๋œ ์‚ฌ์šฉ์ž ์ฒ˜๋ฆฌ & ๊ด€๋ฆฌ์ž์˜ ์•…์˜์  ์ „์ˆ , ๋Œ“๊ธ€, ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ (#159) * :lipstick: style: import ๋ฌธ ์‚ญ์ œ (#159) * :recycle: refactor: appspec.yml ์ˆ˜์ • * [REFACTOR] ํŒ€์› ์ดˆ๋Œ€ ์‹œ ๋‹‰๋„ค์ž„์œผ๋กœ ์ดˆ๋Œ€๋˜๊ฒŒ ๋” ๊ตฌํ˜„ (#166) * โ™ป๏ธrefactor: ํŒ€ ์ดˆ๋Œ€ ์‹œ ์‚ฌ์šฉ์ž ๋‹‰๋„ค์ž„์œผ๋กœ ๋ฐ›๊ฒŒ ๊ตฌํ˜„ (#165) * ๐Ÿ’„style:์ตœ์ข…์ฝ”๋“œ ์ˆ˜์ • (#165) * ๐Ÿ’„style: ์ตœ์ข…์ฝ”๋“œ ์ˆ˜์ • (#165) * โ™ป๏ธrefactor: ๋ถˆํ•„์š”ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ œ์™ธ (#165) * โœจfeature: ๊ฒŒ์‹œํŒ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#167) (#168) * [FEATURE] ์ „์ˆ  ๊ฒŒ์‹œํŒ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#163) (#164) * โœจ feat: TacticController์— ์ „์ˆ ๊ฒ€์ƒ‰ api ์ถ”๊ฐ€ (#163) * โœจ feat: TacticQueryService์— ์ „์ˆ ๊ฒ€์ƒ‰ ๋กœ์ง ๊ตฌํ˜„ (#163) * โœจ feat: TacticRepository์— ์ „์ˆ ๊ฒ€์ƒ‰ JPA ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ (#163) * โ™ป๏ธrefactor: ๋‚ด ํŒ€ ๋ชฉ๋ก ์กฐํšŒ ์‹œ ํŒ€ ๋ฉค๋ฒ„, ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํŒ€์— ๋ฆฌ๋” ํฌํ•จ ๋ช‡ ๋ช… ์žˆ๋Š”์ง€ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ๋ฆฌํŒํ† ๋ง (#170) * :bug: bug: firebase ํŒŒ์ผ ๋ณต๊ตฌ (#171) * :bug: bug: ์—๋Ÿฌ ์ˆ˜์ • ์ˆ˜์ • (#171) --------- Co-authored-by: 600gramSik Co-authored-by: Geunsik Kim <93639883+600gramSik@users.noreply.github.com> Co-authored-by: jiiiiiw <98935125+jiiiiiw@users.noreply.github.com> Co-authored-by: jiiiiiw --- .gitignore | 2 +- .../firebase/controller/FcmController.java | 27 ++++++++++ .../firebase/dto/FCMAlarmRequestDto.java | 7 +++ .../exception/FirebaseExceptionHandler.java | 10 ++++ .../firebase/service/FcmAlarmService.java | 51 +++++++++++++++++++ .../myteam/service/TeamQueryService.java | 2 +- 6 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/capstone/BnagFer/domain/firebase/controller/FcmController.java create mode 100644 src/main/java/com/capstone/BnagFer/domain/firebase/dto/FCMAlarmRequestDto.java create mode 100644 src/main/java/com/capstone/BnagFer/domain/firebase/exception/FirebaseExceptionHandler.java create mode 100644 src/main/java/com/capstone/BnagFer/domain/firebase/service/FcmAlarmService.java diff --git a/.gitignore b/.gitignore index 2e8dd566..61564946 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,7 @@ .idea/**/shelf # Firebase key file -firebase +**/bangfer-firebase-key.json # AWS User-specific .idea/**/aws.xml diff --git a/src/main/java/com/capstone/BnagFer/domain/firebase/controller/FcmController.java b/src/main/java/com/capstone/BnagFer/domain/firebase/controller/FcmController.java new file mode 100644 index 00000000..70c15f1e --- /dev/null +++ b/src/main/java/com/capstone/BnagFer/domain/firebase/controller/FcmController.java @@ -0,0 +1,27 @@ +package com.capstone.BnagFer.domain.firebase.controller; + +import com.capstone.BnagFer.domain.firebase.dto.FCMAlarmRequestDto; +import com.capstone.BnagFer.domain.firebase.service.FcmAlarmService; +import com.capstone.BnagFer.global.common.ApiResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@RestController +@RequiredArgsConstructor +@Tag(name = "ํ‘ธ์‹œ ์•Œ๋ฆผ API") +@RequestMapping("/fcm") +public class FcmController { + + private final FcmAlarmService fcmAlarmService; + + @Operation(summary = "ํ‘ธ์‹œ ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ", description = "ํ•ด๋‹น ์œ ์ €์—๊ฒŒ FCM ํ‘ธ์‹œ ์•Œ๋ฆผ ์ „์†ก") + @PostMapping("/send/{userId}") + public ApiResponse sendAlarm(@Valid @RequestBody FCMAlarmRequestDto requestDto, @PathVariable Long userId) { + return ApiResponse.onSuccess(fcmAlarmService.sendAlarm(requestDto, userId)); + } +} \ No newline at end of file diff --git a/src/main/java/com/capstone/BnagFer/domain/firebase/dto/FCMAlarmRequestDto.java b/src/main/java/com/capstone/BnagFer/domain/firebase/dto/FCMAlarmRequestDto.java new file mode 100644 index 00000000..cbad19ad --- /dev/null +++ b/src/main/java/com/capstone/BnagFer/domain/firebase/dto/FCMAlarmRequestDto.java @@ -0,0 +1,7 @@ +package com.capstone.BnagFer.domain.firebase.dto; + +public record FCMAlarmRequestDto ( + String title, + String body +) { +} \ No newline at end of file diff --git a/src/main/java/com/capstone/BnagFer/domain/firebase/exception/FirebaseExceptionHandler.java b/src/main/java/com/capstone/BnagFer/domain/firebase/exception/FirebaseExceptionHandler.java new file mode 100644 index 00000000..bd0ce5ca --- /dev/null +++ b/src/main/java/com/capstone/BnagFer/domain/firebase/exception/FirebaseExceptionHandler.java @@ -0,0 +1,10 @@ +package com.capstone.BnagFer.domain.firebase.exception; + +import com.capstone.BnagFer.global.common.BaseErrorCode; +import com.capstone.BnagFer.global.common.exception.CustomException; + +public class FirebaseExceptionHandler extends CustomException { + public FirebaseExceptionHandler(BaseErrorCode errorCode) { + super(errorCode); + } +} \ No newline at end of file diff --git a/src/main/java/com/capstone/BnagFer/domain/firebase/service/FcmAlarmService.java b/src/main/java/com/capstone/BnagFer/domain/firebase/service/FcmAlarmService.java new file mode 100644 index 00000000..2cf80cc5 --- /dev/null +++ b/src/main/java/com/capstone/BnagFer/domain/firebase/service/FcmAlarmService.java @@ -0,0 +1,51 @@ +package com.capstone.BnagFer.domain.firebase.service; + +import com.capstone.BnagFer.domain.accounts.entity.User; +import com.capstone.BnagFer.global.util.RedisUtil; +import com.capstone.BnagFer.domain.accounts.repository.UserJpaRepository; +import com.capstone.BnagFer.domain.firebase.dto.FCMAlarmRequestDto; +import com.capstone.BnagFer.domain.firebase.exception.FirebaseExceptionHandler; +import com.capstone.BnagFer.global.common.ErrorCode; +import com.google.firebase.messaging.FirebaseMessaging; +import com.google.firebase.messaging.FirebaseMessagingException; +import com.google.firebase.messaging.Message; +import com.google.firebase.messaging.Notification; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class FcmAlarmService { + + private final FirebaseMessaging firebaseMessaging; + private final UserJpaRepository userJpaRepository; + private final RedisUtil redisUtil; + + public String sendAlarm(FCMAlarmRequestDto requestDto, Long userId) { + User user = userJpaRepository.findById(userId) + .orElseThrow(() -> new FirebaseExceptionHandler(ErrorCode.USER_NOT_FOUND)); + + String fcmToken = redisUtil.getFCMToken(user.getEmail()); + if (fcmToken != null) { + Notification notification = Notification.builder() + .setTitle(requestDto.title()) + .setBody(requestDto.body()) + .build(); + + Message message = Message.builder() + .setToken(fcmToken) + .setNotification(notification) + .build(); + + try { + firebaseMessaging.send(message); + return "์•Œ๋ฆผ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค. targetUserId = " + userId; + } catch (FirebaseMessagingException e) { + e.printStackTrace(); + throw new FirebaseExceptionHandler(ErrorCode.FIREBASE_MESSAGING_ERROR); + } + } else { + throw new FirebaseExceptionHandler(ErrorCode.FIREBASE_TOKEN_NOT_FOUND); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/capstone/BnagFer/domain/myteam/service/TeamQueryService.java b/src/main/java/com/capstone/BnagFer/domain/myteam/service/TeamQueryService.java index 12e8939e..3d018501 100644 --- a/src/main/java/com/capstone/BnagFer/domain/myteam/service/TeamQueryService.java +++ b/src/main/java/com/capstone/BnagFer/domain/myteam/service/TeamQueryService.java @@ -44,7 +44,7 @@ public List getMyTeamList(User user) { for (TeamMember teamMember : teamMembers) { Team team = teamMember.getTeam(); - teamLists.add(GetTeamResponseDto.TeamList.from(team, teamMember)); + teamLists.add(GetTeamResponseDto.TeamList.from(team)); } return teamLists;