본문 바로가기

WEB/SPRING

토비의 스프링 5.1 서비스 추상화

기존에 있던 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());

    }