๐ก ๋ฆฌํฉํ ๋ง์ด๋?
๋ฆฌํฉํฐ๋ง(refactoring)์ ์ํํธ์จ์ด ๊ณตํ์์ '๊ฒฐ๊ณผ์ ๋ณ๊ฒฝ ์์ด ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ์ฌ์กฐ์ ํจ'์ ๋ปํ๋ค. ์ฃผ๋ก ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ์ ์ง๋ณด์๋ฅผ ํธํ๊ฒ ํ๋ค. ๋ฒ๊ทธ๋ฅผ ์์ ๊ฑฐ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ํ์๋ ์๋๋ค. ์ฌ์ฉ์๊ฐ ๋ณด๋ ์ธ๋ถ ํ๋ฉด์ ๊ทธ๋๋ก ๋๋ฉด์ ๋ด๋ถ ๋ ผ๋ฆฌ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๊ณ ๊ฐ์ ํ๋ ์ ์ง๋ณด์ ํ์์ด๋ค.
โ๏ธ ๋ฆฌํฉํ ๋ง ์ ์ฝ๋ ์ ๊ฒ ํญ๋ชฉ
- ์ฝ๋์ ์ค๋ณต๋ ๋ถ๋ถ์ ์๋๊ฐ?
- ์ฝ๋๊ฐ ๋ฌด์์ ํ๋ ๊ฒ์ธ์ง ์ดํดํ๊ธฐ ๋ถํธํ์ง ์์๊ฐ?
- ์ฝ๋๊ฐ ์์ ์ด ์์ด์ผ ํ ์๋ฆฌ์ ์๋๊ฐ?
- ์์ผ๋ก ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ค๋ฉด ์ด๋ค ๊ฒ์ด ์์ ์ ์๊ณ , ๊ทธ ๋ณํ์ ์ฝ๊ฒ ๋์ํ ์ ์๊ฒ ์์ฑ๋์ด ์๋๊ฐ?
โ๏ธ UserService๋ฅผ ๋ฆฌํฉํ ๋ง ํด๋ณด์
๊ฐ User๋ง๋ค ๊ฐ๊ณ ์๋ level์ login, recommend๋ฅผ ๊ฒ์ฌํด ๊ธฐ์ค์ ๋ง์กฑํ๋ฉด
Level์ ์ ๊ทธ๋ ์ด๋ ์์ผ์ฃผ๋ ๋ ๋ฒจ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ฝ๋๋ฅผ ๊ตฌํํด๋ดค๋ค.
๋ ๋ฒจ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ๊ด๋ฆฌ ๋ก์ง์ UserDaoJdbc์ ๋ง๋๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์
UserService๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ์ด ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋น์์ผ์ฃผ์๋ค.
UserService.class
public class UserService {
UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void upgradeLevels() {
List<User> users = userDao.getAll();
for(User user : users) {
Boolean changed = null;
if(user.getLevel() == Level.BASIC && user.getLogin() >= 50) {
user.setLevel(Level.SILVER);
changed = true;
}
else if(user.getLevel() == Level.SILVER && user.getRecommend() >= 30) {
user.setLevel(Level.GOLD);
changed = true;
}
else if(user.getLevel() == Level.GOLD) { changed = false; }
else { changed = false; }
if(changed) { userDao.update(user); }
}
}
public void add(User user) {
if(user.getLevel() == null) user.setLevel(Level.BASIC);
userDao.add(user);
}
}
upgradeLevel()๋ฅผ ๋ณด๋ฉด ๋ง์ if/elseif/else ๋ธ๋ก๋ค์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
๋ง์ฝ Level์ ์๊ฐ ๋ง์์ง๊ณ , ์ด์กฑํด์ผํ๋ ์กฐ๊ฑด๋ค์ด ๋ง์์ง๋ฉด ์ด ๋ธ๋ก์ ์๋ ๋์ฑ ๋ง์์ ธ,
๊ฐ์๋ก ์ดํดํ๊ณ ๊ด๋ฆฌํ๊ธฐ ํ๋ค์ด์ง ๋ฟ ์๋๋ผ, ์ง์ ๋ถํด์ง๋ ์ฝ๋ ํ์ ๋ฒ๊ทธ๊ฐ ์จ์ด๋ค์ด ๊ฐ ๊ฐ๋ฅ์ฑ์ด ๋์์ง ๊ฒ์ด๋ค.
๋ฐ๋ผ์ if/elseif/else๋ก ์ด๋ค์ง ๋ณต์กํ ์กฐ๊ฑด์๋ค์ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ฆฌํฉํ ๋งํด๋ณด์
canUpgradeLevel(), upgradeLevel()์ ๋ง๋ค์ด์ค์ผ๋ก์ ์กฐ๊ฑด๋ฌธ์ ์ต๋ํ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
๐ canUpgradeLevel : user๊ฐ ๊ฐ์ง ์ ๋ณด๋ก ๋ ๋ฒจ์ด ์ ๊ทธ๋ ์ด๋ ํ ์ ์๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ๋ณํด์ฃผ๋ ๋ฉ์๋
private boolean canUpgradeLevel(User user) {
Level currentLevel = user.getLevel();
switch(currentLevel) {
case BASIC : return (user.getLogin() >= MIN_LOGCOUNT_FOR_SILVER);
case SILVER : return (user.getRecommend() >= MIN_RECCOMEND_FOR_GOLD);
case GOLD : return false;
default : throw new IllegalArgumentException("Unknown Level : " + currentLevel);
}
}
๐ upgradeLevel : user๊ฐ ๊ฐ์ง ๋ ๋ฒจ์ ์ ๊ทธ๋ ์ด๋ ํด์ฃผ๋ ๋ฉ์๋
private void upgradeLevel(User user) {
if(user.getLevel() == Level.BASIC) user.setLevel(Level.SILVER);
else if (user.getLevel() == Level.SILVER) user.setLevel(Level.GOLD);
userDao.update(user);
}
์ด๋ ๊ฒ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ๋ณต์กํ if/else if/else๋ฌธ์ ๋จ์ํ์์ผ ์ค ์ ์๋ค.
ํ์ง๋ง ์ฌ์ ํ upgradeLevel ๋ฉ์๋์๋ ๋ฌธ์ ๊ฐ ๋ณด์ผ ๊ฒ์ด๋ค.
Level ๋ง๋ค ์กฐ๊ฑด์์ ๋ง๋ค์ด์ค ๊ฒ์ ๋ณผ ์ ์๋๋ฐ , ๋ ๋ฒจ์ด ๋ง์์ง๋ฉด ์์ ๊ฐ์ด ๋ ์กฐ๊ฑด์์ด ์๋ ์์ด ๋ง์์ง ๊ฒ์ด๋ค.
๐ก ๊ฐ์ฒด์งํฅ์ ์ธ ๊ด์ ์ ํตํด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด์
์ฐ๋ฆฌ๋ JAVA๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ค.
๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋๋ ๋ค๋ฅธ ์ค๋ธ์ ํธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์์ ํ๋ ๊ฒ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์๋ ๋ค๋ฅธ ์ค๋ธ์ ํธ์๊ฒ
์์ ์ ํด๋ฌ๋ผ๊ณ ์์ฒญํ๋ ๊ฒ์ด๋ค.
์ฆ, ์ค๋ธ์ ํธ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌํ๋ ๊ฒ์ด ์๋, ์์ ์ ์์ฒญํ๋ ๊ฒ์ด ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ฅ ๊ธฐ๋ณธ ์๋ฆฌ์ด๋ค.
๊ฐ์ฒด์งํฅ์ ์ฝ๋ ๊ด์ ์ ์๊ฐํ๋ฉฐ upgradeLevel๋ฅผ ๋ฆฌํฉํ ๋ง
์ฐ์ if/else ๋ฌธ์ผ๋ก ์ ๊ทธ๋ ์ด๋ ๋ ํ์ Level์ ์๋ ค์ฃผ๋ ๊ฒ์ Level Enum์๊ฒ ์์ ์ ์๊ตฌํ๋๋ก ํ์.
๊ธฐ์กด์ Level Enum์ ์๋์ ๊ฐ์ด ๊ณ ์ณ ์ค ์ ์๋ค.
public enum Level {
GOLD(3, null), SILVER(2, GOLD), BASIC(1, SILVER);
private final int value;
private final Level next;
Level(int value, Level next){
this.value = value;
this.next = next;
}
public int intValue() {
return value;
}
public Level nextLevel() {
return this.next;
}
public static Level valueOf(int value) {
switch(value) {
case 1 : return BASIC;
case 2 : return SILVER;
case 3 : return GOLD;
default : throw new AssertionError("Unknown value : " + value);
}
}
}
์์ ๊ฐ์ด ๋ค์๋ ๋ฒจ์ ํ๋ณํด์ฃผ๋ ์์ ์ UserService์์์ ์์ ์ด ์๋, Level ๊ฐ์ฒด์๊ฒ ์์ ์์ฒญ์ ํ ์ ์๋ค.
๋ํ ํ๋ณํด์ค nextLevel๋ก ๋ ๋ฒจ์ ๋ค์ ์ค์ ํด์ฃผ๋ ์์ ์ UserService๊ฐ ์๋,
์๋์ ๊ฐ์ด User ํด๋์ค์์ upgradeLevel ๋ฉ์๋๋ฅผ ์ถ๊ฐํด Level์ ๊ฐ๊ณ ์๋ User์๊ฒ ์์ฒญ ํ ์ ์๋ค.
public class User {
//...์๋ต
public void upgradeLevel() {
Level nextLevel = this.level.nextLevel();
if(nextLevel == null) {
throw new IllegalStateException( this.level + "cannot be upgraded");
}
else {
this.level = nextLevel;
}
}
}
์ด๋ ๊ฒ ๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋์ ๊ด์ ์ ๊ฐ๊ณ ๋ฆฌํฉํ ๋ง ํด์ฃผ๋ฉด ๋์ฑ ์ฝ๋๋ ๊ฐ๋จํด ์ง ๊ฒ์ด๋ค.
๊ฐ๋จํด์ง upgradeLevel ๋ฉ์๋
private void upgradeLevel(User user) {
user.upgradeLevel();
userDao.update(user);
}
๐ ์ ๋ฆฌ
-
์์ ๊ฐ์ด ์ ๊ฒ์ ํด์ค ํ ๋ฆฌํฉํ ๋ง์ ํด์ฃผ์!
-
์๋ฐ๋ฅผ ์ฐ๋ ์ด์ ๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋๋ฅผ ๊ตฌํ ํ ์ ์๋๋ก ํ์!
์ฐธ๊ณ ๋ฌธ์ :
ํ ๋น์ ์คํ๋ง3 (์ด์ผ๋ฏผ)
'Back-end > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ํธ๋์ญ์ ๋ฌธ์ ํด๊ฒฐ - ํธ๋์ญ์ ๋๊ธฐํ ๊ธฐ๋ฒ (0) | 2020.08.28 |
---|---|
[Spring] ํธ๋์ญ์ ๋ฌธ์ ์ฐพ๊ธฐ (feat. ํธ๋์ญ์ ๊ฒฝ๊ณ์ค์ ๊ตฌ์กฐ) (0) | 2020.08.27 |
[Spring] JdbcTemplate ์ฌ์ฉ๋ฒ - update(), queryForInt(), queryForObject(), query() (2) | 2020.08.19 |
[Spring] JdbcTemplate์ด๋? (0) | 2020.08.19 |
[Spring] ํ ํ๋ฆฟ ์ฝ๋ฐฑ ํจํด (1) | 2020.08.17 |