1. 테스트의 가치와 필요성
스프링이 개발자에게 제공하는 가장 중요한 가치 중 하나는 객체지향과 테스트입니다. 테스트는 코드가 예상대로 정확히 동작하는지 확인하여 개발자에게 "모든 결함이 제거되었다는 확신"을 주며, 디버깅 시간을 단축시켜 줍니다.
잘 설계된 좋은 코드는 테스트하기 좋은 코드가 좋은 코드형태로 보이고 반대로 테스트하기 불편하게 설계된 코드는 좋은 코드라고 보기 어렵습니다. 따라서 충분한 검증이 없는 테스트는 없는 것보다 나쁘므로, 부정적인 상황을 먼저 테스트하는 단위 테스트를 작성하는 습관이 중요합니다.
2. UserDaoTest 다시 보기와 단위 테스트
기존의 웹을 통한 테스트 방식은 모든 레이어를 다 만든 후에나 가능하며, 서버 설정 등 외부 요인의 영향을 많이 받아 오류 대응이 어렵다는 단점이 있습니다. 이를 해결하기 위해 단위 테스트(Unit Test)가 필요합니다.
- 단위 테스트의 정의: 가능하면 작은 단위로 쪼개서 집중적으로 테스트하는 것을 의미하며, '관심사의 분리' 원리가 적용됩니다.
- DB 사용과 단위 테스트: 테스트가 사용하는 DB의 상태를 테스트가 직접 관장하고 있다면 이를 단위 테스트라고 부를 수 있습니다. 다만, 통제할 수 없는 외부 리소스에 의존하는 순간 단위 테스트로서의 가치가 떨어집니다.
- 자동 수행의 중요성: 테스트는 매번 서버를 띄우거나 브라우저를 확인하는 번거로움 없이 코드를 통해 자동으로 수행되어야 합니다. 이를 위해 애플리케이션 클래스에서 테스트 코드를 분리하여 별도의 테스트용 클래스를 만드는 것이 좋습니다.
3. 기존 테스트 방식의 문제점
초기의 main() 메소드를 이용한 테스트 방식에는 두 가지 주요한 문제점이 있습니다.
- 수동 확인의 번거로움: 테스트 실행은 자동일지라도, 결과가 맞는지(예: DB에 등록된 값과 가져온 값이 일치하는지)를 사람이 직접 눈으로 확인해야 합니다.
- 실행의 번거로움: DAO가 수백 개로 늘어날 경우, 전체 기능을 확인하기 위해 수백 개의 main() 메소드를 일일이 실행해야 하는 불편함이 있습니다.
4. JUnit 프레임워크를 이용한 테스트 개선
이러한 문제점을 해결하기 위해 자바의 대표적인 테스팅 프레임워크인 JUnit을 도입합니다. JUnit은 프레임워크로서 개발자가 만든 클래스의 오브젝트를 생성하고 실행하는 제어권을 가집니다.
- 테스트 검증 자동화: JUnit은 테스트 결과를 성공(Success), 에러(Error - 실행 중 예외 발생), 실패(Failure - 기대한 결과와 다름)로 구분하여 관리해 줍니다.
- JUnit 테스트 전환 조건:
- 테스트 메소드는 반드시 public으로 선언되어야 합니다.
- 메소드에 @Test 애노테이션을 붙여야 합니다.
- 검증 코드 전환: System.out.println을 통한 수동 확인 대신, JUnit의 Assertions.assertEquals()와 같은 검증 코드를 사용합니다. 이를 통해 기대한 결과와 실제 값이 다를 경우 JUnit이 즉시 실패를 알려주므로 수동 확인 과정이 사라집니다.
- 이와 같이 JUnit을 활용하면 테스트 실행과 결과 확인이 모두 자동화되어 개발 생산성과 코드의 신뢰성을 동시에 높일 수 있습니다.
'spring' 카테고리의 다른 글
| 토비의 스프링 정복하기 2편 - 제어의 역전 (1) | 2026.01.11 |
|---|---|
| 토비의 스프링 정복하기 1편 - 관심사의 분리 (0) | 2026.01.07 |