From 1f954f92ad45c740cf41c3b980415bbd72f10c71 Mon Sep 17 00:00:00 2001 From: JiwonDev Date: Tue, 7 Sep 2021 18:34:09 +0900 Subject: [PATCH] =?UTF-8?q?ADD=20LoginAccountProcessor=20-=20SessionUtils?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20-=20=EC=9D=B4=EC=8A=88=EB=A5=BC=20?= =?UTF-8?q?=EB=82=98=EB=88=A0=20=EB=8B=A4=EB=A5=B8=20PR=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/AccountTranslator.java | 8 +-- .../account/domain/LoginAccountProcessor.java | 21 ++++-- .../infrastructure/AppConfiguration.java | 6 +- .../account/presentation/AccountQueryApi.java | 2 +- .../account/presentation/SessionUtils.java | 34 --------- .../domain/LoginAccountProcessorTest.java | 70 +++++++++++++++++++ .../presentation/AccountQueryApiTest.java | 5 +- 7 files changed, 99 insertions(+), 47 deletions(-) delete mode 100644 src/main/java/com/yam/app/account/presentation/SessionUtils.java create mode 100644 src/test/java/com/yam/app/account/domain/LoginAccountProcessorTest.java diff --git a/src/main/java/com/yam/app/account/application/AccountTranslator.java b/src/main/java/com/yam/app/account/application/AccountTranslator.java index 8c93e97..f1c4016 100644 --- a/src/main/java/com/yam/app/account/application/AccountTranslator.java +++ b/src/main/java/com/yam/app/account/application/AccountTranslator.java @@ -19,12 +19,12 @@ final class AccountTranslator { return new ConfirmRegisterAccountCommand(request.getToken(), request.getEmail()); } + public LoginAccountCommand toCommand(LoginAccountRequest request) { + return new LoginAccountCommand(request.getEmail(), request.getPassword()); + } + public AccountResponse toResponse(Account entity) { return new AccountResponse(entity.getId(), entity.getEmail(), entity.getNickname()); } - - public LoginAccountCommand toCommand(LoginAccountRequest request) { - return new LoginAccountCommand(request.getEmail(), request.getPassword()); - } } diff --git a/src/main/java/com/yam/app/account/domain/LoginAccountProcessor.java b/src/main/java/com/yam/app/account/domain/LoginAccountProcessor.java index cff1310..833560a 100644 --- a/src/main/java/com/yam/app/account/domain/LoginAccountProcessor.java +++ b/src/main/java/com/yam/app/account/domain/LoginAccountProcessor.java @@ -5,14 +5,27 @@ import com.yam.app.account.application.LoginAccountCommand; public final class LoginAccountProcessor { private final AccountReader accountReader; + private final PasswordEncrypter passwordEncrypter; - public LoginAccountProcessor(AccountReader accountReader) { + public LoginAccountProcessor(AccountReader accountReader, + PasswordEncrypter passwordEncrypter) { this.accountReader = accountReader; + this.passwordEncrypter = passwordEncrypter; } - /** - * 아직 구현되지 않은 메서드. - */ public void login(LoginAccountCommand toCommand) { + var account = accountReader.findByEmail(toCommand.getEmail()); + + if (account.isEmpty()) { + throw new IllegalStateException(); + } + + final String password = account.get().getPassword(); + boolean matches = passwordEncrypter.matches(toCommand.getPassword(), + passwordEncrypter.encode(password)); + + if (!matches) { + throw new IllegalStateException(); + } } } diff --git a/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java b/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java index f6b4108..4586f68 100644 --- a/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java +++ b/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java @@ -64,7 +64,9 @@ public class AppConfiguration { } @Bean - public LoginAccountProcessor loginAccountProcessor(AccountReader accountReader){ - return new LoginAccountProcessor(accountReader); + public LoginAccountProcessor loginAccountProcessor(AccountReader accountReader, + PasswordEncrypter passwordEncrypter) { + return new LoginAccountProcessor(accountReader, passwordEncrypter); } + } diff --git a/src/main/java/com/yam/app/account/presentation/AccountQueryApi.java b/src/main/java/com/yam/app/account/presentation/AccountQueryApi.java index bc49dd0..ceb45b0 100644 --- a/src/main/java/com/yam/app/account/presentation/AccountQueryApi.java +++ b/src/main/java/com/yam/app/account/presentation/AccountQueryApi.java @@ -34,7 +34,7 @@ public final class AccountQueryApi { return new ResponseEntity<>(HttpStatus.UNAUTHORIZED); } - SessionUtils.setLoginAccountEmail(session, request.getEmail()); + // SessionUtils.setLoginAccountEmail(session, request.getEmail()); return ResponseEntity.ok().build(); } } diff --git a/src/main/java/com/yam/app/account/presentation/SessionUtils.java b/src/main/java/com/yam/app/account/presentation/SessionUtils.java deleted file mode 100644 index f04606b..0000000 --- a/src/main/java/com/yam/app/account/presentation/SessionUtils.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.yam.app.account.presentation; - -import javax.servlet.http.HttpSession; - -public final class SessionUtils { - - private static final String LOGIN_MEMBER_ID = "LOGIN_MEMBER_ID"; - - private SessionUtils() { - } - - /** - * 로그인한 회원 아이디를 세션에서 꺼낸다. - * - * @param session HttpSession - * @return 로그인한 회원의 id 또는 null - */ - public static String getLoginAccountEmail(HttpSession session) { - return (String) session.getAttribute(LOGIN_MEMBER_ID); - } - - public static void setLoginAccountEmail(HttpSession session, String id) { - session.setAttribute(LOGIN_MEMBER_ID, id); - } - - public static void clear(HttpSession session) { - session.invalidate(); - } - - public static void logoutMember(HttpSession session) { - session.removeAttribute(LOGIN_MEMBER_ID); - } - -} diff --git a/src/test/java/com/yam/app/account/domain/LoginAccountProcessorTest.java b/src/test/java/com/yam/app/account/domain/LoginAccountProcessorTest.java new file mode 100644 index 0000000..0bcef50 --- /dev/null +++ b/src/test/java/com/yam/app/account/domain/LoginAccountProcessorTest.java @@ -0,0 +1,70 @@ +package com.yam.app.account.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchThrowable; +import static org.junit.jupiter.api.DynamicTest.dynamicTest; + +import com.yam.app.account.application.LoginAccountCommand; +import com.yam.app.account.domain.PasswordEncrypterTest.PasswordEncrypterStub; +import java.util.Arrays; +import java.util.Collection; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; + +@DisplayName("회원 로그인 도메인 서비스") +class LoginAccountProcessorTest { + + @TestFactory + @DisplayName("회원 로그인 시나리오") + Collection login_success() throws Exception { + //Arrange + var accountRepository = new FakeAccountRepository(); + var accountReader = accountRepository; + var passwordEncrypter = new PasswordEncrypterStub(); + var loginAccountProcessor = new LoginAccountProcessor(accountReader, passwordEncrypter); + + var account = Account.of("hello@naver.com", "hello", "password!"); + accountRepository.save(account); + + return Arrays.asList( + dynamicTest("회원 로그인에 성공한다.", () -> { + // Arrange + var command = new LoginAccountCommand(account.getEmail(), account.getPassword()); + + // Act + var throwable = catchThrowable( + () -> loginAccountProcessor.login(command) + ); + + // Assert + assertThat(throwable).isNull(); + }), + dynamicTest("이메일이 유효하지 않은 경우 예외를 리턴한다.", () -> { + // Arrange + var command = new LoginAccountCommand("dwqko@naver.com", account.getPassword()); + + // Act + var throwable = catchThrowable( + () -> loginAccountProcessor.login(command) + ); + + // Assert + assertThat(throwable).isInstanceOf(IllegalStateException.class); + }), + dynamicTest("비밀번호가 유효하지 않은 경우 예외를 리턴한다.", () -> { + // Arrange + var command = new LoginAccountCommand(account.getEmail(), "11111111!"); + + // Act + var throwable = catchThrowable( + () -> loginAccountProcessor.login(command) + ); + + // Assert + assertThat(throwable).isInstanceOf(IllegalStateException.class); + }) + ); + } + +} diff --git a/src/test/java/com/yam/app/account/presentation/AccountQueryApiTest.java b/src/test/java/com/yam/app/account/presentation/AccountQueryApiTest.java index aaf085d..22f2e97 100644 --- a/src/test/java/com/yam/app/account/presentation/AccountQueryApiTest.java +++ b/src/test/java/com/yam/app/account/presentation/AccountQueryApiTest.java @@ -32,10 +32,11 @@ class AccountQueryApiTest { @Nested @DisplayName("Login HTTP API") - class LoginAPI { + class LoginApi { + @Test @DisplayName("정상적인 이메일과 비밀번호를 보내 로그인에 성공하고 200을 반환한다.") - void login_success() throws Exception{ + void login_success() throws Exception { //Arrange LoginAccountRequest request = new LoginAccountRequest(); request.setEmail("jiwon@gmail.com");