이번 파트는 5장 서비스 추상화 파트를 학습.
아래 코드는 사용자 레벨을 부여하기 위해서 작성된 코드다.
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);
}
}
}
위의 코드[0]를 보면 레벨을 부여할지에 대한 확인과, 부여를 하는 역활을 2가지 하고 있다.
2개의 스텝으로 분리를 하자. 역할과 책임의 따라서 분리를 하자. 위의 코드는 변화에 취약하고, 다루기 힘들다.
추상적인 로직으로 작성하며 아래와 같다.
public void upgradeLevels() {
List<User> users = userDao.getAll();
for (User user : users) {
if (canUpgradeLevel(user)) {
upgradeLevel(user);
}
}
}
역할과 책임의 따라서 코드를 분리하니 훨씬 깔끔해 보인다. [1]
추상화란 결국 기능들을 하나의 메소드에 주구장창 작성하는 것이(구현 클래스처럼 코드를 작성하는 것이) 아닌, 추상적(인터페이스에 의존)으로 로직을 작성하고 역할과 책임을 분리하는 것이다.
개발을 할 때 중요하게 생각하는 것, 지금의 코드는 변경이 되고 확장이 될 것인가? 정책이 바뀔 수 있는가? 여지가 있다면 인터페이스를 사용해서 주입을 받자.
서비스 추상화를 설명하기 위해서 2번째 예시는 트랜잭션으로 설명을 이어 나간다.
등급을 바꾸는 중 중간에서 예외가 발생하였다. 그러면 어떻게 처리를 할 것인가? 그대로 둘 것인가? 아니면 전체 롤백을 할 것인가? 작업을 하나의 단위로 보는 것이 트랜잭션이다.
temp1
public void upgradeLevels() throws Exception{
TransactionSynchronizationManager.initSynchronization();
Connection c = DataSourceUtils.getConnection(dataSource);
c.setAutoCommit(false);
try {
List<User> users = userDao.getAll();
for (User user : users) {
if (canUpgradeLevel(user)) {
upgradeLevel(user);
}
}
c.commit();
} catch (Exception e) {
c.rollback();
throw e;
} finally {
DataSourceUtils.releaseConnection(c, dataSource);
TransactionSynchronizationManager.unbindResource(this.dataSource);
TransactionSynchronizationManager.clearSynchronization();
}
}
1
자신의 로직이 바뀌지 않았음에도 기술환경에 따라서 코드가 바뀌지 않도록, 추상화(인터페이스)를 활용하자.
PlatformTransactionManager를 사용하면, JDBC / JTA / Hibernate 기술 환경이 변경되더라도 추상화(PlatformTransactionManager) 의 의존하기 때문에 로직은 변경될 필요가 없다.
2
[0]
https://github.com/junngo/spring-playground/commit/253c8769001851c5b87feeb9c1530cf154599b9a
[1]
https://github.com/junngo/spring-playground/commit/76a1e8f012219e2c1481791dcc90e6f532731bc7
'개발 기록 > 개발 로그' 카테고리의 다른 글
[DB] PostgreSQL 외부 접속 허용하기 (Connection refused: no further information) (0) | 2025.01.11 |
---|---|
[JS] 성능 최적화를 위한 데이터 구조 선택 (with reduce, find) (0) | 2025.01.08 |
Ep 3. HTML / CSS 입문 30일 챌린지(마무리) - 독학 개발 공부 (1) | 2023.01.30 |
[git 에러] refusing to allow a Personal Access Token to create or update workflow (0) | 2023.01.27 |
Ep 2. HTML / CSS 입문 30일 챌린지 - 링크트리 만들기 (2주차) (0) | 2022.11.07 |