Skip to content

Commit 2824185

Browse files
authored
[Fix] 회원가입 API 에서 이메일을 이용하도록 수정
2 parents cea611d + 2be40ac commit 2824185

File tree

18 files changed

+145
-75
lines changed

18 files changed

+145
-75
lines changed

src/main/java/eatda/client/oauth/OauthMemberInformation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66

77
@JsonDeserialize(using = OauthMemberInformationDeserializer.class)
88
@JsonIgnoreProperties(ignoreUnknown = true)
9-
public record OauthMemberInformation(long socialId, String nickname) {
9+
public record OauthMemberInformation(long socialId, String email, String nickname) {
1010

1111
public Member toMember() {
12-
return new Member(Long.toString(socialId), nickname);
12+
return new Member(Long.toString(socialId), email, nickname);
1313
}
1414
}
1515

src/main/java/eatda/client/oauth/OauthMemberInformationDeserializer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@ public OauthMemberInformation deserialize(JsonParser jsonParser,
1414
JsonNode root = jsonParser.getCodec().readTree(jsonParser);
1515

1616
long id = root.path("id").asLong();
17+
String email = root
18+
.path("kakao_account")
19+
.path("email")
20+
.asText(null);
1721
String nickname = root
1822
.path("kakao_account")
1923
.path("profile")
2024
.path("nickname")
2125
.asText(null);
22-
return new OauthMemberInformation(id, nickname);
26+
return new OauthMemberInformation(id, email, nickname);
2327
}
2428
}

src/main/java/eatda/controller/member/MemberResponse.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import eatda.domain.member.Member;
44

55
public record MemberResponse(long id,
6+
String email,
67
boolean isSignUp,
78
String nickname,
89
String phoneNumber,
@@ -11,6 +12,7 @@ public record MemberResponse(long id,
1112

1213
public MemberResponse(Member member, boolean isSignUp) {
1314
this(member.getId(),
15+
member.getEmail(),
1416
isSignUp,
1517
member.getNickname(),
1618
member.getPhoneNumber(),

src/main/java/eatda/domain/member/Member.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,18 @@
2020
@NoArgsConstructor(access = AccessLevel.PROTECTED)
2121
public class Member {
2222

23+
private static final String EMAIL_REGEX = "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$";
24+
2325
@Id
2426
@GeneratedValue(strategy = GenerationType.IDENTITY)
2527
private Long id;
2628

2729
@Column(name = "social_id", unique = true, nullable = false)
2830
private String socialId;
2931

32+
@Column(name = "email", unique = true, nullable = false)
33+
private String email;
34+
3035
@Column(name = "nickname")
3136
private String nickname;
3237

@@ -36,19 +41,22 @@ public class Member {
3641
@Column(name = "opt_in_marketing")
3742
private Boolean optInMarketing;
3843

39-
public Member(String socialId, String nickname) {
44+
public Member(String socialId, String email, String nickname) {
4045
validateSocialId(socialId);
46+
validateEmail(email);
4147
this.socialId = socialId;
48+
this.email = email;
4249
this.nickname = nickname;
4350
}
4451

4552
public Member(
4653
String socialId,
54+
String email,
4755
String nickname,
4856
String mobilePhoneNumber,
4957
Boolean optInMarketing
5058
) {
51-
this(socialId, nickname);
59+
this(socialId, email, nickname);
5260
validateOptInMarketing(optInMarketing);
5361
this.mobilePhoneNumber = new MobilePhoneNumber(mobilePhoneNumber);
5462
this.optInMarketing = optInMarketing;
@@ -67,6 +75,12 @@ private void validateSocialId(String socialId) {
6775
}
6876
}
6977

78+
private void validateEmail(String email) {
79+
if (email == null || !email.matches(EMAIL_REGEX)) {
80+
throw new BusinessException(BusinessErrorCode.INVALID_EMAIL);
81+
}
82+
}
83+
7084
private void validateOptInMarketing(Boolean optInMarketing) {
7185
if (optInMarketing == null) {
7286
throw new BusinessException(BusinessErrorCode.INVALID_MARKETING_CONSENT);

src/main/java/eatda/exception/BusinessErrorCode.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public enum BusinessErrorCode {
1414
INVALID_SOCIAL_ID("MEM005", "소셜 ID는 필수입니다."),
1515
DUPLICATE_NICKNAME("MEM006", "이미 사용 중인 닉네임입니다."),
1616
DUPLICATE_PHONE_NUMBER("MEM007", "이미 사용 중인 전화번호입니다."),
17+
INVALID_EMAIL("MEM008", "유효하지 않은 이메일 형식입니다."),
18+
1719

1820
// Store
1921
INVALID_STORE_CATEGORY("STO001", "유효하지 않은 매장 카테고리입니다."),
@@ -54,7 +56,8 @@ public enum BusinessErrorCode {
5456
INVALID_IMAGE_TYPE("CLIENT010", "지원하지 않는 이미지 형식입니다.", HttpStatus.BAD_REQUEST),
5557
FILE_UPLOAD_FAILED("SERVER002", "파일 업로드에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
5658
FILE_URL_GENERATION_FAILED("SERVER003", "파일 URL 생성에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
57-
PRESIGNED_URL_GENERATION_FAILED("SERVER004", "Presigned URL 생성에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
59+
PRESIGNED_URL_GENERATION_FAILED("SERVER004", "Presigned URL 생성에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR),
60+
;
5861

5962
private final String code;
6063
private final String message;

src/main/resources/db/migration/V1__init.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ CREATE TABLE `store`
1818
CREATE TABLE `member`
1919
(
2020
`id` BIGINT NOT NULL AUTO_INCREMENT,
21+
`email` VARCHAR(255) NOT NULL,
2122
`social_id` VARCHAR(255) NOT NULL,
2223
`nickname` VARCHAR(255) NULL,
2324
`phone_number` VARCHAR(255) NULL COMMENT '(`-` 없이))',

src/main/resources/db/seed/dev/V2__dev_init_data.sql

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
INSERT INTO member (id, social_id, nickname, phone_number, opt_in_marketing)
2-
VALUES (1, 123456789, '이승로', '01012345678', true),
3-
(2, 987654321, '이충안', '01087654321', false),
4-
(3, 456789123, '장수빈', '01045678912', true),
5-
(4, 789123456, '서준환', '01078912345', true),
6-
(5, 321251287, '신민선', '01034574568', false),
7-
(6, 324569987, '박희수', '01043609998', false),
8-
(7, 323487985, '하아얀', '01065083298', false);
1+
INSERT INTO member (id, social_id, email, nickname, phone_number, opt_in_marketing)
2+
VALUES (1, 123456789, '[email protected]', '이승로', '01012345678', true),
3+
(2, 987654321, '[email protected]', '이충안', '01087654321', false),
4+
(3, 456789123, '[email protected]', '장수빈', '01045678912', true),
5+
(4, 789123456, '[email protected]', '서준환', '01078912345', true),
6+
(5, 321251287, '[email protected]', '신민선', '01034574568', false),
7+
(6, 324569987, '[email protected]', '박희수', '01043609998', false),
8+
(7, 323487985, '[email protected]', '하아얀', '01065083298', false);
99

1010
INSERT INTO store (id, name, category, latitude, longitude,
1111
address, phone_number, image_url, open_time, close_time,

src/main/resources/db/seed/local/V2__local_init_data.sql

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
INSERT INTO member (id, social_id, nickname, phone_number, opt_in_marketing)
2-
VALUES (1, 123456789, '이승로', '01012345678', true),
3-
(3, 456789123, '장수빈', '01045678912', true),
4-
(4, 789123456, '서준환', '01078912345', true),
5-
(5, 321251287, '신민선', '01034574568', false),
6-
(6, 324569987, '박희수', '01043609998', false),
7-
(7, 323487985, '하아얀', '01065083298', false);
1+
INSERT INTO member (id, social_id, email, nickname, phone_number, opt_in_marketing)
2+
VALUES (1, 123456789, '[email protected]', '이승로', '01012345678', true),
3+
(3, 456789123, '[email protected]', '장수빈', '01045678912', true),
4+
(4, 789123456, '[email protected]', '서준환', '01078912345', true),
5+
(5, 321251287, '[email protected]', '신민선', '01034574568', false),
6+
(6, 324569987, '[email protected]', '박희수', '01043609998', false),
7+
(7, 323487985, '[email protected]', '하아얀', '01065083298', false);
88

99
INSERT INTO store (id, name, category, latitude, longitude,
1010
address, phone_number, image_url, open_time, close_time,

src/test/java/eatda/client/oauth/OauthClientTest.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,22 @@ class RequestMemberInformation {
117117
void Oauth_회원정보를_요청할_수_있다() {
118118
setMockServer(HttpMethod.GET, "https://kapi.kakao.com/v2/user/me", """
119119
{
120-
"id":123456789,
121-
"connected_at": "2022-04-11T01:45:28Z",
120+
"id": 123456789,
121+
"connected_at": "2025-07-08T13:31:28Z",
122+
"properties": {
123+
"nickname": "이충안"
124+
},
122125
"kakao_account": {
123126
"profile_nickname_needs_agreement": false,
124-
"profile_image_needs_agreement": false,
125127
"profile": {
126-
"nickname": "홍길동",
128+
"nickname": "이충안",
127129
"is_default_nickname": false
128-
}
130+
},
131+
"has_email": true,
132+
"email_needs_agreement": false,
133+
"is_email_valid": true,
134+
"is_email_verified": true,
135+
"email": "[email protected]"
129136
}
130137
}""");
131138
OauthToken token = new OauthToken("test-access-token");
@@ -134,7 +141,8 @@ class RequestMemberInformation {
134141

135142
assertAll(
136143
() -> assertThat(memberInfo.socialId()).isEqualTo(123456789L),
137-
() -> assertThat(memberInfo.nickname()).isEqualTo("홍길동")
144+
() -> assertThat(memberInfo.email()).isEqualTo("[email protected]"),
145+
() -> assertThat(memberInfo.nickname()).isEqualTo("이충안")
138146
);
139147
}
140148
}

src/test/java/eatda/controller/BaseControllerTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class BaseControllerTest {
3737

3838
private static final OauthToken DEFAULT_OAUTH_TOKEN = new OauthToken("oauth-access-token");
3939
private static final OauthMemberInformation DEFAULT_OAUTH_MEMBER_INFO =
40-
new OauthMemberInformation(314159248183772L, "nickname");
40+
new OauthMemberInformation(314159248183772L, "[email protected]", "nickname");
4141

4242
@Autowired
4343
protected MemberGenerator memberGenerator;
@@ -87,12 +87,14 @@ protected final RequestSpecification given() {
8787
}
8888

8989
protected final String accessToken() {
90-
Member member = memberGenerator.generate(Long.toString(DEFAULT_OAUTH_MEMBER_INFO.socialId()));
90+
Member member = memberGenerator.generateByEmail(Long.toString(DEFAULT_OAUTH_MEMBER_INFO.socialId()),
91+
9192
return jwtManager.issueAccessToken(member.getId());
9293
}
9394

9495
protected final String refreshToken() {
95-
Member member = memberGenerator.generate(Long.toString(DEFAULT_OAUTH_MEMBER_INFO.socialId()));
96+
Member member = memberGenerator.generateByEmail(Long.toString(DEFAULT_OAUTH_MEMBER_INFO.socialId()),
97+
9698
return jwtManager.issueRefreshToken(member.getId());
9799
}
98100

0 commit comments

Comments
 (0)