기존에 있던 C,R,U,D에 추가로 등급을 판별해주는 비즈니스 로직을 추가하려고 한다.
USER 클래스에 추가적인 필드를 추가해준다.
level, login, recommend 추가
public class User {
public User(){}
public User(String id, String name, String password, Level level, int login, int recommend)
{
this.id = id;
this.name = name;
this.password = password;
this.level = level;
this.login = login;
this.recommend = recommend;
}
String id;
String name;
String password;
Level level;
int login;
int recommend;
// SETTER, GETTER 생략
}
UserDao는 데이터에 접근하는 코드를 작성하고 비즈니스 로직을 작성할 때는 서비스로 구별하여 작성하기 위해서
UserService클래스를 생성한다.
upgradeLevel메서드는 login횟수가 50 이상이면 basic -> silver로 만드는 로직
recommend가 30 이상이면 silver -> gold 등급으로 바꾸는 로직을 가지고 있다.
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);
}
}
}
}
applicationContext에 userService빈을 등록해준다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="org.mariadb.jdbc.Driver"/>
<property name="url" value="jdbc:mariadb://localhost:3307/bootex"/>
<property name="username" value="bootuser"/>
<property name="password" value="bootuser"/>
</bean>
<bean id="userService" class="spring.service.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="spring.dao.UserDaoJdbc">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
테스트 데이터를 setUp 해준후에 등급을 검증해주면 테스트 완료!
package spring.service;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import spring.dao.UserDao;
import spring.domain.Level;
import spring.domain.User;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = "file:src/main/resources/applicationContext.xml")
class UserServiceTest {
@Autowired
UserService userService;
@Autowired
UserDao userDao;
List<User> users;
@BeforeEach
public void setUp() {
System.out.println("userDao = " + userDao);
System.out.println("userService = " + userService);
users = Arrays.asList(
new User("a", "aaa", "1111", Level.BASIC, 49, 0),
new User("b", "bbb", "2222", Level.BASIC, 50, 0),
new User("c", "ccc", "3333", Level.BASIC, 60, 29),
new User("d", "ddd", "4444", Level.SILVER, 60, 30),
new User("e", "eee", "5555", Level.SILVER, 100, 100)
);
}
@Test
public void bean(){
Assertions.assertThat(this.userService).isNotNull();
}
@Test
public void upgradeLevels(){
userDao.deleteAll();
for(User user : users) userDao.add(user);
userService.upgradeLevels();
checkLevel(users.get(0), Level.BASIC);
checkLevel(users.get(1), Level.SILVER);
checkLevel(users.get(2), Level.SILVER);
checkLevel(users.get(3), Level.GOLD);
checkLevel(users.get(4), Level.GOLD);
}
private void checkLevel(User user, Level expectedLevel){
User userUpdate = userDao.get(user.getId());
Assertions.assertThat(userUpdate.getLevel()).isEqualTo(expectedLevel);
}
}
UserServiceTest에서 기본적으로 특별한 이유가 없다면 user가 등록될 때 basic level을 저장하려고 한다.
저장하고 저장하기 전의 레벨과 같은지 보려고 한다.
// userSerivce.add()
// level이 null로 요청되었으면 basic으로 변경한 후에 등록
public void add(User user){
if(user.getLevel() == null) user.setLevel(Level.BASIC);
userDao.add(user);
}
test code에서 userWithLevel은 level을 gold로 초기화한 후 저장하고
userWithoutLevel은 level을 null로 설정한 후에 저장하고 결과를 검증한다.
@Test
public void add(){
userDao.deleteAll();
User userWithLevel = users.get(4);
User userWithoutLevel = users.get(0);
userWithoutLevel.setLevel(null);
userService.add(userWithLevel);
userService.add(userWithoutLevel);
User userWithLevelRead = userDao.get(userWithLevel.getId());
User userWithoutLevelRead = userDao.get(userWithoutLevel.getId());
Assertions.assertThat(userWithLevelRead.getLevel()).isEqualTo(userWithLevel.getLevel());
Assertions.assertThat(userWithoutLevelRead.getLevel()).isEqualTo(userWithoutLevel.getLevel());
}
'WEB > SPRING' 카테고리의 다른 글
토비의 스프링 6.1 트랜잭션 코드의 분리 (0) | 2024.02.06 |
---|---|
토비의 스프링 5.2 트랜잭션 서비스 추상화 (0) | 2024.01.30 |
토비의 스프링 파트 4 예외 (0) | 2024.01.23 |
라이브러리와 프레임워크의 관계 (0) | 2021.02.07 |
ioc(inversion of control) (0) | 2021.02.07 |