๐Ÿค”Record๋Š” ๋ถˆ๋ณ€, ๊ทธ๋Ÿผ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๋Š”?

์ด๋ฉ”์ผ ์ธ์ฆ์‹œ 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
    );
}

rec

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())
        );
    }
}