TemporaryPassword refactoring - leegwichan/StackOverFlow_Refactoring GitHub Wiki
โ ๊ธฐ์กด ์์ฑ ๋ฐฉ๋ฒ
- ์ฝ๋์ ํ์ํ ์์๋ค์ ์๊ฐ ๋๋๋๋ก ์์ฑํจ
- ๊ธฐ๋ฅ ๊ตฌํ์๋ง ์ด์ ์ ๋ง์ถค
โ ๊ธฐ์กด ์์ฑ ๋ฐฉ๋ฒ์ ๋ฌธ์ ์
- ๋ณ๊ฒฝ์ ํ๋ ๊ฒ์ด ์ด๋ ค์
- method ํ๋์์ ๋ง์ ๊ธฐ๋ฅ์ ์ํํ์ฌ ๋ณด๊ธฐ ํ๋ฆ
- ex) ๊ธฐ์กด์ ๋๋ค ๋ฌธ์์ ๋๋ฌธ์๋ ์ถ๊ฐํ๋ ค๊ณ ํ๋ค๋ฉด, ์ฝ๋์ ์ ๋ฐ์ ์ธ ๊ณผ์ ์ ๋ชจ๋ ์ดํดํ๊ณ ์์ ํ์ฌ์ผ ํ๋ค.
- method๊ฐ ์คํ ๋ ๋๋ง๋ค Random ๊ฐ์ฒด ์์ฑ
- return ๊ฐ์ด String[]์ผ๋ก ๋์ด ์์ด ๊ฐ๊ฐ์ Array ์นธ์ด ์ด๋ค ์ญํ ์ ํ๋์ง ํ๋์ ์ ์ ์๋ค.
โ Refactoring ์ค์ ์ฌํญ
-
method๋ฅผ ์ฌ๋ฌ๊ฐ๋ก ๋๋
- method ํ๋์์ ํ๋์ ๊ธฐ๋ฅ๋ง์ ํ๋๋ก ๊ตฌ์ฑํจ
- method line์ 15์ค์ด ๋์ด๊ฐ์ง ์๋๋ก ์์ฑ
-
Random ๊ฐ์ฒด๋ฅผ class ํด๋์ค ๋ณ์๋ก ์์ฑํจ
- Random ๊ฐ์ฒด๋ฅผ ํ๋ฒ๋ง ์์ฑํ๊ณ ํ์ํ ๋๋ง๋ค ์ฌ์ฉํจ
-
return ํ์์ PasswordDto๋ก ํจ
- PasswordDto๋ฅผ ๋ง๋ค์ด ๊ธฐ๋ณธ password ์ ๋ณด์ ์ํธํ๋ password ์ ๋ณด๋ฅผ returnํจ
- getter๋ฅผ ํตํด ํด๋น ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
โ Refactoring ํจ๊ณผ
-
๋ณ๊ฒฝ์ ๋งค์ฐ ์ฉ์ดํจ
- ์์ ๋น๋ฐ๋ฒํธ์ ๊ธ์ ์๋ฅผ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด PASSWORD_LENGTH ์์
- ์์ ๋น๋ฐ๋ฒํธ์ ๋ค์ด๊ฐ๋ ๊ธ์๋ฅผ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด createRandomLetter() ์์
-
return ํ์์ PasswordDto๋ก ํ๋ฉด์ ์ธ๋ถ์์ ์ฌ์ฉ์ ๊ฐ์ ๋ช ํํ๊ฒ ์ ์ ์๋ค.
@Override public void resetPasswordByEmail(String email) { Member findMember = findMemberByEmailExpectExist(email); PasswordDto newPassword = temporaryPassword.create(); temporaryPasswordSender.send(email, newPassword.getDecodedPassword()); findMember.updatePassword(newPassword.getEncodedPassword()); memberRepository.save(findMember); }
โ ๋ณ๊ฒฝ ์ดํ ์ฝ๋
@Component
public class TemporaryPassword {
private static final char START_LETTER = 'a';
private static final char END_LETTER = 'z';
private static final int PASSWORD_LENGTH = 10;
private final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
private final Random random = new Random();
public PasswordDto create(){
String generatedPassword = createRandomPassword();
String encodedPassword = encoder.encode(generatedPassword);
return new PasswordDto(generatedPassword, encodedPassword);
}
private String createRandomPassword() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < PASSWORD_LENGTH; i++) {
sb.append(createRandomLetter());
}
return sb.toString();
}
private char createRandomLetter() {
int randomASCIICode = START_LETTER + random.nextInt(END_LETTER - START_LETTER);
char randomLetter = (char) randomASCIICode;
return randomLetter;
}
}
@AllArgsConstructor
@Getter
public class PasswordDto {
private String decodedPassword;
private String encodedPassword;
}
โ ๋ณ๊ฒฝ ์ด์ ์ฝ๋
@Component
@RequiredArgsConstructor
public class TemporaryPassword {
private final BCryptPasswordEncoder encoder;
public String[] create(){
int leftLimit = 97; // letter 'a'
int rightLimit = 122; // letter 'z'
int targetStringLength = 10;
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < targetStringLength; i++) {
int randomLimitedInt = leftLimit + (int)
(random.nextFloat() * (rightLimit - leftLimit + 1));
sb.append((char) randomLimitedInt);
}
String generatedString = sb.toString();
String encodeString = encoder.encode(generatedString);
return new String[]{generatedString, encodeString};
}
}