-
Notifications
You must be signed in to change notification settings - Fork 1
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
[๐ Issue] dev api ๋ก๊ทธ์ธ ์์ฒญ ์์น์ ๋ฐ๋ผ redirect url ๋ณํ #245
Conversation
ํน์ ๋ด์ผ ์ค์ ์ ๋ฆฌ๋ทฐ ๋จ๊ฒจ๋ ๋ ๊น์? ์ญ ์ฝ๊ธด ํ๋๋ฐ ๋๋ฌด ์กธ๋ ค์ ๋จธ๋ฆฌ๊ฐ ์ํ๋ค์ ใ ใ |
@binary-ho |
val loginRequestRefererStorage: LoginRequestRefererStorage, | ||
) { | ||
fun getUrl(state: String, token: Token): String { | ||
if (profile == "live") { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ํ๋กํ์ ํ๋ฒ Wraapingํ๋ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ์ด๋จ๊น ์ถ์๋ฐ, ํ๋ฒ ๊ฐ์ด ๊ณ ๋ฏผํด์ฃผ์ค ์ ์๋์?
profile ๊ฐ์ ๊ฐ๋ ์ ํธ์ด ์์ด์, ๊ทธ ์ ํธ ๊ฐ์ฒด์๊ฒ ๋ฉ์๋๋ก ์ง์ํ๋ ๋ฐฉ๋ฒ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์์์
ProfileHolder or ProfileUtil์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด
ProfileHolder.isLive(), ProfileHolder.isDev() ์ ๊ฐ์ ์์ผ๋ก ๋ฉ์๋๋ฅผ ํตํด ์ง์ํ๋ฉด,
์ ๊ฐ ์์ฃผ ๊ฒฝ๊ณํ๋ ์ค์์ ๊ฐ๋ฅ์ฑ์ด ์๋ rawํ string์ ์ฌ์ฉ์ ์์จ ์๋ ์๊ณ , ๊ฐ์ฒด์งํฅ ์ ์ผ๋ก๋ ์ข์ ๊ฒ ๊ฐ๊ณ , ์ฝ๋๋ ๊น๋ํด์ง ์๋ ์์ ๊ฒ ๊ฐ์์. ๊ทธ๋ฆฌ๊ณ ๋ฆฌํฉํ ๋ง์ ์ธํ
๋ฆฌ์ ์ด์ ๋์์ ๋ฐ๊ธฐ๋ ์ข์ ๊ฒ ๊ฐ์์.
๋ ๋์๊ฐ ๊ด์ฐฎ์ ๊ตฌํ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์ํ์ ๋ฐ๋ผ RedirectURL์ ๋ฐํํ๋ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์์.
ProfileRedirectUrlHolder.getRedirectUrl()๊ณผ ๊ฐ์ด ์ค์ค๋ก Profile์ ํ์ธํ๊ณ , ๊ทธ์ ๋ง๋ Redirect URL์ ๋ฐํํ๋ ๊ฑด ์ด๋จ๊น ํด์์. ex) live์ ๊ฒฝ์ฐ "https://bandiboodi.com ๋ฐํ
ํ ํฐ ๊ฐ์ ๋ํ ํ๋ผ๋ฏธํฐ๋ ๋ฐ๋ก ๋ถ์ฌ์ฃผ๊ฑฐ๋, ๋ฐ๋ก ๋ถ์ฌ์ฃผ๋ Util ํด๋์ค๊ฐ ์๊ฑฐ๋, ์๋๋ฉด ํ ํฐ ๊ฐ๋ค์ ๋ฃ์ผ๋ฉด ํ ํฐ ๊ฐ๊น์ง ๋ชจ๋ ํฌํจ๋ RedirectUrl์ ๋ฐํํ๋ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์์ (๋ง์ง๋ง์ ๊ณผํ ๊ฒ ๊ฐ๊ธฐ๋ ํฉ๋๋ค)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๊ฐ์ฒด๋ฅผ ์ด๋ค ๋จ์๊น์ง ๋ถ๋ฆฌํ ๊น๋ ํญ์ ๊ณ ๋ฏผ์ด ๋๋ ๋ถ๋ถ์ธ ๊ฒ ๊ฐ์ต๋๋ค ใ
ใ
์งํธ๋์ด ๋ง์ํ์ ๊ฑธ ์ ๋ฆฌํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๊ฐ์ฒด๊ฐ ์๊ฒจ๋ ๊ฒ ๊ฐ์ต๋๋ค
- ProfileHolder(or ProfileUtil) -> profile ๊ฐ์ ์ฃผ์ ๋ฐ์ ํ์ฌ application์ profile์ ๋ฐํํ๋ ์ฑ ์
- ProfileRedirectUrlHolder -> referer๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก RedirectUrl์ host + path๊น์ง ๋ฐํ ์ฑ ์
- ํ ํฐ ๊ฐ์ ๋ถ์ฌ์ฃผ๋ ์ญํ ์ ๊ฐ์ฒด -> token์ ๋ฐ์ query string์ผ๋ก ๋ถ์ฌ์ฃผ๋ ์ฑ ์
- ์ต์ข redirectUrl์ ๋ฐํํ๋ ๊ฐ์ฒด
์ฌ์ค ์ ๋ ์์
ํ๋ฉด์ ์ด๋ ๊ฒ๊น์ง ๊ฐ์ฒด๋ฅผ ๋ถ๋ฆฌํ์ง๋ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํ์ง๋ง ์งํธ๋์ด ์ ์ํด์ฃผ์ ProfileHolder.isLive(), ProfileHolder.isDev() ๋ฉ์๋๊ฐ ๋๋ฌด ๊น๋ํด๋ณด์ธ๋ค๋ ์๊ฐ์ด ๋ค์๊ณ ,
StateOAuth2AuthorizationRequestRepository์์ ์ฌ์ฌ์ฉ๋๋ค๋ ์ฅ์ ์ ์๊ฐํ์ ๋ ์ ์ฉํด๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค ใ
ใ
์ฐ์ ์ ProfileHolder๋ก ํ์ฌ application์ profile์ ์๋ ค์ฃผ๋ ์ฑ
์์ ๊ฐ์ง๋ ๊ฐ์ฒด ๋ง๋ค์ด ๋ฐ์ํด๋ณด๊ฒ ์ต๋๋ค.
์ ์ฑ์ค๋ฌ์ด ๋ฆฌ๋ทฐ ๊ฐ์ฌํฉ๋๋ค โค๏ธ
|
||
@Component | ||
class LoginRedirector( | ||
@Value("\${spring.profiles.active:local}") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ต๊ทผ์ ์ด๋ฐ ๋ฐฉ๋ฒ๋ ๋ดค๋ค์. ๊ฐ๋ค์ด ๋ชจ์ฌ์๊ณ , ๊ฐ์ฒด๋ก ๊ด๋ฆฌํ๊ณ , ๋ฆฌํฉํ ๋ง ํ๊ธฐ ์ฌ์ด ์ฅ์ ์ด ์๋๊ฑฐ ๊ฐ์๋ฐ ํ๋ฒ ์ฅ ๋ด์ฃผ์ธ์ ์ ๋ ์ด๊ฑฐ ๋์
ํด๋ณด์ ์๋๋๋ค!!
https://medium.com/@mikael_55667/why-you-should-stop-using-value-annotations-in-spring-and-use-this-instead-2c8a47e5096a
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ๋ ์งํธ๋์ด ์๊ธฐํด์ฃผ์ ConfigurationProperties ์ฌ์ฉํ๋ ๋ฐฉ์ ์ข์ํฉ๋๋ค!
์ ํฌ ํ๋ก์ ํธ์ AppleLoginProps ๊ฐ์ฒด์ ์ฌ์ฉํ๊ธฐ๋ ํ๊ตฌ์
๋ค๋ง ์ ๋ ํ๋ฒ์ ๋ง์ ๊ฐ์ ์ฃผ์
ํด์ผ ํ ๋ ConfigurationProperties๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ ๊ฐ์ต๋๋ค!
Profile์ ๋ด์ ๊ฐ์ฒด์ ์ฃผ์
ํ ๊ฐ์ด ๋ง์์ง๋ค๋ฉด ConfigurationProperties ์ฌ์ฉํ๋ ๋ฐฉ์ ์ข์ ๊ฒ ๊ฐ์์ ๐
|
||
val referer = loginRequestRefererStorage.get(state) | ||
|
||
if (profile == "dev" && referer.contains("dev-bandiboodi")) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- ์ ๋ฒ์ ๋ง์ ๋๋ ธ๋ ๋๋ก dev ํด๋ผ์ด์ธํธ ์ ์ถ์ ๋ํ ์ฐ๋ ค๊ฐ ์์ต๋๋ค.
๋ฌผ๋ก ์ ๋ ์ค์ ๋ก ์ฌ์ฉํ๋ ์ฌ๋์ด ์๊ธด ํ ๊น..์ถ๊ธฐ๋ ํ๋ฐ, ์ ํฌ๊ฐ ๊ด๋ฆฌํ์ง ์๋ ๋ฐ์ดํฐ๊ฐ dev-db์ ์ ์ฅ๋ ์๋ ์๋ ์ํฉ์ด ์กฐ๊ธ ๊บผ๋ ค์ง๋๋ค. ์ด๋ป๊ฒ ์๊ฐํ์ค๊น์?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์!! ์ด๋ฒ์ ์ ๊ฑฐํ๋ค๋ ๊ฑธ ๊น๋นกํ๋ค์ ใ
ใ
ํ์ธ ๊ฐ์ฌํด์ ๐
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ณ๊ฑฐ ์๋๋ฐ ํ๋กํ์ ๋ํ ๋น๊ต๊ฐ์ ๋ฌธ์์ด์ด ์๋ enum ์ผ๋ก ๊ด๋ฆฌํ๋๊ฒ ์ข๊ธดํ ๋ฏ (referer ๋ enum ์ผ๋ก)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ์์ ์งํธ๊ฐ ๋งํ๊ตฌ๋ ใ ใ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๊ฐ์ ๋ถ๋ถ์ ํ์ enum์ผ๋ก, ์งํธ๋ ํ์ฌ profile์ ์ํ๋ ๊ฐ๊ณผ ๋น๊ตํด์ฃผ๋ ๊ฐ์ฒด ๋ฉ์๋๋ก ๋ฐ๊พธ๋ ๋ฐฉํฅ์ ์ ์ํด์คฌ๋๋ฐ
๋ ๋ค ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค ๐
.expireAfterWrite(60L, TimeUnit.SECONDS) | ||
.build<String, String>() | ||
|
||
fun put(state: String, referer: String?) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[[ 100% ์ทจํฅ ์ ์ ]]
์ ๋ ์๋ฐ์ ์ต์ํด์ ์ฐ์๋์ด๋ ํญ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ์?
์์ฆ ์ฝํ๋ฆฐ ์ฝ๋๋ค ๋ค๋ฅธ๋ฐ์ ๋ณด๋ฉด์ ์๋์ ๊ฐ์ ์ฝ๋๋ ์กฐ๊ธ ์ด๋ป ๋ณด์ด์ด๊ธฐ ์์ํ๋๋ฐ ์ด๋ ์ ๊ฐ์..
put() = if (referer.isNullOrBlank()) return
else timedStorage.put(state, referer)
ํน์.. ํ์ฅํจ์ ํ์ฉํด์ isNotNullOrBlank() ๊ตฌํํ ๋ค์..
fun put() {
if (referer.isNotNullOrBlank())
timedStorage.put(state, referer)
}
์์ ์ทจํฅ์ด๊ณ ์ง๊ธ ์ผ๋ฆฌ ๋ฆฌํด ๋ฐฉ์๋ ๋๋ฌด ์ข์์ ์ ๋ ๋ณดํต ๊ทธ๋ ๊ฒ ์์ฑํด์๋ ๊ฒ ๊ฐ์์.
์ด๋ค์ง ํ๋ฒ ์๊ธฐํด๋ณด๊ณ ์ถ์ด์ ์ฌ๋ ค๋ด์!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ๋ ์ผ๋ฆฌ ๋ฆฌํด์ ์ํ ์กฐ๊ฑด๋ฌธ์ ๋ช
์์ ์ผ๋ก ์์ฑํ๋ ํธ์ด ์ ์ฝํ๋ค๊ณ ์๊ฐํ๋ ํธ์ด์๋๋ฐ์.
์งํธ๋์ด ์ ์ํด์ฃผ์ ์ฒซ๋ฒ์งธ ์ฝ๋ (if๋ฌธ Expression์ผ๋ก ์ฌ์ฉ)๋ฅผ ๋ณด๋ ํ๋ฒ ์ฌ์ฉํด๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค ใ
ใ
์ฒซ๋ฒ์งธ ๋ฐฉ์์ผ๋ก ์์ ํ๋ฒ ํด๋ณด๊ฒ ์ต๋๋ค!
์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@binary-ho
์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
์ถ๊ฐ ์ ์ ใ ใฑใด
@@ -25,6 +30,11 @@ class StateOAuth2AuthorizationRequestRepository() : AuthorizationRequestReposito | |||
response: HttpServletResponse, | |||
) { | |||
if (authorizationRequest != null) { | |||
/*** for frontend dev test ***/ | |||
if (profile == "dev") { | |||
loginRequestRefererStorage.put(authorizationRequest.state, request.getParameter("referer")) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ํ๋กํ๋ํ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ์ฌ๊ธฐ์๋ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ใ ใ (์ดํ)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
์ถ๊ฐ ์ ์ ใ ใฑใด
@@ -0,0 +1,17 @@ | |||
package io.raemian.api.support.security | |||
|
|||
enum class ProfileType( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ManHyuk
์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
์ถ๊ฐ ์ ์ ใ ใฑใด
|
||
import org.springframework.boot.context.properties.ConfigurationProperties | ||
|
||
@ConfigurationProperties(prefix = "redirect-url") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@binary-ho
2๊ฐ์ ์ ์์ ํฉ์ณ์ RedirectUrlHolder์ ConfigurationProperties๋ฅผ ์ ์ฉํด๋ดค์ต๋๋ค!
์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
์ถ๊ฐ ์ ์ ใ ใฑใด
import org.springframework.stereotype.Component | ||
|
||
@Component | ||
class ProfileHolder( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@binary-ho
์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
์ถ๊ฐ ์ ์ ใ ใฑใด
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
๋๊ธ๋ก ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ ์ง์ด์ฃผ๋ ์ผ์ค ๋๋ถ์ ๋ฌด์์ ์ด๋ป๊ฒ ๋ฐ๊พธ์๋์ง ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์์์ต๋๋ค! ์์ ๋๋ฌด ๊ณ ์ ๋ง์ผ์ จ์ต๋๋ค ๊ฐ์ฌํฉ๋๋ค ใ ใ ใ
* feat: remove forward header optiion * refactor : birth ๊ด๋ จ ์ ์ ์ ๋ณด ์ ๋ฐ์ดํธ API์ birth๋ฅผ nullable๋ก ๋ณ๊ฒฝ (#206) (#207) * feat(#209): spring security authorization_request_not_found ์์ (#210) * [๐ Feature] Goal ๋๊ธ API ๊ฐ๋ฐ (#208) * feat : ๋๊ธ ์ํฐํฐ์ repository ์์ฑ (#196) * feat : Goal ๋๊ธ ์ค๋ฆ์ฐจ์ ์ ์ฒด ์กฐํ ๋ฉ์๋ ๊ตฌํ (#196) * feat : Goal ๋๊ธ ์์ฑ ์ญ์ ๋ฉ์๋ ๊ตฌํ (#196) * feat : Goal์ ๋ง์ง๋ง ๋๊ธ Read ์๊ฐ์ ์ ์ฅํ๋ GoalCommentReadTime ๊ตฌํ (#196) * feat : Goal์ ์์ฑ์๊ฐ ์ฝ์ง ์์ ๋๊ธ์ด ์๋์ง ํ์ธํ๋ ๋ฉ์๋ ๊ตฌํ (#196) * feat : ๋น๋๊ธฐ์ ์ผ๋ก ๋ง์ง๋ง ๋๊ธ ํ์ธ ์๊ฐ์ updateํ๋ ๋ฉ์๋ ๊ตฌํ (#196) * ktlint formatting * refactor : ๋ง์ง๋ง ๋๊ธ Read ์๊ฐ์ ๋ถ๋ฆฌ๋ ํ ์ด๋ธ์ด ์๋ Goal์ด ๊ฐ๋๋ก ๋ณ๊ฒฝ (#196) * feat : ๋๊ธ ์กฐํ์ ์์ฒญ์๊ฐ Goal์ ์ฃผ์ธ์ด๋ผ๋ฉด comment read time์ updateํ๋ ์ด๋ฒคํธ ๋ฐํ (#196) * test : Goal ํ๋ ์ถ๊ฐ์ ๋ฐ๋ฅธ ํ ์คํธ ์ฝ๋ ๋ณ๊ฒฝ (#196) * refactor : CoreApiException์ด ์ง์ errorMessage๋ฅผ ์ ๋ ฅ ๋ฐ์ ์ ์๋๋ก ๋ณ๊ฒฝ (#196) * refactor : Comment๊ฐ ์ค์ค๋ก ์ ํ ์กฐ๊ฑด์ ๊ฒ์ฆํ๋๋ก ๋ณ๊ฒฝ (#196) * refactor : CommentService์ ํ๋๋ค์ private ์ ๊ทผ ์ ํ์ ์ถ๊ฐ (#196) * refactor : comment require ์กฐ๊ฑด ์ ์ (#196) * refactor : ๋ถํ์ํ ํธ๋์ญ์ ์ ํ ๋ฐ Transactional ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๊ฑฐ (#196) * refactor : ๋ถํ์ํ Goal ์กฐํ ์ฟผ๋ฆฌ ์ ๊ฑฐ (#196) * test : Comment ๊ด๋ จ ๊ธฐ๋ฅ ํตํฉ ํ ์คํธ ์ฝ๋ ์์ฑ (#196) * ktlint formatting * refactor : getAllByGoalId ๋ฉ์๋์ ์ด๋ฆ์ ์ญํ ์ ๋ง๊ฒ findAllByGoalId๋ก ๋ณ๊ฒฝ (#196) * feat : ๋๊ธ API ๊ตฌํ (#196) * chore : ์๋ชป ์์ฑ๋ ๋ฉ์๋ ์ด๋ฆ ๋ณ๊ฒฝ (#196) * refactor : DTO ํจํค์ง ๋ณ๊ฒฝ (#196) * refactor : comments์์ goal์ ๊บผ๋ผ ๋, first ๋ฉ์๋ ํ์ฉ (#196) * refactor : ๋ถํ์ํ @async ์ด๋ ธํ ์ด์ ์ ๊ฑฐ (#196) * refactor : findAllByGoalId ๊ฐ๋ ์ฑ ๊ฐ์ (#196) * refactor : Emoji API Restfulํ๊ฒ ๊ฐ์ (#196) (#215) * [๐ Issue ] Emoji Count ์์ ๋ฐ Count ๊ด๋ จ ๋ก์ง ๊ฐ์ (#213) * refactor(#211): count๊ด๋ จ eventListener ๋จ์ผ componentํ * feat(#211): emoji count ํ ์ด๋ธ ์ถ๊ฐ ๋ฐ count๊ด๋ จ event application lock ์ ์ฉ * feat(#211): add goal count event์ exclusive runner ์ ์ฉ * refactor: event ๊ฐ์ ํจํค์ง๋ก ์ด๋ * feat: lock ์ ์ฉ ์์ ๋น๋๊ธฐ ์ด๋ฒคํธ ์คํ Thread๋ก ๋ณ๊ฒฝ * refactor: event ๋ค์ด๋ฐ ์ปจ๋ฒค์ ์ ์ฉ * fix: key์ ๋งคํ๋ lock ๋๊ธฐ thread๊ฐ ์๋ค๋ฉด map์์ ์ ๊ฑฐ * [๐ Issue] ๋ฆฌํฉํ ๋ง ์ด์ ํ ํ๋ฆฟ ์ธํ (#220) * chore : ๋ฆฌํฉํ ๋ง ์ด์ ํ ํ๋ฆฟ ์ธํ * chore : ๊ธฐํ-์ด์ ๊ธฐ๋ณธ ์์ฑ ์ ๋ชฉ์ ๋ถํ์ํ ๋์ด์ฐ๊ธฐ ์ ๊ฑฐ * [๐ ๏ธ Refactor] Goal Emoji API ์๋ต์ "์ด๋ชจ์ง๋ฅผ ๋๋ฅธ ์ฌ๋ ์" ์ถ๊ฐ (#221) * refactor : Goal์ ๋ฐ์ ์กฐํ API์ ๋ฐ์ํ ์ฌ๋ ์ ๊ฐ ์ถ๊ฐ (#218) * test : Goal ๋ฐ์ ์กฐํ API ๋ฐ์ํ ์ฌ๋ ์ ๊ฐ์ด ์ ํํ์ง ํ์ธํ๋ ํ ์คํธ ์์ฑ (#218) * [๐ ๏ธ Refactor] IsMyReaction์ ํ์ธํ ๋ Username์ด ์๋ id๋ก ํ์ธํ๊ธฐ (#219) * refactor : IsMyReaction์ ํ์ธํ ๋ Username์ด ์๋ id๋ก ํ์ธํ๋๋ก ๋ณ๊ฒฝ (#217) * merge with develop * [๐ Bug] authorization_request_not_found ์ค๋ฅ (#216) * feat(#209): spring security authorization_request_not_found ์์ * fix: AuthorizationRequestRepository cookie ๊ธฐ๋ฐ์์ state parameter ๊ธฐ๋ฐ์ผ๋ก ๋ณ๊ฒฝ * fix: AuthorizationRequestRepository remove ๋ฉ์๋์ ๋ช ์์ ์ธ ์ญ์ ์ถ๊ฐ * fix: AuthorizationRequestRepository oauthRequestStorage ๋ฐ์ดํฐ ๋ช ์์ ์ญ์ ๋ก์ง ์ ๊ฑฐ * refact(#171): add emoji count * feat(#171): ํผ๋์ ์ด๋ชจ์ง๋ฐ ๋ด๊ฐ ๋๋ฅธ ์ด๋ชจ์ง ์ถ๊ฐ * chore(#171): ktlint * chore(#171): ์ฌ์ฉํ์ง ์๋ ์ฝ๋ ์ญ์ * chore(#171): ktlint * [๐ ๏ธ Refactor] ๋๊ธ ์๋ต์ ๋๊ธ ๊ฐฏ์ ์ถ๊ฐ (#225) * refactor : Goal์ ๋ฌ๋ฆฐ ๋๊ธ ์๋ต์ ๋๊ธ ๊ฐฏ์ ์ถ๊ฐ (#224) * test : Goal์ ๋ฌ๋ฆฐ ๋๊ธ ์๋ต์ด ๋๊ธ ๊ฐฏ์๋ฅผ ๋ฐํํ๋ ๊ฒ์ ํ์ธํ๋ ํ ์คํธ ์ฝ๋ ์์ฑ (#224) * ktlint formatting * refact(#171): edit field name * [๐ ๏ธ Refactor] RunnerLock ํ๋ ๋ณ์๋ช ๋ณ๊ฒฝ ๏ฟฝ+ Security Uri ์์ํ + H2 ์น ์ฝ์์ฉ WebSecurityCustomizer ์ ๊ฑฐ (#226) * refactor: RunnerLock ๋ด๋ถ ํ๋ ๋ณ์๋ช ๋ณ๊ฒฝ * refactor: security permitall uri ์์ํ * [๐ ๏ธ Refactor] ๋๊ธ ์กฐํ API ์๋ต์ "๋ด ์ง๋ ํ์ธ" key-value ์ถ๊ฐ (#230) * refactor : CommentsResponse์ ์์ ์ ๋ชฉํ์ธ์ง ํ์ธํ๋ isMyGoal ํ๋ ์ถ๊ฐ (#229) * test : CommentsResponse๋ฅผ ํตํด ์์ ์ ๋ชฉํ์ธ์ง ํ์ธํ ์ ์๋์ง ๊ฒ์ฆํ๋ ํ ์คํธ ์ฝ๋ ์์ฑ (#229) * feat(#232): add title field * [๐ ๏ธ Refactor] ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ (1๋ฒ, 3๋ฒ ์ ์๋ง ๋ณ๊ฒฝ) (#234) * refactor(#235): pagination ๊ณตํตํ + cheering squad ๊ณตํต pagination ์ ์ฉ * [๐ ๏ธ Refactor] ์๋ชป ์์ฑ๋ ์ฝ์ง ์์ ๋๊ธ ์กฐํ ์ฟผ๋ฆฌ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ (#237) * refactor : CommentsResponse์ ์์ ์ ๋ชฉํ์ธ์ง ํ์ธํ๋ isMyGoal ํ๋ ์ถ๊ฐ (#229) * test : CommentsResponse๋ฅผ ํตํด ์์ ์ ๋ชฉํ์ธ์ง ํ์ธํ ์ ์๋์ง ๊ฒ์ฆํ๋ ํ ์คํธ ์ฝ๋ ์์ฑ (#229) * refactor : exist new comment ์ฟผ๋ฆฌ๋ฅผ id์ ์๊ฐ์ผ๋ก ๊ฒ์ํ๋๋ก ๋ณ๊ฒฝ (#236) * refactor : ์ฟผ๋ฆฌ๊ฐ Goal Id๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ (#236) * test : ๋ณธ์ธ์ Goal๋ง ์กฐํํ๋์ง ๊ฒ์ฆํ๋ ํ ์คํธ ์ถ๊ฐ ์์ฑ (#236) * feat: pagination ๊ณตํต response ์ถ๊ฐ + cheering squad ์กฐํ๋ฅผ ์ํ queryRepository ์ถ๊ฐ * feat(#235): comment count ์ํฐํฐ ์ถ๊ฐ + comment create/delete event ์์ฑ * feat(#235): ๋ชฉํ ํ์๋ผ์ธ ํ์ด์ง ์กฐํ API ์์ * fix: dev ํ๊ฒฝ ๋ก๊ทธ์ธ callback ์ redirect uri ๋ณ๊ฒฝ * chore: apply lint * refactor: CheererRepository ๋ฏธ์ฌ์ฉ ๋ฉ์๋ ์ ๊ฑฐ * refactor: TriFunction @FunctionalInterface ์ ์ฉ * refactor(#235): PR ์ฝ๋ฉํธ ๋ฐ์ * [๐ Feature] ํ์ ๋ผ์ธ์ฉ ๋ชฉํ ์กฐํ API ๊ฐ๋ฐ (#240) * refactor(#235): pagination ๊ณตํตํ + cheering squad ๊ณตํต pagination ์ ์ฉ * feat: pagination ๊ณตํต response ์ถ๊ฐ + cheering squad ์กฐํ๋ฅผ ์ํ queryRepository ์ถ๊ฐ * feat(#235): comment count ์ํฐํฐ ์ถ๊ฐ + comment create/delete event ์์ฑ * feat(#235): ๋ชฉํ ํ์๋ผ์ธ ํ์ด์ง ์กฐํ API ์์ * fix: dev ํ๊ฒฝ ๋ก๊ทธ์ธ callback ์ redirect uri ๋ณ๊ฒฝ * chore: apply lint * refactor: CheererRepository ๋ฏธ์ฌ์ฉ ๋ฉ์๋ ์ ๊ฑฐ * refactor: TriFunction @FunctionalInterface ์ ์ฉ * refactor(#235): PR ์ฝ๋ฉํธ ๋ฐ์ * hotfix(#235): ํ์ธ ํ์๋ผ์ธ ์กฐํ API ์ถ๊ฐ * chore: apply klint * [๐ ๏ธ Refactor] ํ์ ๋ผ์ธ API ์์ ๋ฆฌํฉํ ๋ง (#241) * delete: ์ ์ ์ ๋ณด๋ฅผ ํ์ฉํ ํ์๋ผ์ธ ์กฐํ API ์ญ์ * refactor: PaginationResult.transform() ์ฌ์ฉ ๋ฐฉ์ lamda ํํ๋ก ํต์ผ * refactor: ๋ฉ์๋ ๋ก์ง์ ๋ฐ๋ผ get, find ๋ช ์นญ ๊ตฌ๋ถ * refactor: lamda body ๋ด ์๋ต ๊ฐ๋ฅํ parameter ์๋ต * refactor: ๋ฉ์๋๋ช ๋ด ๋ถ์ ํํ ๋จ์ด ์ ๊ฑฐ(findGoalTimelineCountMap -> findGoalCountMap) * refactor: associateWith ๋ฉ์๋ ํ์ฉ * refactor: PaginationResult total๊ฐ Long์ผ๋ก ๋ค์ ๋ณ๊ฒฝ * hotfix: dev login redirect url ์์ * hotfix: login redirect url referer ๊ธฐ์ค ๋ถ๊ธฐ ์ฒ๋ฆฌ * hotfix: login redirect url referer ๊ธฐ์ค ๋ถ๊ธฐ ์ฒ๋ฆฌ ์กฐ๊ฑด ์ถ๊ฐ * hotfix: login redirect url referer ๊ธฐ์ค ๋ถ๊ธฐ ์ฒ๋ฆฌ ์ ๊ฑฐ * [๐ Feature] ํ์ ๋ผ์ธ์ฉ ๋ชฉํ ์กฐํ API ๊ฐ๋ฐ - Cursor Deadline์ผ๋ก ๋ณ๊ฒฝ (#242) * delete: ์ ์ ์ ๋ณด๋ฅผ ํ์ฉํ ํ์๋ผ์ธ ์กฐํ API ์ญ์ * refactor: PaginationResult.transform() ์ฌ์ฉ ๋ฐฉ์ lamda ํํ๋ก ํต์ผ * refactor: ๋ฉ์๋ ๋ก์ง์ ๋ฐ๋ผ get, find ๋ช ์นญ ๊ตฌ๋ถ * refactor: lamda body ๋ด ์๋ต ๊ฐ๋ฅํ parameter ์๋ต * refactor: ๋ฉ์๋๋ช ๋ด ๋ถ์ ํํ ๋จ์ด ์ ๊ฑฐ(findGoalTimelineCountMap -> findGoalCountMap) * refactor: associateWith ๋ฉ์๋ ํ์ฉ * refactor: PaginationResult total๊ฐ Long์ผ๋ก ๋ค์ ๋ณ๊ฒฝ * fix: ๋ชฉํ ํผ๋ ์กฐํ API deadline ์ญ์์ผ๋ก ์ ๋ ฌ ์กฐํ * chore: apply lint * fix: goals ํ ์ด๋ธ์ index ์์ * refactor: pagination cusorId type Any -> Generic์ผ๋ก ๋ณ๊ฒฝ * [๐ Feature] ํ์ ๋ผ์ธ์ฉ ๋ชฉํ ์กฐํ API ๊ฐ๋ฐ - Pagination ๋ฐฉ์ offset ๊ธฐ๋ฐ์ผ๋ก ๋ณ๊ฒฝ (#243) * delete: ์ ์ ์ ๋ณด๋ฅผ ํ์ฉํ ํ์๋ผ์ธ ์กฐํ API ์ญ์ * refactor: PaginationResult.transform() ์ฌ์ฉ ๋ฐฉ์ lamda ํํ๋ก ํต์ผ * refactor: ๋ฉ์๋ ๋ก์ง์ ๋ฐ๋ผ get, find ๋ช ์นญ ๊ตฌ๋ถ * refactor: lamda body ๋ด ์๋ต ๊ฐ๋ฅํ parameter ์๋ต * refactor: ๋ฉ์๋๋ช ๋ด ๋ถ์ ํํ ๋จ์ด ์ ๊ฑฐ(findGoalTimelineCountMap -> findGoalCountMap) * refactor: associateWith ๋ฉ์๋ ํ์ฉ * refactor: PaginationResult total๊ฐ Long์ผ๋ก ๋ค์ ๋ณ๊ฒฝ * fix: ๋ชฉํ ํผ๋ ์กฐํ API deadline ์ญ์์ผ๋ก ์ ๋ ฌ ์กฐํ * chore: apply lint * fix: goals ํ ์ด๋ธ์ index ์์ * refactor: pagination cusorId type Any -> Generic์ผ๋ก ๋ณ๊ฒฝ * fix: ํ์ ๋ผ์ธ ๋ชฉํ ์กฐํ API paging ์ฒ๋ฆฌ ๋ฐฉ์ offset์ผ๋ก ๋ณ๊ฒฝ * refactor: cursor ๊ธฐ๋ฐ pagination ๊ณตํต ๋ชจ๋ cursor type long์ผ๋ก ํต์ผ * refactor: pagination ๊ณตํต ๋ชจ๋ cursor์ offset ๊ตฌ๋ถ * refactor: ๋ฏธ์ฌ์ฉ ์ฝ๋ ๋ฐ ์๋ฏธ ์๋ ์ค๋ณต ์ฝ๋ ์ญ์ * hotfix: global exception config ๋ด NoSuchElementException ์ค์ ์์ * [๐ Issue] dev api ๋ก๊ทธ์ธ ์์ฒญ ์์น์ ๋ฐ๋ผ redirect url ๋ณํ (#245) * delete: ์ ์ ์ ๋ณด๋ฅผ ํ์ฉํ ํ์๋ผ์ธ ์กฐํ API ์ญ์ * refactor: PaginationResult.transform() ์ฌ์ฉ ๋ฐฉ์ lamda ํํ๋ก ํต์ผ * refactor: ๋ฉ์๋ ๋ก์ง์ ๋ฐ๋ผ get, find ๋ช ์นญ ๊ตฌ๋ถ * refactor: lamda body ๋ด ์๋ต ๊ฐ๋ฅํ parameter ์๋ต * refactor: ๋ฉ์๋๋ช ๋ด ๋ถ์ ํํ ๋จ์ด ์ ๊ฑฐ(findGoalTimelineCountMap -> findGoalCountMap) * refactor: associateWith ๋ฉ์๋ ํ์ฉ * refactor: PaginationResult total๊ฐ Long์ผ๋ก ๋ค์ ๋ณ๊ฒฝ * fix: ๋ชฉํ ํผ๋ ์กฐํ API deadline ์ญ์์ผ๋ก ์ ๋ ฌ ์กฐํ * chore: apply lint * fix: goals ํ ์ด๋ธ์ index ์์ * refactor: pagination cusorId type Any -> Generic์ผ๋ก ๋ณ๊ฒฝ * fix: ํ์ ๋ผ์ธ ๋ชฉํ ์กฐํ API paging ์ฒ๋ฆฌ ๋ฐฉ์ offset์ผ๋ก ๋ณ๊ฒฝ * refactor: cursor ๊ธฐ๋ฐ pagination ๊ณตํต ๋ชจ๋ cursor type long์ผ๋ก ํต์ผ * refactor: pagination ๊ณตํต ๋ชจ๋ cursor์ offset ๊ตฌ๋ถ * feat(#244): dev api ๋ก๊ทธ์ธ ์์ฒญ ์์น์ ๋ฐ๋ผ redirect url ๋ณํ * chore: apply lint * fix: @value(spring.profiles.active) default๊ฐ ์ถ๊ฐ * refactor: ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ์(#245) * chore: encryptํ๋ ๋ฐ์ดํฐ ์ญ์ * chore: encrypted test properties ์ญ์ * chore: referer ์ ์ฅ/์กฐํ logging ์ถ๊ฐ * chore: logging ์ ๊ฑฐ * fix: getReferer ๋ฉ์๋ referer๊ฐ null์ผ ๊ฒฝ์ฐ Empty String ๋ฐํ * [๐ Bug] ํ์๋ผ์ธ ๊ด๋ จ ๋ฒ๊ทธ ์์ (#248) * fix: timeline ์กฐํ ์ ๋ชฉํ ์์ผ๋ฉด early return * feat: ์ ์ ์ ๋ณด ๊ธฐ๋ฐ ํ์ ๋ผ์ธ ์กฐํ API ์์ * fix: ๋ชฉํ ์ญ์ ์ LifeMapCount goalCount ํ๋ -1 ์ฒ๋ฆฌ * refactor: timeline ์กฐํ api ๋ด ๋ชฉํ ๊ฐ์ ์กฐํ ์ฟผ๋ฆฌ ๋ณ๊ฒฝ * feat(#171): edit comment count * chore: ktlint * refactor : Comment์ Emoji์ Goal Delete Casacade ์์ฑ ์ถ๊ฐ (#246) (#249) * refactor : ์์ ์ Goal์ ๋ฌ๋ฆฐ Comment ์ญ์ ๋ฅผ ํ์ฉํ๋๋ก ๋ณ๊ฒฝ (#251) (#252) * bug(#254): ํ์๋ผ์ธ ์กฐํ API ๋ด ์ฝ๋ฉํธ ๊ฐ์ ์กฐํ ์ฟผ๋ฆฌ ์ค๋ฅ ์์ * feat : ์ด๋ชจ์ง ์ถ๊ฐ ์ ์ ๊ฐ์ ์ด๋ชจ์ง๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ๋ฉ์๋ ์์ฑ (#253) (#256) * refactor : ๋ชจ๋ Emoji ์กฐํ API์์ ์ผ๊ด๋๊ฒ Emoji id ์์๋ก ์ ๋ ฌํด ์๋ตํ๋๋ก ๋ณ๊ฒฝ (#257) * refactor : ๋ถํ์ํ ์ ๋ ฌ ์ ๊ฑฐ - MySQL Clustered Index๋ก ์ธํด ์ด๋ฏธ pk ์ ๋ ฌ ๋์ด ์๋ค (#257) * fix : ํผ๋ ์กฐํ (#259) * feat(#171): ๋ชฉํ ์์ฑ์ ๊ธฐ๋ณธ ๋๊ธ ๊ฐ์ ์ถ๊ฐ * chore(#171): ktlint * feat(#171): ๊ธฐ๋ณธ ์นด์ดํธ ์ถ๊ฐ * chore: ktlint * refact(#171): ๋ณ์ ์ญ์ --------- Co-authored-by: ManHyuk <[email protected]> Co-authored-by: binary_ho <[email protected]>
๐ Issue
๐ฏ ์ด๋ค ์์ ์ ํ๋์ง
develop์ ์ ์ฉ ํ ํ ์คํธ ํ์ํจ
๐ ์ํฅ๋ฒ์ (๋ชจ๋)
Resolves: # See also: #