From e7f68ce1fbdc2065e72f6f0284a5bad7271dd185 Mon Sep 17 00:00:00 2001 From: kimyu0218 Date: Mon, 3 Feb 2025 22:18:23 +0900 Subject: [PATCH 1/7] =?UTF-8?q?[#37]=20refactor:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=A0=95=EB=B3=B4=20create=20=ED=98=B8=EC=B6=9C=20?= =?UTF-8?q?=EC=8B=9C=20=EB=84=98=EA=B8=B0=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/auth/service/OauthService.java | 20 +++++++++---------- .../domain/auth/service/OauthServiceTest.java | 7 ++++--- .../repository/MemberRepositoryTest.java | 2 +- .../service/MemberServiceIntegrationTest.java | 4 ++-- .../SocialAccountRepositoryTest.java | 4 ++-- .../survey/model/SurveySubscriptionsTest.java | 8 ++++---- .../SurveySubmissionRepositoryTest.java | 12 ++++++++--- .../survey/service/SurveyServiceTest.java | 12 ++++++++--- 8 files changed, 41 insertions(+), 28 deletions(-) diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java index 77980a71..8cf90551 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java @@ -48,23 +48,22 @@ public Long kakaoLogin(final KakaoLoginCommand command) { final KakaoTokenResponse token = getKakaoToken(command.authorizationCode(), command.redirectUri()); log.info("kakao 토큰 받아오기 완료"); - final KakaoUserInfoResponse userInfo = getKakaoUserInfo(token.getAccessToken()); + final KakaoUserInfoResponse userInfo = getKakaoUserInfo(token.accessToken()); log.info("kakao 사용자 정보 받아오기 완료"); - final String oauthId = userInfo.getId().toString(); + final String oauthId = userInfo.id().toString(); final Member member = findKakaoMember(oauthId); if (member == null) { - return signupKakaoMember(command.authorizationCode()).getId(); + final Member newMember = + memberRepository.save( + Member.create(userInfo.kakaoAccount().name(), userInfo.kakaoAccount().email())); + socialAccountRepository.save(SocialAccount.kakaoSignup(oauthId, newMember)); + return newMember.getId(); } + member.updateUserInfo(userInfo.kakaoAccount().name(), userInfo.kakaoAccount().email()); return member.getId(); } - private Member signupKakaoMember(final String oauthId) { - final Member member = memberRepository.save(Member.create()); - socialAccountRepository.save(SocialAccount.kakaoSignup(oauthId, member)); - return member; - } - private Member findKakaoMember(final String oauthId) { return socialAccountRepository .findByOauthIdAndSocialProviderAndDeletedAtIsNull(oauthId, SocialProvider.KAKAO) @@ -100,7 +99,8 @@ public Long appleLogin(final AppleLoginCommand command) { .map(account -> account.getMember().getId()) .orElseGet( () -> { - final Member member = memberRepository.save(Member.create()); + final Member member = + memberRepository.save(Member.create("TODO: name", "TODO: email")); socialAccountRepository.save( SocialAccount.appleSignUp(authorization.getSub(), member)); return member.getId(); diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceTest.java index 3727b0f9..46aab3cb 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceTest.java @@ -11,6 +11,7 @@ import org.nexters.jaknaesocore.common.support.ServiceTest; import org.nexters.jaknaesocore.domain.auth.restclient.dto.KakaoTokenResponse; import org.nexters.jaknaesocore.domain.auth.restclient.dto.KakaoUserInfoResponse; +import org.nexters.jaknaesocore.domain.auth.restclient.dto.KakaoUserInfoResponse.KakaoAccount; import org.nexters.jaknaesocore.domain.auth.service.dto.KakaoLoginCommand; import org.nexters.jaknaesocore.domain.member.model.Member; import org.nexters.jaknaesocore.domain.socialaccount.model.SocialAccount; @@ -37,7 +38,7 @@ class OauthServiceTest extends ServiceTest { given(kakaoAuthClient.requestToken(makeKakaoTokenRequestParams(command.authorizationCode()))) .willReturn(new KakaoTokenResponse("bearer", "access token", 1, "refresh token", 1)); given(kakaoClient.requestUserInfo(BEARER_PREFIX + "access token")) - .willReturn(new KakaoUserInfoResponse(oauthId)); + .willReturn(new KakaoUserInfoResponse(oauthId, new KakaoAccount("name", "email"))); given( socialAccountRepository.findByOauthIdAndSocialProviderAndDeletedAtIsNull( oauthId.toString(), KAKAO)) @@ -59,7 +60,7 @@ class OauthServiceTest extends ServiceTest { given(kakaoAuthClient.requestToken(makeKakaoTokenRequestParams(command.authorizationCode()))) .willReturn(new KakaoTokenResponse("bearer", "access token", 1, "refresh token", 1)); given(kakaoClient.requestUserInfo(BEARER_PREFIX + "access token")) - .willReturn(new KakaoUserInfoResponse(oauthId)); + .willReturn(new KakaoUserInfoResponse(oauthId, new KakaoAccount("name", "email"))); given( socialAccountRepository.findByOauthIdAndSocialProviderAndDeletedAtIsNull( oauthId.toString(), KAKAO)) @@ -91,7 +92,7 @@ class OauthServiceTest extends ServiceTest { } private Member createMemberWithId(final Long id) { - Member member = Member.create(); + Member member = Member.create("name", "email"); ReflectionTestUtils.setField(member, "id", id); return member; } diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/member/repository/MemberRepositoryTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/member/repository/MemberRepositoryTest.java index 4829a264..040975bf 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/member/repository/MemberRepositoryTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/member/repository/MemberRepositoryTest.java @@ -16,7 +16,7 @@ class MemberRepositoryTest extends RepositoryTest { @Test void 아이디에_해당하는_멤버를_조회한다() { - Member member = memberRepository.save(Member.create()); + Member member = memberRepository.save(Member.create("name", "email")); then(memberRepository.findMember(member.getId())).isEqualTo(member); } diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/member/service/MemberServiceIntegrationTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/member/service/MemberServiceIntegrationTest.java index f17c9692..8552c8ca 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/member/service/MemberServiceIntegrationTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/member/service/MemberServiceIntegrationTest.java @@ -28,7 +28,7 @@ void tearDown() { @Test void 멤버를_삭제한다() { - Member member = memberRepository.save(Member.create()); + Member member = memberRepository.save(Member.create("name", "email")); sut.deleteMember(member.getId()); @@ -39,7 +39,7 @@ void tearDown() { @Test void 멤버_삭제_시_멤버의_소셜_계정도_함께_삭제한다() { - Member member = memberRepository.save(Member.create()); + Member member = memberRepository.save(Member.create("name", "email")); SocialAccount account = socialAccountRepository.save(SocialAccount.kakaoSignup("oauthId1", member)); diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/socialaccount/repository/SocialAccountRepositoryTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/socialaccount/repository/SocialAccountRepositoryTest.java index ab6bce85..0751b6f8 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/socialaccount/repository/SocialAccountRepositoryTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/socialaccount/repository/SocialAccountRepositoryTest.java @@ -19,7 +19,7 @@ class SocialAccountRepositoryTest extends RepositoryTest { @Test void oauthId와_socialProvider에_해당하는_소셜_계정을_조회한다() { - Member member = memberRepository.save(Member.create()); + Member member = memberRepository.save(Member.create("name", "email")); socialAccountRepository.save(SocialAccount.kakaoSignup("oauthId1", member)); Optional actual1 = @@ -34,7 +34,7 @@ class SocialAccountRepositoryTest extends RepositoryTest { @Test void oauthId와_socialProvider에_해당하는_소셜_계정_존재_여부를_조회한다() { - Member member = memberRepository.save(Member.create()); + Member member = memberRepository.save(Member.create("name", "email")); socialAccountRepository.save(SocialAccount.kakaoSignup("oauthId1", member)); boolean actual1 = diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/model/SurveySubscriptionsTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/model/SurveySubscriptionsTest.java index bf2b26e8..4d5d195c 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/model/SurveySubscriptionsTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/model/SurveySubscriptionsTest.java @@ -15,7 +15,7 @@ class SurveySubscriptionsTest { @Test void getSubmittedSurvey() { // given - Member member = Member.create(); + Member member = Member.create("name", "email"); ReflectionTestUtils.setField(member, "id", 1L); SurveyBundle surveyBundle = new SurveyBundle(); @@ -51,10 +51,10 @@ void getSubmittedSurvey() { @Test void getSubmittedSurvey_OtherMember() { // given - Member member1 = Member.create(); + Member member1 = Member.create("name", "email"); ReflectionTestUtils.setField(member1, "id", 1L); - Member member2 = Member.create(); + Member member2 = Member.create("name", "email"); ReflectionTestUtils.setField(member2, "id", 2L); SurveyBundle surveyBundle = new SurveyBundle(); @@ -90,7 +90,7 @@ void getSubmittedSurvey_OtherMember() { @Test void getSubmittedSurvey_Empty() { // given - Member member = Member.create(); + Member member = Member.create("name", "email"); ReflectionTestUtils.setField(member, "id", 1L); // when diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/repository/SurveySubmissionRepositoryTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/repository/SurveySubmissionRepositoryTest.java index 0a871a8a..43f07618 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/repository/SurveySubmissionRepositoryTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/repository/SurveySubmissionRepositoryTest.java @@ -1,6 +1,7 @@ package org.nexters.jaknaesocore.domain.survey.repository; -import static org.assertj.core.api.BDDAssertions.*; +import static org.assertj.core.api.BDDAssertions.then; +import static org.assertj.core.api.BDDAssertions.tuple; import java.math.BigDecimal; import java.util.List; @@ -10,7 +11,12 @@ import org.nexters.jaknaesocore.common.support.IntegrationTest; import org.nexters.jaknaesocore.domain.member.model.Member; import org.nexters.jaknaesocore.domain.member.repository.MemberRepository; -import org.nexters.jaknaesocore.domain.survey.model.*; +import org.nexters.jaknaesocore.domain.survey.model.BalanceSurvey; +import org.nexters.jaknaesocore.domain.survey.model.Keyword; +import org.nexters.jaknaesocore.domain.survey.model.KeywordScore; +import org.nexters.jaknaesocore.domain.survey.model.SurveyBundle; +import org.nexters.jaknaesocore.domain.survey.model.SurveyOption; +import org.nexters.jaknaesocore.domain.survey.model.SurveySubmission; import org.springframework.beans.factory.annotation.Autowired; class SurveySubmissionRepositoryTest extends IntegrationTest { @@ -34,7 +40,7 @@ void tearDown() { @DisplayName("회원이 제출한 설문 ID를 가져온다.") @Test void findByMember_IdAndDeletedAtIsNull() { - Member member = Member.create(); + Member member = Member.create("name", "email"); memberRepository.save(member); SurveyBundle surveyBundle = new SurveyBundle(); surveyBundleRepository.save(surveyBundle); diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java index 727c5912..1f8d5d7c 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/survey/service/SurveyServiceTest.java @@ -1,6 +1,7 @@ package org.nexters.jaknaesocore.domain.survey.service; -import static org.assertj.core.api.BDDAssertions.*; +import static org.assertj.core.api.BDDAssertions.then; +import static org.assertj.core.api.BDDAssertions.tuple; import java.math.BigDecimal; import java.util.List; @@ -11,13 +12,18 @@ import org.nexters.jaknaesocore.domain.member.model.Member; import org.nexters.jaknaesocore.domain.member.repository.MemberRepository; import org.nexters.jaknaesocore.domain.survey.dto.SurveyResponse; -import org.nexters.jaknaesocore.domain.survey.model.*; +import org.nexters.jaknaesocore.domain.survey.model.BalanceSurvey; +import org.nexters.jaknaesocore.domain.survey.model.Keyword; +import org.nexters.jaknaesocore.domain.survey.model.KeywordScore; +import org.nexters.jaknaesocore.domain.survey.model.SurveyBundle; +import org.nexters.jaknaesocore.domain.survey.model.SurveyOption; import org.nexters.jaknaesocore.domain.survey.repository.SurveyBundleRepository; import org.nexters.jaknaesocore.domain.survey.repository.SurveyOptionRepository; import org.nexters.jaknaesocore.domain.survey.repository.SurveyRepository; import org.springframework.beans.factory.annotation.Autowired; class SurveyServiceTest extends IntegrationTest { + @Autowired private SurveyService surveyService; @Autowired private MemberRepository memberRepository; @@ -37,7 +43,7 @@ void tearDown() { @Test void getNextSurvey() { // given - Member member = Member.create(); + Member member = Member.create("name", "email"); memberRepository.save(member); SurveyBundle surveyBundle = new SurveyBundle(); surveyBundleRepository.save(surveyBundle); From 98e99223fdb0926a8a6c7a421437d9cf6f6b7af3 Mon Sep 17 00:00:00 2001 From: kimyu0218 Date: Mon, 3 Feb 2025 22:18:46 +0900 Subject: [PATCH 2/7] =?UTF-8?q?[#37]=20feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/model/Member.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java index b91755a9..db4b8145 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java @@ -19,8 +19,17 @@ public class Member extends BaseTimeEntity { @OneToMany(mappedBy = "member") private List socialAccounts; - public static Member create() { - return new Member(); + private String name; + + private String email; + + private Member(final String name, final String email) { + this.name = name; + this.email = email; + } + + public static Member create(final String name, final String email) { + return new Member(name, email); } public void softDelete() { @@ -29,4 +38,9 @@ public void softDelete() { } super.softDelete(); } + + public void updateUserInfo(final String name, final String email) { + this.name = name; + this.email = email; + } } From c815e1c862ed1d8bede91ce7fa4f66e5f3456999 Mon Sep 17 00:00:00 2001 From: kimyu0218 Date: Mon, 3 Feb 2025 22:19:26 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[#37]=20refactor:=20=EC=99=B8=EB=B6=80=20ht?= =?UTF-8?q?tp=20=EC=9D=91=EB=8B=B5=20dto=20record=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../restclient/dto/KakaoTokenResponse.java | 31 ++++--------------- .../restclient/dto/KakaoUserInfoResponse.java | 16 +++------- 2 files changed, 11 insertions(+), 36 deletions(-) diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/restclient/dto/KakaoTokenResponse.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/restclient/dto/KakaoTokenResponse.java index 889afeaa..8c4d7f5c 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/restclient/dto/KakaoTokenResponse.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/restclient/dto/KakaoTokenResponse.java @@ -2,30 +2,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -@Setter -@Getter -@NoArgsConstructor -@AllArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) -public class KakaoTokenResponse { - - @JsonProperty("token_type") - private String tokenType; - - @JsonProperty("access_token") - private String accessToken; - - @JsonProperty("expires_in") - private Integer expiresIn; - - @JsonProperty("refresh_token") - private String refreshToken; - - @JsonProperty("refresh_token_expires_in") - private Integer refreshTokenExpiresIn; -} +public record KakaoTokenResponse( + @JsonProperty("token_type") String tokenType, + @JsonProperty("access_token") String accessToken, + @JsonProperty("expires_in") Integer expiresIn, + @JsonProperty("refresh_token") String refreshToken, + @JsonProperty("refresh_token_expires_in") Integer refreshTokenExpiresIn) {} diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/restclient/dto/KakaoUserInfoResponse.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/restclient/dto/KakaoUserInfoResponse.java index 5c7c417f..c088880e 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/restclient/dto/KakaoUserInfoResponse.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/restclient/dto/KakaoUserInfoResponse.java @@ -2,18 +2,12 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -@Setter -@Getter -@NoArgsConstructor -@AllArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) -public class KakaoUserInfoResponse { +public record KakaoUserInfoResponse( + @JsonProperty("id") Long id, @JsonProperty("kakao_account") KakaoAccount kakaoAccount) { - @JsonProperty("id") - Long id; + @JsonIgnoreProperties(ignoreUnknown = true) + public record KakaoAccount( + @JsonProperty("name") String name, @JsonProperty("email") String email) {} } From 14ecfc03fc622b873cf871329f49bfc85e33779c Mon Sep 17 00:00:00 2001 From: kimyu0218 Date: Tue, 4 Feb 2025 01:12:13 +0900 Subject: [PATCH 4/7] =?UTF-8?q?[#37]=20feat:=20=EC=95=A0=ED=94=8C=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=8B=9C=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84,=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/auth/service/OauthService.java | 43 +++---- .../service/OauthServiceIntegrationTest.java | 94 ++++++++++++-- .../domain/auth/service/OauthServiceTest.java | 117 ------------------ 3 files changed, 102 insertions(+), 152 deletions(-) delete mode 100644 jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceTest.java diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java index 8cf90551..8d5022a1 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java @@ -47,12 +47,10 @@ public class OauthService { public Long kakaoLogin(final KakaoLoginCommand command) { final KakaoTokenResponse token = getKakaoToken(command.authorizationCode(), command.redirectUri()); - log.info("kakao 토큰 받아오기 완료"); final KakaoUserInfoResponse userInfo = getKakaoUserInfo(token.accessToken()); - log.info("kakao 사용자 정보 받아오기 완료"); final String oauthId = userInfo.id().toString(); - final Member member = findKakaoMember(oauthId); + final Member member = findMemberWithSocialProvider(oauthId, SocialProvider.KAKAO); if (member == null) { final Member newMember = memberRepository.save( @@ -64,14 +62,6 @@ public Long kakaoLogin(final KakaoLoginCommand command) { return member.getId(); } - private Member findKakaoMember(final String oauthId) { - return socialAccountRepository - .findByOauthIdAndSocialProviderAndDeletedAtIsNull(oauthId, SocialProvider.KAKAO) - .map(SocialAccount::getMember) - .filter(member -> member.getDeletedAt() == null) - .orElse(null); - } - private KakaoUserInfoResponse getKakaoUserInfo(final String accessToken) { return kakaoClient.requestUserInfo(BEARER_PREFIX + accessToken); } @@ -87,24 +77,31 @@ private KakaoTokenResponse getKakaoToken( return kakaoAuthClient.requestToken(params); } + private Member findMemberWithSocialProvider( + final String oauthId, final SocialProvider socialProvider) { + return socialAccountRepository + .findByOauthIdAndSocialProviderAndDeletedAtIsNull(oauthId, socialProvider) + .map(SocialAccount::getMember) + .filter(member -> member.getDeletedAt() == null) + .orElse(null); + } + @Transactional public Long appleLogin(final AppleLoginCommand command) { AppleIdToken appleIdToken = AppleIdToken.of(command.idToken()); final String jwtClaims = appleIdToken.decodePayload(); final AppleAuthorization authorization = decodeAppleIdTokenPayload(jwtClaims); - return socialAccountRepository - .findByOauthIdAndSocialProviderAndDeletedAtIsNull( - authorization.getSub(), SocialProvider.APPLE) - .map(account -> account.getMember().getId()) - .orElseGet( - () -> { - final Member member = - memberRepository.save(Member.create("TODO: name", "TODO: email")); - socialAccountRepository.save( - SocialAccount.appleSignUp(authorization.getSub(), member)); - return member.getId(); - }); + final Member member = + findMemberWithSocialProvider(authorization.getSub(), SocialProvider.APPLE); + if (member == null) { + final Member newMember = + memberRepository.save(Member.create(command.name(), authorization.getEmail())); + socialAccountRepository.save(SocialAccount.appleSignUp(authorization.getSub(), newMember)); + return newMember.getId(); + } + member.updateUserInfo(command.name(), authorization.getEmail()); + return member.getId(); } private AppleAuthorization decodeAppleIdTokenPayload(final String appleJwtClaims) { diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceIntegrationTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceIntegrationTest.java index ede61328..55d3e3a3 100644 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceIntegrationTest.java +++ b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceIntegrationTest.java @@ -2,13 +2,21 @@ import static org.assertj.core.api.Assertions.tuple; import static org.assertj.core.api.BDDAssertions.then; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.nexters.jaknaesocore.common.support.IntegrationTest; +import org.nexters.jaknaesocore.domain.auth.restclient.dto.KakaoTokenResponse; +import org.nexters.jaknaesocore.domain.auth.restclient.dto.KakaoUserInfoResponse; +import org.nexters.jaknaesocore.domain.auth.restclient.dto.KakaoUserInfoResponse.KakaoAccount; import org.nexters.jaknaesocore.domain.auth.service.dto.AppleLoginCommand; +import org.nexters.jaknaesocore.domain.auth.service.dto.KakaoLoginCommand; import org.nexters.jaknaesocore.domain.member.model.Member; import org.nexters.jaknaesocore.domain.member.repository.MemberRepository; import org.nexters.jaknaesocore.domain.socialaccount.model.SocialAccount; @@ -30,6 +38,23 @@ void tearDown() { memberRepository.deleteAllInBatch(); } + private SocialAccount createSocialAccount( + final Member member, final String oauthId, final SocialProvider socialProvider) { + return SocialAccountFixture.builder() + .member(member) + .oauthId(oauthId) + .socialProvider(socialProvider) + .build(); + } + + private AppleLoginCommand createAppleLoginCommand(String idToken, String name) { + return new AppleLoginCommand(idToken, name); + } + + private KakaoLoginCommand createKakaoLoginCommand(String authorizationCode, String redirectUri) { + return new KakaoLoginCommand(authorizationCode, redirectUri); + } + @Nested @DisplayName("appleLogin 메소드는 ") class appleLogin { @@ -45,7 +70,10 @@ void shouldSignIn() { "eyJraWQiOiJBSURPRkZDTzJDM05EUVBGQUJDVEFDT1VDU1ZZQUdTR09ZUEJNVU5KS1FEUVFBQUEyTVE2USIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiIwMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIiLCJhdF9oYXNoIjoiUlZfdkZKZnFhdDBGMmFZdHVQUlNlZyIsImF1ZCI6ImNvbS5leGFtcGxlLmFwcGxpbmUud2ViIiwiYXV0aF90aW1lIjoxNjA1MzcxNTU5LCJpc3MiOiJodHRwczovL2lkLmFwcGxlLmNvbSIsImV4cCI6MTYwNTM3NTE1OSwiaWF0IjoxNjA1MzcxNTU5LCJub25jZSI6Ijc5NDc5NTg4MzA1NDQ2OTQzNiIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.VkmD8KcTtCmN65DPwhAPoOeRuXmsLqnm1z8pWa_qHG3xD2LBJgj9YOZPUKseOlfrOz5e5JgIR1qPdWiL2QFuyjCQZ0PSG0hV1xtQ_yYbVHeqLaID0AgcV8Hxldg9hFvF_jvM8G_mo0S9-D8gOR4kbQ"; sut.appleLogin(createAppleLoginCommand(idToken, "홍길동")); - then(memberRepository.findAll()).hasSize(1); + then(memberRepository.findAll()) + .hasSize(1) + .extracting("name", "email") + .containsExactly(tuple("홍길동", "test@example.com")); then(socialAccountRepository.findAll()) .hasSize(1) .extracting("oauthId", "socialProvider") @@ -60,7 +88,7 @@ class whenMemberFound { @Test @DisplayName("토큰을 발행한다.") void shouldIssueToken() { - final Member member = memberRepository.save(Member.create()); + final Member member = memberRepository.save(Member.create("홍길동", "hong-gildong@naver.com")); final String oauthId = "001234567890123456789012"; socialAccountRepository.save(createSocialAccount(member, oauthId, SocialProvider.APPLE)); @@ -74,16 +102,58 @@ void shouldIssueToken() { } } - private SocialAccount createSocialAccount( - final Member member, final String oauthId, final SocialProvider socialProvider) { - return SocialAccountFixture.builder() - .member(member) - .oauthId(oauthId) - .socialProvider(socialProvider) - .build(); - } + @Nested + @DisplayName("kakaoLogin 메소드는") + class kakaoLogin { + + @BeforeEach + void setUp() { + given(kakaoAuthClient.requestToken(any())) + .willReturn(new KakaoTokenResponse("bearer", "access token", 1, "refresh token", 1)); + given(kakaoClient.requestUserInfo("Bearer access token")) + .willReturn(new KakaoUserInfoResponse(1L, new KakaoAccount("홍길동", "test@example.com"))); + } - private AppleLoginCommand createAppleLoginCommand(String idToken, String name) { - return new AppleLoginCommand(idToken, name); + @Nested + @DisplayName("id값과 일치하는 유저를 찾지 못하면") + class whenMemberNotFound { + + @Test + @DisplayName("회원가입을 진행한다.") + void shouldSignIn() { + sut.kakaoLogin(createKakaoLoginCommand("카카오 인가 코드", "카카오 로그인 리다이렉트 URI")); + + assertAll( + () -> + then(memberRepository.findAll()) + .hasSize(1) + .extracting("name", "email") + .containsExactly(tuple("홍길동", "test@example.com")), + () -> + then(socialAccountRepository.findAll()) + .hasSize(1) + .extracting("oauthId", "socialProvider") + .containsExactlyInAnyOrder(tuple("1", SocialProvider.KAKAO))); + } + } + + @Nested + @DisplayName("id값과 일치하는 유저를 찾으면") + class whenMemberFound { + + @Test + @DisplayName("로그인을 진행한다.") + void shouldSignIn() { + final Member member = memberRepository.save(Member.create("홍길동", "test@example.com")); + final String oauthId = "1"; + socialAccountRepository.save(createSocialAccount(member, oauthId, SocialProvider.KAKAO)); + + sut.kakaoLogin(createKakaoLoginCommand("카카오 인가 코드", "카카오 로그인 리다이렉트 URI")); + + assertAll( + () -> then(memberRepository.findAll()).hasSize(1), + () -> then(socialAccountRepository.findAll()).hasSize(1)); + } + } } } diff --git a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceTest.java b/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceTest.java deleted file mode 100644 index 46aab3cb..00000000 --- a/jaknaeso-core/src/test/java/org/nexters/jaknaesocore/domain/auth/service/OauthServiceTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.nexters.jaknaesocore.domain.auth.service; - -import static org.assertj.core.api.BDDAssertions.then; -import static org.assertj.core.api.BDDAssertions.thenThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.nexters.jaknaesocore.domain.socialaccount.model.SocialProvider.KAKAO; - -import java.util.Optional; -import org.junit.jupiter.api.Test; -import org.nexters.jaknaesocore.common.support.ServiceTest; -import org.nexters.jaknaesocore.domain.auth.restclient.dto.KakaoTokenResponse; -import org.nexters.jaknaesocore.domain.auth.restclient.dto.KakaoUserInfoResponse; -import org.nexters.jaknaesocore.domain.auth.restclient.dto.KakaoUserInfoResponse.KakaoAccount; -import org.nexters.jaknaesocore.domain.auth.service.dto.KakaoLoginCommand; -import org.nexters.jaknaesocore.domain.member.model.Member; -import org.nexters.jaknaesocore.domain.socialaccount.model.SocialAccount; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestClientException; - -class OauthServiceTest extends ServiceTest { - - static final String BEARER_PREFIX = "Bearer "; - - @Autowired OauthService oauthService; - - @Test - void 처음_카카오_계정으로_로그인하면_소셜_계정과_멤버를_생성하고_생성한_멤버_아이디를_반환한다() { - Long oauthId = 1L; - Member newMember = createMemberWithId(1L); - SocialAccount newAccount = SocialAccount.kakaoSignup(oauthId.toString(), newMember); - - KakaoLoginCommand command = new KakaoLoginCommand("authorization code", "redirect-uri"); - - given(kakaoAuthClient.requestToken(makeKakaoTokenRequestParams(command.authorizationCode()))) - .willReturn(new KakaoTokenResponse("bearer", "access token", 1, "refresh token", 1)); - given(kakaoClient.requestUserInfo(BEARER_PREFIX + "access token")) - .willReturn(new KakaoUserInfoResponse(oauthId, new KakaoAccount("name", "email"))); - given( - socialAccountRepository.findByOauthIdAndSocialProviderAndDeletedAtIsNull( - oauthId.toString(), KAKAO)) - .willReturn(Optional.empty()); - given(memberRepository.save(any(Member.class))).willReturn(newMember); - given(socialAccountRepository.save(newAccount)).willReturn(newAccount); - - then(oauthService.kakaoLogin(command)).isEqualTo(1L); - } - - @Test - void 카카오_계정으로_로그인하면_소셜_계정으로_멤버를_조회하고_조회한_멤버_아이디를_반환한다() { - Long oauthId = 1L; - Member member = createMemberWithId(1L); - SocialAccount account = createSocialAccountWithOauthIdAndMember(oauthId.toString(), member); - - KakaoLoginCommand command = new KakaoLoginCommand("authorization code", "redirect-uri"); - - given(kakaoAuthClient.requestToken(makeKakaoTokenRequestParams(command.authorizationCode()))) - .willReturn(new KakaoTokenResponse("bearer", "access token", 1, "refresh token", 1)); - given(kakaoClient.requestUserInfo(BEARER_PREFIX + "access token")) - .willReturn(new KakaoUserInfoResponse(oauthId, new KakaoAccount("name", "email"))); - given( - socialAccountRepository.findByOauthIdAndSocialProviderAndDeletedAtIsNull( - oauthId.toString(), KAKAO)) - .willReturn(Optional.of(account)); - - then(oauthService.kakaoLogin(command)).isEqualTo(1L); - } - - @Test - void 카카오_토큰_API_호출에_실패하면_RestClientException를_반환한다() { - KakaoLoginCommand command = new KakaoLoginCommand("authorization code", "redirect-uri"); - - given(kakaoAuthClient.requestToken(makeKakaoTokenRequestParams(command.authorizationCode()))) - .willThrow(RestClientException.class); - - thenThrownBy(() -> oauthService.kakaoLogin(command)).isInstanceOf(RestClientException.class); - } - - @Test - void 카카오_사용자_정보_API_호출에_실패하면_RestClientException를_반환한다() { - KakaoLoginCommand command = new KakaoLoginCommand("authorization code", "redirect-uri"); - - given(kakaoAuthClient.requestToken(makeKakaoTokenRequestParams(command.authorizationCode()))) - .willReturn(new KakaoTokenResponse("bearer", "access token", 1, "refresh token", 1)); - given(kakaoClient.requestUserInfo(BEARER_PREFIX + "access token")) - .willThrow(RestClientException.class); - - thenThrownBy(() -> oauthService.kakaoLogin(command)).isInstanceOf(RestClientException.class); - } - - private Member createMemberWithId(final Long id) { - Member member = Member.create("name", "email"); - ReflectionTestUtils.setField(member, "id", id); - return member; - } - - private SocialAccount createSocialAccountWithOauthIdAndMember( - final String oauthId, final Member member) { - SocialAccount account = SocialAccount.kakaoSignup(oauthId, member); - ReflectionTestUtils.setField(account, "member", member); - return account; - } - - private MultiValueMap makeKakaoTokenRequestParams( - final String authorizationCode) { - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("grant_type", "authorization_code"); - params.add("client_id", "client-id"); - params.add("client_secret", "client-secret"); - params.add("code", authorizationCode); - params.add("redirect_uri", "redirect-uri"); - return params; - } -} From 512e98f8865068fc7fbd1b14393eb59c7fe6a09c Mon Sep 17 00:00:00 2001 From: kimyu0218 Date: Tue, 4 Feb 2025 01:22:23 +0900 Subject: [PATCH 5/7] =?UTF-8?q?[#37]=20chore:=20=EB=A9=A4=EB=B2=84=20?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=20ddl=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../037/001_alter_table_member_add_name_col_add_email_col.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 jaknaeso-core/src/main/resources/sql/037/001_alter_table_member_add_name_col_add_email_col.sql diff --git a/jaknaeso-core/src/main/resources/sql/037/001_alter_table_member_add_name_col_add_email_col.sql b/jaknaeso-core/src/main/resources/sql/037/001_alter_table_member_add_name_col_add_email_col.sql new file mode 100644 index 00000000..64f2a78c --- /dev/null +++ b/jaknaeso-core/src/main/resources/sql/037/001_alter_table_member_add_name_col_add_email_col.sql @@ -0,0 +1,3 @@ +alter table member + add name varchar(60) + add email varchar(255); \ No newline at end of file From e6f129df1d257203dbef8c45029de450e7382b6e Mon Sep 17 00:00:00 2001 From: kimyu0218 Date: Tue, 4 Feb 2025 21:22:36 +0900 Subject: [PATCH 6/7] =?UTF-8?q?[#37]=20fix:=20=EC=95=A0=ED=94=8C=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 애플은 최초 로그인할 때만 name 값을 전달하므로 로그인 시엔 email만 업데이트 한다 --- .../domain/auth/service/OauthService.java | 60 ++++++++++--------- .../domain/member/model/Member.java | 4 ++ 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java index 8d5022a1..3612b5f5 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java @@ -50,16 +50,18 @@ public Long kakaoLogin(final KakaoLoginCommand command) { final KakaoUserInfoResponse userInfo = getKakaoUserInfo(token.accessToken()); final String oauthId = userInfo.id().toString(); - final Member member = findMemberWithSocialProvider(oauthId, SocialProvider.KAKAO); - if (member == null) { - final Member newMember = - memberRepository.save( - Member.create(userInfo.kakaoAccount().name(), userInfo.kakaoAccount().email())); - socialAccountRepository.save(SocialAccount.kakaoSignup(oauthId, newMember)); - return newMember.getId(); - } - member.updateUserInfo(userInfo.kakaoAccount().name(), userInfo.kakaoAccount().email()); - return member.getId(); + return socialAccountRepository + .findByOauthIdAndSocialProviderAndDeletedAtIsNull(oauthId, SocialProvider.KAKAO) + .map(SocialAccount::getMember) + .map( + it -> { + it.updateUserInfo(userInfo.kakaoAccount().name(), userInfo.kakaoAccount().email()); + return it.getId(); + }) + .orElseGet( + () -> + kakaoSignUp( + oauthId, userInfo.kakaoAccount().name(), userInfo.kakaoAccount().email())); } private KakaoUserInfoResponse getKakaoUserInfo(final String accessToken) { @@ -77,13 +79,10 @@ private KakaoTokenResponse getKakaoToken( return kakaoAuthClient.requestToken(params); } - private Member findMemberWithSocialProvider( - final String oauthId, final SocialProvider socialProvider) { - return socialAccountRepository - .findByOauthIdAndSocialProviderAndDeletedAtIsNull(oauthId, socialProvider) - .map(SocialAccount::getMember) - .filter(member -> member.getDeletedAt() == null) - .orElse(null); + private Long kakaoSignUp(final String oauthId, final String name, final String email) { + final Member member = memberRepository.save(Member.create(name, email)); + socialAccountRepository.save(SocialAccount.kakaoSignup(oauthId, member)); + return member.getId(); } @Transactional @@ -92,16 +91,17 @@ public Long appleLogin(final AppleLoginCommand command) { final String jwtClaims = appleIdToken.decodePayload(); final AppleAuthorization authorization = decodeAppleIdTokenPayload(jwtClaims); - final Member member = - findMemberWithSocialProvider(authorization.getSub(), SocialProvider.APPLE); - if (member == null) { - final Member newMember = - memberRepository.save(Member.create(command.name(), authorization.getEmail())); - socialAccountRepository.save(SocialAccount.appleSignUp(authorization.getSub(), newMember)); - return newMember.getId(); - } - member.updateUserInfo(command.name(), authorization.getEmail()); - return member.getId(); + return socialAccountRepository + .findByOauthIdAndSocialProviderAndDeletedAtIsNull( + authorization.getSub(), SocialProvider.APPLE) + .map(SocialAccount::getMember) + .map( + it -> { + it.updateUserInfo(authorization.getEmail()); + return it.getId(); + }) + .orElseGet( + () -> appleSignup(authorization.getSub(), command.name(), authorization.getEmail())); } private AppleAuthorization decodeAppleIdTokenPayload(final String appleJwtClaims) { @@ -113,4 +113,10 @@ private AppleAuthorization decodeAppleIdTokenPayload(final String appleJwtClaims throw CustomException.INVALID_APPLE_ID_TOKEN; } } + + private Long appleSignup(final String oauthId, final String name, final String email) { + final Member member = memberRepository.save(Member.create(name, email)); + socialAccountRepository.save(SocialAccount.appleSignUp(oauthId, member)); + return member.getId(); + } } diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java index db4b8145..9e2c6271 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java @@ -39,6 +39,10 @@ public void softDelete() { super.softDelete(); } + public void updateUserInfo(final String email) { + this.email = email; + } + public void updateUserInfo(final String name, final String email) { this.name = name; this.email = email; From 13560d8b53b3937bf2c8b9ec0aa3c7f4aa78cdbb Mon Sep 17 00:00:00 2001 From: kimyu0218 Date: Tue, 4 Feb 2025 21:33:55 +0900 Subject: [PATCH 7/7] =?UTF-8?q?[#37]=20fix:=20=EC=95=A0=ED=94=8C=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=EC=9D=80=20=EC=B5=9C=EC=B4=88=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=ED=95=A0=20=EB=95=8C=EB=A7=8C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95=EB=B3=B4=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jaknaesocore/domain/auth/service/OauthService.java | 7 +------ .../nexters/jaknaesocore/domain/member/model/Member.java | 4 ---- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java index 3612b5f5..08aad9f5 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/auth/service/OauthService.java @@ -94,12 +94,7 @@ public Long appleLogin(final AppleLoginCommand command) { return socialAccountRepository .findByOauthIdAndSocialProviderAndDeletedAtIsNull( authorization.getSub(), SocialProvider.APPLE) - .map(SocialAccount::getMember) - .map( - it -> { - it.updateUserInfo(authorization.getEmail()); - return it.getId(); - }) + .map(account -> account.getMember().getId()) .orElseGet( () -> appleSignup(authorization.getSub(), command.name(), authorization.getEmail())); } diff --git a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java index 9e2c6271..db4b8145 100644 --- a/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java +++ b/jaknaeso-core/src/main/java/org/nexters/jaknaesocore/domain/member/model/Member.java @@ -39,10 +39,6 @@ public void softDelete() { super.softDelete(); } - public void updateUserInfo(final String email) { - this.email = email; - } - public void updateUserInfo(final String name, final String email) { this.name = name; this.email = email;