์ด๋ฉ์ผ ์ธ์ฆ์ account
์ emailVerificationStatus
๋ฅผ ๋ณ๊ฒฝํด์ค์ผ ํ๋ ๋ก์ง์ด ์์ต๋๋ค.
Account
๋ฅผ record๋ก ํ๋๋ ๋ณ๊ฒฝ์ด ์๋ฉ๋๋ค.
record๋ ๋ถ๋ณ ๊ฐ์ฒด๋ก abstract๋ก ์ ์ธํ ์ ์์ผ๋ฉฐ ์์์ ์ผ๋ก final๋ก ์ ์ธ๋ฉ๋๋ค. ํ ๋ฒ ๊ฐ์ด ์ ํด์ง๋ฉด setter๋ฅผ ํตํด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ ์์์ ํ ์ ์์ต๋๋ค.
public void emailVerification(String token, String email) {
Account account = accountRepository.findByEmail(email);
if (account.emailVerificationStatus()== AccountEmailVerificationStatus.VERIFIED) {
throw new IllegalArgumentException("Already Verified");
}
if(token.equals(account.emailVerificationToken())) {
account.verifyEmail();
}else{
throw new IllegalArgumentException("Invalid Token");
}
}
public record Account (Long accountId, String email, String password, String emailVerificationToken , AccountEmailVerificationStatus emailVerificationStatus, AccountActiveStatus activeStatus) {
public Account(String email, String password) {
this(null,
email,
password,
generateEmailVerificationToken(),
AccountEmailVerificationStatus.NON_VERIFIED, AccountActiveStatus.ACTIVE);
}
private static String generateEmailVerificationToken() {
return UUID.randomUUID().toString();
}
public boolean verifyEmail(String token) {
return token.equals(emailVerificationToken);
}
}
public AccountResponse emailVerification(String token, String email) {
Account account = accountRepository.findByEmail(email);
if (account.emailVerificationStatus()== AccountEmailVerificationStatus.VERIFIED) {
throw new IllegalArgumentException("Already Verified");
}
if(token.equals(account.emailVerificationToken())) {
Account verified = account.verifyEmail();
accountRepository.update(verified);
return new AccountResponse(verified.email(), verified.emailVerificationStatus(), verified.activeStatus());
}else{
throw new IllegalArgumentException("Invalid Token");
}
}
public Account verifyEmail() {
return new Account(
accountId,
email,
password,
emailVerificationToken,
AccountEmailVerificationStatus.VERIFIED,
activeStatus
);
}
citizen ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค๋ ๋์ค record
์ ์ญํ ์ ๋ํด ์๊ฐํ๊ฒ ๋์์ต๋๋ค.
public record CitizenResponse(
String nickname,
String phoneNumber,
AddressResponse address,
HobbyResponse hobby
) {
public CitizenResponse(Citizen saved) {
this(saved.nickname(), saved.phoneNumber(), new AddressResponse(saved.address()), new HobbyResponse(saved.hobby()));
}
}
์ฑ ์ ๋ถ๋ฆฌ(Separation of Responsibility)์ ๋จ์ผ ์ฑ ์ ์์น(Single Responsibility Principle)์ ๋ฐ๋ฅด๋ฉด ์๋์ ๊ฐ์ Factory ํด๋์ค๋ฅผ ํ๋ ๋ ๋ง๋๋๊ฒ ๋ง๋ค๊ณ ์๊ฐ ์ค์ ๋๋ค๋ง.. ๐ค
๋ ์ฝ๋๋ง๋ค Factory ํด๋์ค๊ฐ ํ๋์ฉ ๋ ์๊ธฐ๊ณ ์ด ํด๋์ค๋ค๋ ๊ด๋ฆฌ ํ ๊ฒ์ ์๊ฐํ๋ฉด.. ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
public class CitizenResponseFactory {
public static CitizenResponse from(Citizen saved) {
return new CitizenResponse(
saved.nickname(),
saved.phoneNumber(),
new AddressResponse(saved.address()),
new HobbyResponse(saved.hobby())
);
}
}