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;
@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();
}
}
- 구현 및 코드는 생략하겠습니다.
- 추후 특별한 메서드가 생성될 때 올리겠습니다.