Skip to content

Commit 8745c01

Browse files
committed
refactor: 로그인 관련 API 리팩토링 실시
1 parent f918f8a commit 8745c01

File tree

8 files changed

+114
-49
lines changed

8 files changed

+114
-49
lines changed

src/main/java/eatda/controller/auth/AuthController.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package eatda.controller.auth;
22

3+
import eatda.client.oauth.OauthMemberInformation;
34
import eatda.controller.member.MemberResponse;
45
import eatda.controller.web.jwt.JwtManager;
56
import eatda.service.auth.AuthService;
7+
import eatda.service.auth.OauthService;
68
import java.net.URI;
79
import lombok.RequiredArgsConstructor;
810
import org.springframework.http.HttpHeaders;
@@ -18,12 +20,13 @@
1820
@RequiredArgsConstructor
1921
public class AuthController {
2022

21-
private final JwtManager jwtManager;
2223
private final AuthService authService;
24+
private final OauthService oauthService;
25+
private final JwtManager jwtManager;
2326

2427
@GetMapping("/api/auth/login/oauth")
2528
public ResponseEntity<Void> redirectOauthLoginPage(@RequestHeader(HttpHeaders.REFERER) String origin) {
26-
URI oauthLoginUrl = authService.getOauthLoginUrl(origin);
29+
URI oauthLoginUrl = oauthService.getOauthLoginUrl(origin);
2730

2831
return ResponseEntity
2932
.status(HttpStatus.FOUND)
@@ -33,7 +36,9 @@ public ResponseEntity<Void> redirectOauthLoginPage(@RequestHeader(HttpHeaders.RE
3336

3437
@PostMapping("/api/auth/login")
3538
public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest request) {
36-
MemberResponse member = authService.login(request);
39+
OauthMemberInformation oauthInformation = oauthService.getOAuthInformation(request.code(), request.origin());
40+
MemberResponse member = authService.login(oauthInformation);
41+
3742
TokenResponse token = new TokenResponse(
3843
jwtManager.issueAccessToken(member.id()),
3944
jwtManager.issueRefreshToken(member.id()));

src/main/java/eatda/service/auth/AuthService.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
package eatda.service.auth;
22

3-
import eatda.client.oauth.OauthClient;
43
import eatda.client.oauth.OauthMemberInformation;
5-
import eatda.client.oauth.OauthToken;
6-
import eatda.controller.auth.LoginRequest;
74
import eatda.controller.member.MemberResponse;
85
import eatda.domain.member.Member;
96
import eatda.repository.member.MemberRepository;
10-
import java.net.URI;
117
import java.util.Optional;
128
import lombok.RequiredArgsConstructor;
139
import lombok.extern.slf4j.Slf4j;
@@ -19,18 +15,10 @@
1915
@RequiredArgsConstructor
2016
public class AuthService {
2117

22-
private final OauthClient oauthClient;
2318
private final MemberRepository memberRepository;
2419

25-
public URI getOauthLoginUrl(String origin) {
26-
return oauthClient.getOauthLoginUrl(origin);
27-
}
28-
2920
@Transactional
30-
public MemberResponse login(LoginRequest request) {
31-
OauthToken oauthToken = oauthClient.requestOauthToken(request.code(), request.origin());
32-
OauthMemberInformation oauthInformation = oauthClient.requestMemberInformation(oauthToken);
33-
21+
public MemberResponse login(OauthMemberInformation oauthInformation) {
3422
Optional<Member> optionalMember = memberRepository.findBySocialId(Long.toString(oauthInformation.socialId()));
3523
boolean isFirstLogin = optionalMember.isEmpty();
3624
return new MemberResponse(
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package eatda.service.auth;
2+
3+
import eatda.client.oauth.OauthClient;
4+
import eatda.client.oauth.OauthMemberInformation;
5+
import eatda.client.oauth.OauthToken;
6+
import java.net.URI;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Service;
9+
10+
@Service
11+
@RequiredArgsConstructor
12+
public class OauthService {
13+
14+
private final OauthClient oauthClient;
15+
16+
public URI getOauthLoginUrl(String origin) {
17+
return oauthClient.getOauthLoginUrl(origin);
18+
}
19+
20+
public OauthMemberInformation getOAuthInformation(String code, String origin) {
21+
OauthToken oauthToken = oauthClient.requestOauthToken(code, origin);
22+
return oauthClient.requestMemberInformation(oauthToken);
23+
}
24+
}

src/test/java/eatda/document/BaseDocumentTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import eatda.exception.EtcErrorCode;
1010
import eatda.service.article.ArticleService;
1111
import eatda.service.auth.AuthService;
12+
import eatda.service.auth.OauthService;
1213
import eatda.service.cheer.CheerService;
1314
import eatda.service.image.ImageService;
1415
import eatda.service.member.MemberService;
@@ -42,6 +43,9 @@ public abstract class BaseDocumentTest {
4243
private static final String MOCKED_ACCESS_TOKEN = "access-token";
4344
private static final String MOCKED_REFRESH_TOKEN = "refresh-token";
4445

46+
@MockitoBean
47+
protected OauthService oauthService;
48+
4549
@MockitoBean
4650
protected AuthService authService;
4751

src/test/java/eatda/document/auth/AuthDocumentTest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import static org.springframework.restdocs.payload.JsonFieldType.STRING;
1111
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
1212

13+
import eatda.client.oauth.OauthMemberInformation;
1314
import eatda.controller.auth.LoginRequest;
1415
import eatda.controller.auth.ReissueRequest;
1516
import eatda.controller.member.MemberResponse;
@@ -51,7 +52,7 @@ class RedirectOauthLoginPage {
5152

5253
@Test
5354
void Oauth_로그인_페이지_리다이렉트_성공() throws URISyntaxException {
54-
doReturn(new URI("http://localhost:8080")).when(authService).getOauthLoginUrl(anyString());
55+
doReturn(new URI("http://localhost:8080")).when(oauthService).getOauthLoginUrl(anyString());
5556

5657
var document = document("auth/oauth-redirect", 302)
5758
.request(requestDocument)
@@ -70,7 +71,7 @@ class RedirectOauthLoginPage {
7071
@EnumSource(value = BusinessErrorCode.class, names = {"UNAUTHORIZED_ORIGIN"})
7172
@ParameterizedTest
7273
void Oauth_로그인_페이지_리다이렉트_실패(BusinessErrorCode errorCode) {
73-
doThrow(new BusinessException(errorCode)).when(authService).getOauthLoginUrl(anyString());
74+
doThrow(new BusinessException(errorCode)).when(oauthService).getOauthLoginUrl(anyString());
7475

7576
var document = document("auth/oauth-redirect", errorCode)
7677
.request(requestDocument)
@@ -112,8 +113,10 @@ class Login {
112113
@Test
113114
void 로그인_성공() {
114115
LoginRequest request = new LoginRequest("code", "http://localhost:3000");
116+
OauthMemberInformation oauthInformation = new OauthMemberInformation(322L, "[email protected]", "닉네임");
115117
MemberResponse response = new MemberResponse(1L, "[email protected]", true, "닉네임", null, null);
116-
doReturn(response).when(authService).login(request);
118+
doReturn(oauthInformation).when(oauthService).getOAuthInformation(anyString(), anyString());
119+
doReturn(response).when(authService).login(oauthInformation);
117120

118121
var document = document("auth/login", 201)
119122
.request(requestDocument)
@@ -132,7 +135,7 @@ class Login {
132135
@ParameterizedTest
133136
void 로그인_실패(BusinessErrorCode errorCode) {
134137
LoginRequest request = new LoginRequest("code", "http://localhost:3000");
135-
doThrow(new BusinessException(errorCode)).when(authService).login(request);
138+
doThrow(new BusinessException(errorCode)).when(oauthService).getOAuthInformation(anyString(), anyString());
136139

137140
var document = document("auth/login", errorCode)
138141
.request(requestDocument)

src/test/java/eatda/service/BaseServiceTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import eatda.repository.store.CheerRepository;
1616
import eatda.repository.store.StoreRepository;
1717
import eatda.repository.story.StoryRepository;
18+
import eatda.service.auth.AuthService;
19+
import eatda.service.auth.OauthService;
1820
import eatda.service.store.StoreSearchService;
1921
import eatda.storage.image.ExternalImageStorage;
2022
import org.junit.jupiter.api.BeforeEach;
@@ -39,6 +41,12 @@ public abstract class BaseServiceTest {
3941
@MockitoBean
4042
protected ExternalImageStorage externalImageStorage;
4143

44+
@Autowired
45+
protected OauthService oauthService;
46+
47+
@Autowired
48+
protected AuthService authService;
49+
4250
@Autowired
4351
protected MemberGenerator memberGenerator;
4452

src/test/java/eatda/service/auth/AuthServiceTest.java

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,60 +2,38 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.junit.jupiter.api.Assertions.assertAll;
5-
import static org.mockito.ArgumentMatchers.anyString;
6-
import static org.mockito.Mockito.doReturn;
75

86
import eatda.client.oauth.OauthMemberInformation;
9-
import eatda.client.oauth.OauthToken;
10-
import eatda.controller.auth.LoginRequest;
117
import eatda.controller.member.MemberResponse;
128
import eatda.service.BaseServiceTest;
13-
import java.net.URI;
14-
import java.net.URISyntaxException;
15-
import org.junit.jupiter.api.BeforeEach;
169
import org.junit.jupiter.api.Nested;
1710
import org.junit.jupiter.api.Test;
18-
import org.springframework.beans.factory.annotation.Autowired;
1911

2012
class AuthServiceTest extends BaseServiceTest {
2113

22-
private static final OauthToken DEFAULT_OAUTH_TOKEN = new OauthToken("oauth-access-token");
23-
private static final OauthMemberInformation DEFAULT_OAUTH_MEMBER_INFO =
24-
new OauthMemberInformation(123L, "[email protected]", "nickname");
25-
26-
@Autowired
27-
private AuthService authService;
28-
29-
@BeforeEach
30-
protected final void mockingClient() throws URISyntaxException {
31-
doReturn(new URI("http://localhost:8080/login/callback")).when(oauthClient).getOauthLoginUrl(anyString());
32-
doReturn(DEFAULT_OAUTH_TOKEN).when(oauthClient).requestOauthToken(anyString(), anyString());
33-
doReturn(DEFAULT_OAUTH_MEMBER_INFO).when(oauthClient).requestMemberInformation(DEFAULT_OAUTH_TOKEN);
34-
}
35-
3614
@Nested
3715
class Login {
3816

3917
@Test
4018
void 로그인_최초_요청_시_회원가입_및_로그인_처리를_한다() {
41-
LoginRequest request = new LoginRequest("auth_code", "http://localhost:3000");
19+
OauthMemberInformation oauthInformation = new OauthMemberInformation(123L, "[email protected]", "nickname");
4220

43-
MemberResponse response = authService.login(request);
21+
MemberResponse response = authService.login(oauthInformation);
4422

4523
assertAll(
4624
() -> assertThat(response.isSignUp()).isTrue(),
47-
() -> assertThat(response.nickname()).isNotNull(),
48-
() -> assertThat(response.phoneNumber()).isNull(),
49-
() -> assertThat(response.optInMarketing()).isNull()
25+
() -> assertThat(response.id()).isNotZero(),
26+
() -> assertThat(response.email()).isEqualTo("[email protected]"),
27+
() -> assertThat(response.nickname()).isEqualTo("nickname")
5028
);
5129
}
5230

5331
@Test
5432
void 로그인_최초_요청이_아닐_경우_로그인만_처리를_한다() {
5533
memberGenerator.generate("123");
56-
LoginRequest request = new LoginRequest("auth_code", "http://localhost:3000");
34+
OauthMemberInformation oauthInformation = new OauthMemberInformation(123L, "[email protected]", "nickname");
5735

58-
MemberResponse response = authService.login(request);
36+
MemberResponse response = authService.login(oauthInformation);
5937

6038
assertThat(response.isSignUp()).isFalse();
6139
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package eatda.service.auth;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.mockito.ArgumentMatchers.anyString;
5+
import static org.mockito.Mockito.doReturn;
6+
7+
import eatda.client.oauth.OauthMemberInformation;
8+
import eatda.client.oauth.OauthToken;
9+
import eatda.service.BaseServiceTest;
10+
import java.net.URI;
11+
import java.net.URISyntaxException;
12+
import org.junit.jupiter.api.BeforeEach;
13+
import org.junit.jupiter.api.Nested;
14+
import org.junit.jupiter.api.Test;
15+
16+
class OauthServiceTest extends BaseServiceTest {
17+
18+
private static final OauthToken DEFAULT_OAUTH_TOKEN = new OauthToken("oauth-access-token");
19+
private static final OauthMemberInformation DEFAULT_OAUTH_MEMBER_INFO =
20+
new OauthMemberInformation(123L, "[email protected]", "nickname");
21+
22+
@BeforeEach
23+
protected final void mockingClient() throws URISyntaxException {
24+
doReturn(new URI("http://localhost:8080/login/callback")).when(oauthClient).getOauthLoginUrl(anyString());
25+
doReturn(DEFAULT_OAUTH_TOKEN).when(oauthClient).requestOauthToken(anyString(), anyString());
26+
doReturn(DEFAULT_OAUTH_MEMBER_INFO).when(oauthClient).requestMemberInformation(DEFAULT_OAUTH_TOKEN);
27+
}
28+
29+
@Nested
30+
class GetOauthLoginUrl {
31+
32+
@Test
33+
void OAuth_로그인_URL을_반환한다() {
34+
String origin = "http://localhost:3000";
35+
36+
URI oauthLoginUrl = oauthService.getOauthLoginUrl(origin);
37+
38+
assertThat(oauthLoginUrl).isNotNull();
39+
}
40+
}
41+
42+
@Nested
43+
class RequestOauthToken {
44+
45+
@Test
46+
void OAuth_토큰을_반환한다() {
47+
String code = "oauth-code";
48+
String url = "http://localhost:3000";
49+
50+
OauthMemberInformation actual = oauthService.getOAuthInformation(code, url);
51+
52+
assertThat(actual).isEqualTo(DEFAULT_OAUTH_MEMBER_INFO);
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)