스프링 부트 백엔드 개발 강좌, 스프링 부트 3와 테스트

현대 소프트웨어 개발에서는 빠른 배포와 유연성이 매우 중요합니다. 이러한 요구사항을 충족시키기 위해 스프링 부트(Spring Boot)는 많은 개발자들 사이에서 인기를 얻고 있습니다. 이 글에서는 스프링 부트 3의 주요 기능과 효과적인 테스트 방법에 대해 상세히 알아보겠습니다.

1. 스프링 부트의 이해

스프링 부트는 스프링 프레임워크를 기반으로 하는 개발 도구로, 스프링 애플리케이션을 보다 쉽게 설정하고 실행할 수 있도록 만들어진 프레임워크입니다. 스프링 부트를 사용하면 복잡한 XML 설정을 피하고, 간단한 애너테이션을 통해 애플리케이션을 설정할 수 있습니다.

1.1 스프링 부트의 특징

  • 자동 설정(Automatic Configuration): 스프링 부트는 사용자가 필요한 설정을 자동으로 구성하여 개발 시간을 단축시킵니다.
  • 자체 실행 가능(Standalone): 스프링 부트 프로젝트는 독립 실행형 JAR 파일로 패키징되어 쉽게 배포할 수 있습니다.
  • 설정의 간소화(Simplified Configuration): 복잡한 XML 설정을 줄이고, 애너테이션을 활용하여 간단하게 설정할 수 있습니다.
  • 커스터마이징(Simple Customization): 다양한 프로퍼티를 통해 애플리케이션의 동작을 쉽게 커스터마이징할 수 있습니다.

2. 스프링 부트 3의 새로운 기능

스프링 부트 3는 이전 버전들에 비해 여러 가지 새로운 기능과 개선점이 추가되었습니다. 이 섹션에서는 주요 기능을 살펴보겠습니다.

2.1 자바 17 지원

스프링 부트 3는 자바 17을 기본적으로 지원합니다. 자바 17의 새로운 기능과 개선 사항을 활용하여 더 안전하고 효율적인 코드를 작성할 수 있습니다.

2.2 새로운 종속성 관리

스프링 부트 3는 다양한 종속성을 보다 쉽게 관리할 수 있는 새로운 메커니즘을 제공하여 개발자들이 필요에 따라 라이브러리를 선택하고 버전을 조정할 수 있도록 돕습니다.

2.3 개선된 성능

스프링 부트 3는 애플리케이션의 킬체인 성능을 개선하기 위해 내부 엔진을 최적화하였습니다. 이로 인해 더 빠른 부팅 시간과 더 나은 응답 속도를 기대할 수 있습니다.

3. 스프링 부트 3로 백엔드 개발하기

이제 스프링 부트를 사용하여 간단한 CRUD(Create, Read, Update, Delete) 애플리케이션을 만드는 과정을 살펴보겠습니다. 단계별로 진행해 보겠습니다.

3.1 프로젝트 설정

스프링 부트 애플리케이션을 시작하기 위해 필요한 설정을 해보겠습니다. 먼저, Spring Initializr를 통해 새로운 프로젝트를 생성합니다. 필요한 의존성으로는 ‘Spring Web’, ‘Spring Data JPA’, ‘H2 Database’ 등을 선택합니다.

3.2 애플리케이션 구조

생성된 프로젝트 구조는 다음과 같습니다.

src
└── main
    ├── java
    │   └── com
    │       └── example
    │           └── demo
    │               ├── DemoApplication.java
    │               ├── controller
    │               ├── model
    │               └── repository
    └── resources
        └── application.properties

3.3 모델 클래스 생성

먼저, 데이터베이스에 저장할 엔티티 클래스를 생성합니다. 예를 들어, ‘User’라는 모델 클래스를 생성해 보겠습니다.

package com.example.demo.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters and setters
}

3.4 리포지토리 인터페이스 생성

스프링 데이터 JPA를 사용하여 데이터베이스와 상호작용할 리포지토리 인터페이스를 생성합니다.

package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository {
}

3.5 컨트롤러 클래스 생성

RESTful API를 제공하기 위해 컨트롤러 클래스를 작성합니다.

package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@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);
    }
    
    // Add methods for updating and deleting users
}

3.6 애플리케이션 실행

모든 설정이 완료되면, 애플리케이션을 실행해 보십시오. ./mvnw spring-boot:run 명령어를 사용하여 실행할 수 있습니다.

4. 스프링 부트 테스트

애플리케이션을 개발하는 과정에서 테스트는 매우 중요합니다. 스프링 부트는 테스트를 위한 다양한 도구와 프레임워크를 제공합니다.

4.1 스프링 부트에서의 테스트 유형

스프링 부트에서는 여러 유형의 테스트를 지원합니다:

  • 단위 테스트(Unit Test): 개별 메서드 또는 클래스의 동작을 검증합니다.
  • 통합 테스트(Integration Test): 여러 구성 요소가 함께 작동하는지를 검증합니다.
  • 엔드 투 엔드 테스트(End-to-End Test): 애플리케이션 전체 기능이 잘 작동하는지를 검증합니다.

4.2 단위 테스트 작성

간단한 단위 테스트를 작성해 보겠습니다. JUnit 5와 Mockito를 사용하여 UserService 클래스를 테스트합니다.

package com.example.demo.service;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.Mockito.when;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class UserServiceTest {

    @InjectMocks
    private UserService userService;

    @Mock
    private UserRepository userRepository;

    public UserServiceTest() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    void testCreateUser() {
        User user = new User();
        user.setName("John Doe");
        user.setEmail("john@example.com");

        when(userRepository.save(user)).thenReturn(user);

        User createdUser = userService.createUser(user);
        assertEquals("John Doe", createdUser.getName());
    }
}

4.3 통합 테스트 작성

스프링 부트에서 통합 테스트를 수행하는 방법도 살펴보겠습니다. 이를 위해 @SpringBootTest 애너테이션을 사용할 수 있습니다.

package com.example.demo;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testCreateUser() throws Exception {
        String json = "{\"name\":\"John Doe\", \"email\":\"john@example.com\"}";

        mockMvc.perform(post("/api/users")
                .contentType("application/json")
                .content(json))
                .andExpect(status().isCreated());
    }
}

5. 결론

이번 기회를 통해 스프링 부트 3의 주요 기능과 테스트 방법에 대해 알아보았습니다. 스프링 부트는 개발자가 애플리케이션을 빠르게 구축하고, 안정적으로 운영할 수 있도록 도와주는 강력한 도구입니다. 다양한 기능을 활용하여 효과적으로 백엔드 시스템을 개발하고, 테스트를 통해 애플리케이션의 품질을 높이는 것이 중요합니다.

앞으로도 스프링 부트를 통해 더 많은 프로젝트를 진행하며 경험을 쌓고, 더 나은 개발자로 성장해 나가시길 바랍니다.