From 207c54120cb472d1aad8cc91266c0aeac1be7886 Mon Sep 17 00:00:00 2001 From: JiwonDev Date: Sun, 5 Sep 2021 03:37:23 +0900 Subject: [PATCH] =?UTF-8?q?Refactor=20ConfirmRegisterAccountProcessor,=20A?= =?UTF-8?q?PI=20-=20=EA=B8=B0=EC=A1=B4=20TokenVerifier=EC=97=90=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20=EA=B2=80=EC=A6=9D=EA=B3=BC=20=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=20=EC=9D=B8=EC=A6=9D=EC=B1=85=EC=9E=84=EC=9D=84=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20-=20ConfirmRegisterAccountProcessor?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=94=EA=B0=80=20-=20verify=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EA=B0=80=20void=EB=A5=BC=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD=20-?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=97=90=EC=84=9C=20MailTokenVer?= =?UTF-8?q?ifierStub=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/application/AccountFacade.java | 13 ++-- .../application/AccountTranslator.java | 5 ++ .../ConfirmRegisterAccountCommand.java | 15 ++++ .../ConfirmRegisterAccountProcessor.java | 24 +++++++ .../yam/app/account/domain/TokenVerifier.java | 17 +---- .../infrastructure/AppConfiguration.java | 13 +++- .../presentation/AccountCommandApi.java | 16 +++-- .../ConfirmRegisterAccountRequest.java | 16 +++++ .../java/com/yam/app/common/StringUtils.java | 17 ----- .../mapper/xml/AccountCommandMapper.xml | 1 - .../ConfirmRegisterAccountProcessorTest.java | 72 +++++++++++++++++++ .../account/domain/FakeAccountRepository.java | 2 - .../app/account/domain/TokenVerifierTest.java | 70 ++---------------- .../MybatisAccountRepositoryTest.java | 2 +- .../presentation/AccountCommandApiTests.java | 35 +++++---- 15 files changed, 188 insertions(+), 130 deletions(-) create mode 100644 src/main/java/com/yam/app/account/application/ConfirmRegisterAccountCommand.java create mode 100644 src/main/java/com/yam/app/account/domain/ConfirmRegisterAccountProcessor.java create mode 100644 src/main/java/com/yam/app/account/presentation/ConfirmRegisterAccountRequest.java delete mode 100644 src/main/java/com/yam/app/common/StringUtils.java create mode 100644 src/test/java/com/yam/app/account/domain/ConfirmRegisterAccountProcessorTest.java diff --git a/src/main/java/com/yam/app/account/application/AccountFacade.java b/src/main/java/com/yam/app/account/application/AccountFacade.java index 4a0cc22..5e4ff09 100644 --- a/src/main/java/com/yam/app/account/application/AccountFacade.java +++ b/src/main/java/com/yam/app/account/application/AccountFacade.java @@ -1,9 +1,10 @@ package com.yam.app.account.application; +import com.yam.app.account.domain.ConfirmRegisterAccountProcessor; import com.yam.app.account.domain.RegisterAccountEvent; import com.yam.app.account.domain.RegisterAccountProcessor; -import com.yam.app.account.domain.TokenVerifier; import com.yam.app.account.presentation.AccountResponse; +import com.yam.app.account.presentation.ConfirmRegisterAccountRequest; import com.yam.app.account.presentation.RegisterAccountRequest; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; @@ -15,15 +16,15 @@ public class AccountFacade { private final RegisterAccountProcessor processor; private final AccountTranslator translator; private final ApplicationEventPublisher publisher; - private final TokenVerifier tokenVerifier; + private final ConfirmRegisterAccountProcessor confirmRegisterProcessor; public AccountFacade(RegisterAccountProcessor processor, AccountTranslator translator, ApplicationEventPublisher publisher, - TokenVerifier tokenVerifier) { + ConfirmRegisterAccountProcessor confirmRegisterProcessor) { this.processor = processor; this.translator = translator; this.publisher = publisher; - this.tokenVerifier = tokenVerifier; + this.confirmRegisterProcessor = confirmRegisterProcessor; } @Transactional @@ -33,7 +34,7 @@ public class AccountFacade { return translator.toResponse(entity); } - public boolean verify(String token, String email) { - return tokenVerifier.verify(token, email); + public void registerConfirm(ConfirmRegisterAccountRequest request) { + confirmRegisterProcessor.registerConfirm(translator.toCommand(request)); } } 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 fcce4d8..5807e3b 100644 --- a/src/main/java/com/yam/app/account/application/AccountTranslator.java +++ b/src/main/java/com/yam/app/account/application/AccountTranslator.java @@ -2,6 +2,7 @@ package com.yam.app.account.application; import com.yam.app.account.domain.Account; import com.yam.app.account.presentation.AccountResponse; +import com.yam.app.account.presentation.ConfirmRegisterAccountRequest; import com.yam.app.account.presentation.RegisterAccountRequest; import org.springframework.stereotype.Component; @@ -13,6 +14,10 @@ final class AccountTranslator { request.getPassword()); } + public ConfirmRegisterAccountCommand toCommand(ConfirmRegisterAccountRequest request) { + return new ConfirmRegisterAccountCommand(request.getToken(), request.getEmail()); + } + public AccountResponse toResponse(Account entity) { return new AccountResponse(entity.getId(), entity.getEmail(), entity.getNickname()); diff --git a/src/main/java/com/yam/app/account/application/ConfirmRegisterAccountCommand.java b/src/main/java/com/yam/app/account/application/ConfirmRegisterAccountCommand.java new file mode 100644 index 0000000..12ff29e --- /dev/null +++ b/src/main/java/com/yam/app/account/application/ConfirmRegisterAccountCommand.java @@ -0,0 +1,15 @@ +package com.yam.app.account.application; + +import lombok.Getter; + +@Getter +public class ConfirmRegisterAccountCommand { + + private final String token; + private final String email; + + public ConfirmRegisterAccountCommand(String token, String email) { + this.token = token; + this.email = email; + } +} diff --git a/src/main/java/com/yam/app/account/domain/ConfirmRegisterAccountProcessor.java b/src/main/java/com/yam/app/account/domain/ConfirmRegisterAccountProcessor.java new file mode 100644 index 0000000..69a98a2 --- /dev/null +++ b/src/main/java/com/yam/app/account/domain/ConfirmRegisterAccountProcessor.java @@ -0,0 +1,24 @@ +package com.yam.app.account.domain; + +import com.yam.app.account.application.ConfirmRegisterAccountCommand; + +public final class ConfirmRegisterAccountProcessor { + + private final AccountReader accountReader; + private final AccountRepository accountRepository; + private final TokenVerifier tokenVerifier; + + public ConfirmRegisterAccountProcessor(AccountReader accountReader, + AccountRepository accountRepository, TokenVerifier tokenVerifier) { + this.accountReader = accountReader; + this.accountRepository = accountRepository; + this.tokenVerifier = tokenVerifier; + } + + public void registerConfirm(ConfirmRegisterAccountCommand command) { + tokenVerifier.verify(command.getToken(), command.getEmail()); + Account account = accountReader.findByEmail(command.getEmail()); + account.completeRegister(); + accountRepository.update(account); + } +} diff --git a/src/main/java/com/yam/app/account/domain/TokenVerifier.java b/src/main/java/com/yam/app/account/domain/TokenVerifier.java index 7005a8f..40a2264 100644 --- a/src/main/java/com/yam/app/account/domain/TokenVerifier.java +++ b/src/main/java/com/yam/app/account/domain/TokenVerifier.java @@ -1,23 +1,14 @@ package com.yam.app.account.domain; -import com.yam.app.common.StringUtils; - public final class TokenVerifier { private final AccountReader accountReader; - private final AccountRepository accountRepository; - public TokenVerifier(AccountReader accountReader, - AccountRepository accountRepository) { + public TokenVerifier(AccountReader accountReader) { this.accountReader = accountReader; - this.accountRepository = accountRepository; } - public boolean verify(String token, String email) { - if (StringUtils.isBlank(token) || StringUtils.isBlank(email)) { - throw new IllegalArgumentException(); - } - + public void verify(String token, String email) { var account = accountReader.findByEmail(email); if (account == null) { @@ -28,9 +19,5 @@ public final class TokenVerifier { throw new IllegalStateException(); } - account.completeRegister(); - accountRepository.update(account); - return true; } - } 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 eb0468e..e218f9a 100644 --- a/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java +++ b/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java @@ -2,6 +2,7 @@ package com.yam.app.account.infrastructure; import com.yam.app.account.domain.AccountReader; import com.yam.app.account.domain.AccountRepository; +import com.yam.app.account.domain.ConfirmRegisterAccountProcessor; import com.yam.app.account.domain.PasswordEncrypter; import com.yam.app.account.domain.RegisterAccountProcessor; import com.yam.app.account.domain.TokenVerifier; @@ -49,8 +50,14 @@ public class AppConfiguration { } @Bean - public TokenVerifier tokenVerifier(AccountReader accountReader, - AccountRepository accountRepository) { - return new TokenVerifier(accountReader, accountRepository); + public TokenVerifier tokenVerifier(AccountReader accountReader) { + return new TokenVerifier(accountReader); + } + + @Bean + public ConfirmRegisterAccountProcessor confirmRegisterAccountProcessor( + AccountReader accountReader, AccountRepository accountRepository, + TokenVerifier tokenVerifier) { + return new ConfirmRegisterAccountProcessor(accountReader, accountRepository, tokenVerifier); } } diff --git a/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java b/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java index 93e6a37..7d8b5a4 100644 --- a/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java +++ b/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java @@ -8,10 +8,10 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @@ -35,16 +35,18 @@ public final class AccountCommandApi { /** * 회원가입 이메일 검증 컨트롤러 - * 임시로 "http://localhost:3000/login"로 리다이렉트 되도록 설정. + * - 임시로 "http://localhost:3000/login"로 리다이렉트 되도록 설정. + * - 임시로 검증에 실패해서 예외가 발생하면 400 HTTP 을 반환하도록 설정. */ @GetMapping("/api/accounts/authorize") - public ResponseEntity verify( - @RequestParam String token, - @RequestParam String email) throws Exception { - var result = accountFacade.verify(token, email); - if (!result) { + public ResponseEntity registerConfirm( + @ModelAttribute ConfirmRegisterAccountRequest request) throws Exception { + try { + accountFacade.registerConfirm(request); + } catch (Exception e) { return ResponseEntity.badRequest().build(); } + var uri = new URI("http://localhost:3000/login"); var header = new HttpHeaders(); header.setLocation(uri); diff --git a/src/main/java/com/yam/app/account/presentation/ConfirmRegisterAccountRequest.java b/src/main/java/com/yam/app/account/presentation/ConfirmRegisterAccountRequest.java new file mode 100644 index 0000000..6cb1504 --- /dev/null +++ b/src/main/java/com/yam/app/account/presentation/ConfirmRegisterAccountRequest.java @@ -0,0 +1,16 @@ +package com.yam.app.account.presentation; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public final class ConfirmRegisterAccountRequest { + + @NotBlank + private String token; + + @Email + @NotBlank + private String email; +} diff --git a/src/main/java/com/yam/app/common/StringUtils.java b/src/main/java/com/yam/app/common/StringUtils.java deleted file mode 100644 index 11ead66..0000000 --- a/src/main/java/com/yam/app/common/StringUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.yam.app.common; - -public final class StringUtils { - - private StringUtils() { - } - - /** - * 입력값이 null 또는 공백이라면 true 반환. - */ - public static boolean isBlank(String value) { - if (value == null || value.isEmpty()) { - return true; - } - return value.trim().isEmpty(); - } -} diff --git a/src/main/resources/mapper/xml/AccountCommandMapper.xml b/src/main/resources/mapper/xml/AccountCommandMapper.xml index a6bb04c..e187f1a 100644 --- a/src/main/resources/mapper/xml/AccountCommandMapper.xml +++ b/src/main/resources/mapper/xml/AccountCommandMapper.xml @@ -12,7 +12,6 @@ password = #{password}, withdraw = #{withdraw} WHERE id = #{id} - LIMIT 1