-
[Springboot] 단위 테스트 코드 작성해보기 (Service, Dao, Repository)Server/Spring Boot 2025. 4. 21. 15:45728x90반응형
Spring Boot에서 JUnit 5로 Service, Repository, DAO 단위 테스트하기
1. 엔티티 클래스 (User.java)
@Entity public class User { @Id @GeneratedValue private Long id; private String name; private String email; // getters, setters, constructors }
2. Repository 인터페이스 (UserRepository.java)
public interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByEmail(String email); }
3. DAO 클래스 (UserDao.java)
@Repository public class UserDao { private final JdbcTemplate jdbcTemplate; public UserDao(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public int countUsers() { return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM user", Integer.class); } }
4. Service 클래스 (UserService.java)
@Service public class UserService { private final UserRepository userRepository; private final UserDao userDao; public UserService(UserRepository userRepository, UserDao userDao) { this.userRepository = userRepository; this.userDao = userDao; } public User createUser(String name, String email) { User user = new User(null, name, email); return userRepository.save(user); } public Optional<User> getUserByEmail(String email) { return userRepository.findByEmail(email); } public long countUsers() { return userDao.countUsers(); } public void deleteUser(Long id) { userRepository.deleteById(id); } }
5. Repository 단위 테스트 (UserRepositoryTest.java)
@DataJpaTest class UserRepositoryTest { @Autowired private TestEntityManager entityManager; @Autowired private UserRepository userRepository; @Test void testFindByEmail() { User user = new User(null, "Alice", "alice@example.com"); entityManager.persist(user); Optional<User> found = userRepository.findByEmail("alice@example.com"); assertTrue(found.isPresent()); assertEquals("Alice", found.get().getName()); } }
6. DAO 단위 테스트 (UserDaoTest.java)
@JdbcTest class UserDaoTest { @Autowired private UserDao userDao; @Test void testCountUsers() { int count = userDao.countUsers(); assertTrue(count >= 0); } }
7. Service 단위 테스트 (UserServiceTest.java)
@ExtendWith(MockitoExtension.class) class UserServiceTest { @Mock private UserRepository userRepository; @Mock private UserDao userDao; @InjectMocks private UserService userService; @Test void testCreateUser() { User user = new User(null, "Bob", "bob@example.com"); when(userRepository.save(any(User.class))).thenReturn(user); User saved = userService.createUser("Bob", "bob@example.com"); assertEquals("Bob", saved.getName()); } @Test void testCountUsers() { when(userDao.countUsers()).thenReturn(10); long count = userService.countUsers(); assertEquals(10, count); } }
마무리
이처럼 JUnit 5와 Spring Boot의 테스트 지원 기능을 잘 활용하면 Service, Repository, DAO 계층의 로직을 각각 분리하여 테스트할 수 있습니다. 테스트 자동화를 통해 개발 효율성과 코드 품질을 함께 높여보세요!
728x90반응형'Server > Spring Boot' 카테고리의 다른 글
[Springboot] SQL Injection 이란? 해결 방안은? (0) 2025.04.21 [Springboot] 통합 테스트 코드 작성해보기 (Controller) (1) 2025.04.21 [Springboot] 테스트도구 JUnit5 에 대해 알아보자! (0) 2025.04.21 [Springboot] 스레드와 프로세스를 구분해보자! (0) 2025.04.18 💡 Java Spring에서 자주 사용하는 ObjectMapper (1) 2025.04.17