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

새로운 유저 로그인 시 발생하는 불필요한 쿼리 제거 #486

Merged
merged 12 commits into from
Sep 28, 2023

Conversation

green-kong
Copy link
Collaborator

@green-kong green-kong commented Sep 25, 2023

#️⃣ 연관된 이슈

resolved #485

📝 작업 내용

포스팅

merge가 호출 되면, db에 존재하는 데이터인지 확인하기 위해 select 쿼리가 한번 발생하는데요.
merge가 호출되느냐 persist가 호출 되느냐를 hibernate는 이 데이터가 새로운 데이터냐 아니냐로 기준을 잡습니다.
새로운 데이터인지 판별하는 기준은 id가 null 인경우는 새로운 데이터라 판단하여 바로 persist를 호출,
그렇지 않은 경우는 merge를 호출합니다.
image

현재 우리 member의 id는 OIDC를 그대로 사용하고 있어서, 새로운 데이터일지라도 id가 Null이 아니기에 merge가 호출되고 있구요.

근데 entity 가 Persistable의 구현체이면 entity의 isNew() 메서드를 호출해서 반환값으로 새로운 데이터인지 판별합니다.
isNew() 가 true를 반한다면, 새로운 데이터라 판단하여, persist를 호출 하겠죠.
image

그래서 member entity에 createdAt을 넣어줬습니다.
likedCafe에서 쓰기위해 만들어둔 BaseEntity 상속 받게끔 했구요.
isNew() 오버라이드해서 createdAt이 null인지 아닌지를 반환하게 했습니다.
해당 값은 db에 쓰여질 때 자동으로 입력되게끔 되어있어서, 데이터를 삽입하는 순간에는 null이라, persist가 호출 됩니다.

image
👆 개선 전

👇개선 후
image

쿼리 갯수가 하나 줄었네요^^
음 로그인 할 때 findById를 오버로딩 하던지 아니면, 다른 메서드를 하나 만들던지 해서, 개선 후 발생하는 쿼리 갯수 2개도 1개로 줄일 수 있다고 생각합니다.
이 부분은 연어가 작업하기로 해서 제외 하고 구현했습니다.

자세한 내용은 포스팅해서 공유하도록 하겠습니다.(하루 이틀 정도 걸릴 듯 합니다.)

💬 리뷰 요구사항

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요

@green-kong green-kong self-assigned this Sep 26, 2023
@green-kong green-kong added BE 개발은 백이징 우선순위:🟡보통 급하진 않지만, 필요한 작업입니다. 카테고리:리팩토링🪚 리팩토링입니다. labels Sep 26, 2023
@Entity
public class Member {
public class Member extends BaseEntity implements Persistable<String> {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

save()하고 merge를 결정하는 기준에 대해 공부해서 스마트하게 해결되었네요! 좋아용

Copy link
Collaborator

@donghae-kim donghae-kim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨어요 폴로 글 + 말랑 글 읽으니까 이해가 다 되어버렸어요

Copy link
Collaborator

@nuyh99 nuyh99 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굿굿굿굿
추석 잘 보내세용

@@ -0,0 +1,2 @@
ALTER TABLE `yozm-cafe`.member
ADD COLUMN created_at datetime(6) not null DEFAULT NOW(6);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not null도 대문자로 하면 좋을 것 같군요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 이 부분은 반영하겠습니다~


@Test
@DisplayName("새로운 유저가 로그인한다.")
void register() {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

구글 로그인 테스트랑 같은 것 같은데 필요한 테스트인지 궁금합니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다른 테스트 라고 생각합니다.
위의 테스트 같은 경우는 memberRepsoitory.findById를 통해 회원을 찾은 경우 라면,
이 테스트는 findById가 Optional.empty를 반한합니다.
즉 위의 테스트는 로그인하는 유저가 기존 사용자인경우 이고,
이 테스트는 로그인하는 유저가 신규 사용자인 경우입니다.

저는 이 PR에서 신규 사용자가 로그인하는 경우, select 이후 insert 가 되는 것을 확인하기위해 이 테스트 추가했습니다,

Copy link
Collaborator Author

@green-kong green-kong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

연어가 말씀하신대로 쿼리문 대문자 패치해서 merge 하겠습니다~


@Test
@DisplayName("새로운 유저가 로그인한다.")
void register() {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다른 테스트 라고 생각합니다.
위의 테스트 같은 경우는 memberRepsoitory.findById를 통해 회원을 찾은 경우 라면,
이 테스트는 findById가 Optional.empty를 반한합니다.
즉 위의 테스트는 로그인하는 유저가 기존 사용자인경우 이고,
이 테스트는 로그인하는 유저가 신규 사용자인 경우입니다.

저는 이 PR에서 신규 사용자가 로그인하는 경우, select 이후 insert 가 되는 것을 확인하기위해 이 테스트 추가했습니다,

@@ -0,0 +1,2 @@
ALTER TABLE `yozm-cafe`.member
ADD COLUMN created_at datetime(6) not null DEFAULT NOW(6);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 이 부분은 반영하겠습니다~

@green-kong green-kong merged commit 4b79e81 into dev Sep 28, 2023
1 check passed
@green-kong green-kong deleted the refactor/485-register-member-query branch September 28, 2023 04:53
@green-kong green-kong restored the refactor/485-register-member-query branch September 28, 2023 04:54
@green-kong green-kong deleted the refactor/485-register-member-query branch September 28, 2023 05:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BE 개발은 백이징 우선순위:🟡보통 급하진 않지만, 필요한 작업입니다. 카테고리:리팩토링🪚 리팩토링입니다.
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

4 participants