스프링 부트 백엔드 개발 강좌, 테스트 컨트롤러 살펴보기

스프링 부트는 최근의 웹 애플리케이션 개발에서 가장 인기 있는 프레임워크 중 하나로, 개발자가 신속하게 프로덕션 준비가 완료된 애플리케이션을 만들 수 있도록 돕습니다. 본 강좌에서는 스프링 부트에서의 테스트 컨트롤러에 대해 자세히 살펴보겠습니다. 테스트 컨트롤러는 애플리케이션의 비즈니스 로직과 데이터 레이어 간의 상호 작용을 검증하는 중요한 부분으로, 올바른 동작을 보장하는 데 필수적입니다.

1. 스프링 부트 및 테스트 개념 이해하기

테스트는 소프트웨어 개발 주기에서 필수적인 단계로, 상대적으로 높은 품질의 코드를 유지하는데 기여합니다. 스프링 부트는 모든 기능을 테스트하는 데 필요한 모듈을 제공합니다. 단위 테스트, 통합 테스트, 그리고 E2E(End-to-End) 테스트로 나눌 수 있으며, 이 모든 테스트는 애플리케이션의 신뢰성을 높이는 데 도움을 줍니다.

1.1 단위 테스트와 통합 테스트

단위 테스트는 개별적으로 가장 작은 코드 단위(주로 메소드 단위)가 의도한 대로 동작하는지를 검증합니다. 반면, 통합 테스트는 여러 컴포넌트가 결합되어 올바르게 작동하는지를 확인합니다. 특히 스프링 부트에서는 이러한 테스트를 쉽게 구현할 수 있는 여러 도구와 프레임워크가 제공됩니다.

1.2 E2E 테스트

E2E 테스팅은 사용자의 관점에서 애플리케이션이 정상적으로 동작하는지를 확인하는 과정입니다. 통합 테스트보다 더 높은 수준의 테스트이며, 사용자가 애플리케이션을 사용하면서 겪는 전체적인 경험을 검사합니다.

2. 스프링 부트의 테스트 지원

스프링 부트는 JUnit, Mockito, Spring Test와 같은 광범위한 테스트 도구를 지원합니다. JUnit은 자바 테스트 프레임워크로, 스프링 부트 애플리케이션과 함께 사용할 수 있는 강력한 기능을 제공합니다. Mockito는 Mock 객체를 생성하여 의존성을 주입하고, 테스트할 객체의 동작을 시뮬레이션할 수 있게 해줍니다.

2.1 테스트 어노테이션

스프링 부트에서는 여러 테스트 어노테이션을 제공하여 테스트 클래스를 쉽게 구성할 수 있습니다. 여기서는 주요 어노테이션을 소개합니다:

  • @SpringBootTest: 전체 컨텍스트를 로드하여 통합 테스트를 수행하는 데 사용됩니다.
  • @WebMvcTest: MVC 컴포넌트만 로드하여 컨트롤러 테스트에 유용합니다.
  • @MockBean: 특정 빈을 Mock 객체로 대체할 때 사용됩니다.

3. 테스트 컨트롤러 구현하기

이제 테스트 컨트롤러를 구현해보도록 하겠습니다. 간단한 CRUD 애플리케이션을 예로 들겠습니다. 이 애플리케이션은 사용자 정보를 관리하는 기능을 가지고 있습니다.

3.1 의존성 주입 설정하기

 
    // build.gradle
    dependencies {
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    

3.2 사용자 모델 및 레포지토리 구현


// User.java
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String email;

    // getters and setters
}

// UserRepository.java
public interface UserRepository extends JpaRepository {
}
    

3.3 사용자 컨트롤러 구현


// UserController.java
@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping
    public List getAllUsers() {
        return userRepository.findAll();
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }
}
    

4. 사용자 컨트롤러 테스트 적용하기

이제 컨트롤러에 대한 단위 테스트를 작성하겠습니다. @WebMvcTest 어노테이션을 사용하여 컨트롤러와 그 의존성을 테스트할 수 있습니다.


// UserControllerTest.java
@WebMvcTest(UserController.class)
public class UserControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private UserRepository userRepository;

    @Test
    public void testGetAllUsers() throws Exception {
        User user = new User();
        user.setId(1L);
        user.setName("John Doe");
        user.setEmail("john@example.com");

        List users = Arrays.asList(user);

        given(userRepository.findAll()).willReturn(users);

        mockMvc.perform(get("/api/users"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.length()").value(1))
            .andExpect(jsonPath("$[0].name").value("John Doe"));
    }

    @Test
    public void testCreateUser() throws Exception {
        User user = new User();
        user.setName("Jane Doe");
        user.setEmail("jane@example.com");

        String jsonRequest = new ObjectMapper().writeValueAsString(user);

        given(userRepository.save(any(User.class))).willReturn(user);

        mockMvc.perform(post("/api/users")
                .contentType(MediaType.APPLICATION_JSON)
                .content(jsonRequest))
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.name").value("Jane Doe"));
    }
}
    

5. 테스트 실행하기

테스트는 IDE에서 직접 실행할 수도 있고, Maven 또는 Gradle을 통해 커맨드라인에서 실행할 수도 있습니다. IDE에서는 테스트 클래스 이름 우클릭 후 “Run” 버튼을 클릭하여 실행할 수 있습니다.

6. 결론

본 강좌에서는 스프링 부트에서 테스트 컨트롤러를 감사하는 방법에 대한 기본 이해를 제공합니다. 유닛 테스트와 통합 테스트는 모두 애플리케이션의 품질 보증에 필수적입니다. 컨트롤러 테스트를 통해 API의 응답을 검증하고, 신뢰성 있는 애플리케이션을 개발하는 데 도움을 줍니다. 이러한 테스트 주도 개발(TDD) 방식은 코드의 유지보수성을 높이고, 향후 발생할 수 있는 버그를 사전에 방지하는 데 큰 도움이 됩니다.

앞으로도 계속해서 스프링 부트와 관련된 다양한 주제를 다루고, 깊이 있는 내용을 제공합니다. 감사합니다. 😊