5.Spring 토이프로젝트 UserServiceTest & UserService

Miz·2021년 5월 23일
0

board-toy-project

목록 보기
5/6

5.Spring 토이프로젝트 UserServiceTest & UserService

UserService 구현

  • 기본 기능 구현 위주로 먼저 작성합니다.
  • board, comment도 일단 기본 기능은 같게 구현합니다.
  • tdd 연습을 위해 test코드 생성 후 userservice에 기능 구현 방식으로 코딩했습니다.

UserServiceTest

import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;

@Transactional
@SpringBootTest
class UserServiceTest {

    @Autowired
    UserService userService;

    @Autowired
    EntityManager em;

    User user;
    User user2;

    @BeforeEach
    void beforeEach() {
        user = User.builder()
                .username("test")
                .email("test@test.com")
                .password("holiy")
                .build();
        user2 = User.builder()
                .username("test2")
                .email("test2@test.com")
                .password("holiy")
                .build();
    }

    @Test
    @DisplayName("유저 생성 성공 테스트")
    void save() {
        User saveUser = userService.join(user);

        checkUser(saveUser,user);
    }

    @Test
    @DisplayName("유저 단일 조회 테스트")
    void find() {
        User saveUser = userService.join(user);
        em.flush();
        em.clear();

        Long userId = saveUser.getId();
        User findUser = userService.findOne(userId);

       checkUser(findUser, saveUser);
    }

    @Test
    @DisplayName("유저 단일 조회 실패 테스트")
    void findFail() {
        Long userId = 3L;

        assertThrows(UserNotFoundException.class, () -> {
            userService.findOne(userId);
        });
    }

    @Test
    @DisplayName("유저 전체 조회")
    void findAll() {
        userService.join(user);
        userService.join(user2);

        List<User> users = userService.findAll();

        assertThat(users).contains(user,user2);
    }


    private void checkUser(User user1, User user2) {
        assertThat(user1.getUsername()).isEqualTo(user2.getUsername());
        assertThat(user1.getEmail()).isEqualTo(user2.getEmail());
        assertThat(user1.getPassword()).isEqualTo(user2.getPassword());

        // 영속성 컨텍스트에서는 동일성이 보장된다.
        assertThat(user1.getModifiedDate()).isEqualTo(user2.getModifiedDate());
        assertThat(user1.getCreatedDate()).isEqualTo(user2.getCreatedDate());
    }


}

UserService

  • @Service 어노테이션을 통해 스프링 빈으로 등록
  • @RequiredArgsConstructor 를 통해 private final 필드들로 생성자를 구현하면서 DI
    • 롬복을 통해 아래 주석 코드가 생성 됩니다.
  • @Transactional(readOnly = true)
    • 기본적으로 Transaction에 readOnly=true 옵션을 준 뒤 디비에 변화가 있는 메서드에는 따로 정해줍니다.
    • readOnly 일 시에 예상치 못한 데이터 수정 동작을 하지 않습니다.
    • 하이버네이트에서 FlushMode를 Manual로 변경해 dirty checking 이 발생하지 않습니다.
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class UserService {

    private final UserRepository userRepository;

    /*
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    */

    @Transactional
    public User join(User user) {
        return userRepository.save(user);
    }

    public User findOne(Long userId) {
        return userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException());
    }

    public List<User> findAll() {
        return userRepository.findAll();
    }
}

BoardService & CommentService

  • 구현 및 코드는 생략하겠습니다.
  • 추후 특별한 메서드가 생성될 때 올리겠습니다.
profile
2년차 백엔드 개발자

0개의 댓글