3. 스프링 부트 기초
스프링 부트의 기본 개념과 동작 원리, 주요 기능 등에 대해 다룹니다. 스프링 부트는 자바 기반의 웹 애플리케이션 개발을 위한 프레임워크로, 높은 생산성과 간편한 설정 방법 등의 장점을 가지고 있습니다. 이번 섹션에서는 스프링 부트의 핵심 개념과 함께 이를 활용한 간단한 웹 애플리케이션 구축 방법에 대해 다룹니다. 또한, 스프링 부트의 자동 설정과 스타터 종속성을 이용한 프로젝트 설정 방법, 스프링 부트의 테스트 방법 등에 대해서도 다룹니다. 이러한 내용들을 다루면서 스프링 부트의 기본 개념과 사용 방법에 대한 이해를 높일 수 있습니다.
3.1. 프로젝트 구조 이해
스프링 부트 프로젝트의 구조를 이해하는 것은 애플리케이션 개발에 있어 중요한 요소입니다. 이번 섹션에서는 프로젝트 디렉토리 구조와 주요 설정 파일에 대해 설명합니다.
3.1.1. 프로젝트 디렉토리 구조
스프링 부트 프로젝트의 기본 디렉토리 구조는 다음과 같습니다.
mybatis-demo
├─ src
│ ├─ main
│ │ ├─ java
│ │ │ └─ com.example.mybatisdemo
│ │ │ ├─ controller
│ │ │ ├─ domain
│ │ │ ├─ mapper
│ │ │ └─ service
│ │ └─ resources
│ │ ├─ application.properties
│ │ ├─ mybatis
│ │ │ └─ mapper
│ │ │ └─ UserMapper.xml
│ └─ test
│ └─ java
│ └─ com.example.mybatisdemo
├─ .gitignore
├─ build.gradle
└─ README.md
- src/main/java : 자바 소스 코드가 위치하는 폴더입니다. 컨트롤러, 도메인, 매퍼, 서비스 등의 패키지를 포함합니다.
- src/main/resources : 리소스 파일이 위치하는 폴더입니다. 설정 파일, 매퍼 XML 파일 등이 포함됩니다.
- src/test/java : 테스트 소스 코드가 위치하는 폴더입니다.
- build.gradle : 프로젝트의 빌드 및 의존성 관리를 설정하는 파일입니다.
3.1.2. 주요 설정 파일
스프링 부트 프로젝트에서는 몇 가지 주요 설정 파일을 사용합니다.
- application.properties : 애플리케이션 전반에 걸친 설정을 지정하는 파일입니다. 데이터베이스 연결 정보, 서버 포트, 로깅 설정 등을 지정할 수 있습니다.
▶ 예제 코드
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=my_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- mybatis/mapper/*.xml : 마이바티스 매퍼 XML 파일들입니다. SQL 쿼리와 자바 객체 간의 매핑 정보를 지정합니다.
▶ 예제 코드 (UserMapper.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mybatisdemo.mapper.UserMapper">
<select id="findAll" resultType="com.example.mybatisdemo.domain.User">
SELECT * FROM users
</select>
<select id="findById" parameterType="int" resultType="com.example.mybatisdemo.domain.User">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insert" parameterType="com.example.mybatisdemo.domain.User">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
<update id="update" parameterType="com.example.mybatisdemo.domain.User">
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
<delete id="delete" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
3.2. 주요 어노테이션
스프링 부트와 마이바티스에서 사용되는 주요 어노테이션을 알아봅시다. 어노테이션은 코드의 동작을 조작하거나 설정하는 데 사용되며, 가독성과 유지 보수성을 향상합니다.
3.2.1. 스프링 부트 어노테이션
- @SpringBootApplication: 스프링 부트 애플리케이션의 시작점을 지정하는 어노테이션입니다. 이 어노테이션은
- @Configuration, @EnableAutoConfiguration, @ComponentScan을 포함하고 있습니다.
- @Autowired: 의존성 주입을 위한 어노테이션입니다. 스프링이 자동으로 해당 타입의 빈을 찾아 주입해 줍니다.
- @RestController: 컨트롤러 클래스를 나타내는 어노테이션입니다. 이 어노테이션은 @Controller와 @ResponseBody를 합친 것으로, 반환값이 자동으로 JSON 형태로 변환됩니다.
- @RequestMapping: 요청을 처리할 메서드를 지정하는 어노테이션입니다. 이 어노테이션은 HTTP 메서드와 URL을 매핑합니다.
3.2.2. 마이바티스 어노테이션
- @Mapper: 마이바티스의 매퍼 인터페이스를 나타내는 어노테이션입니다. 이 어노테이션을 사용하면 XML 파일 없이 인터페이스에서 직접 SQL 쿼리를 작성할 수 있습니다.
- @Select, @Insert, @Update, @Delete: SQL 쿼리를 지정하는 어노테이션입니다. 각각 SELECT, INSERT, UPDATE, DELETE 쿼리에 사용됩니다. 이러한 어노테이션들은 @Mapper 인터페이스 내의 메서드에 적용됩니다.
- @Results: 쿼리 결과를 도메인 객체에 매핑하는 어노테이션입니다. @Result 어노테이션을 사용해 컬럼과 객체의 속성을 연결할 수 있습니다.
3.3. 컨트롤러, 서비스, 레포지토리 작성
스프링 부트와 마이바티스를 연동할 때, 컨트롤러, 서비스, 레포지토리를 작성하여 애플리케이션의 기능을 구현합니다. 각각의 역할과 작성 방법을 알아봅시다.
3.3.1. 컨트롤러 클래스 작성
컨트롤러는 클라이언트 요청을 받아 처리하고, 응답을 반환하는 역할을 합니다. @RestController 어노테이션을 사용하여 컨트롤러 클래스를 작성하고, @RequestMapping을 사용하여 URL과 메서드를 매핑합니다.
▶ 예제 코드
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getAllUsers() {
return userService.findAll();
}
}
3.3.2. 서비스 클래스 작성
서비스는 비즈니스 로직을 수행하는 역할을 합니다. 서비스 클래스를 작성할 때는 @Service 어노테이션을 사용합니다. 서비스 클래스에서는 레포지토리를 사용하여 데이터를 처리합니다.
▶ 예제 코드
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> findAll() {
return userRepository.findAll();
}
}
3.3.3. 레포지토리 인터페이스 작성
레포지토리는 데이터베이스와의 연동을 담당하는 역할을 합니다. 마이바티스를 사용할 경우, @Mapper 어노테이션을 사용하여 레포지토리 인터페이스를 작성합니다. 이 인터페이스에는 SQL 쿼리를 작성한 메서드가 포함됩니다.
▶ 예제 코드
@Mapper
public interface UserRepository {
@Select("SELECT * FROM users")
List<User> findAll();
}
이제 컨트롤러, 서비스, 레포지토리의 역할과 작성 방법을 이해했습니다. 이를 통해 스프링 부트와 마이바티스를 연동하여 애플리케이션을 구현할 수 있습니다.
3.4. 테스트 코드 작성
스프링 부트와 마이바티스를 사용한 프로젝트에서 테스트 코드 작성은 매우 중요합니다. 이번 섹션에서는 JUnit 테스트 프레임워크와 Mockito를 사용한 단위 테스트 작성 방법을 알아봅시다.
3.4.1. JUnit 테스트 프레임워크
JUnit은 자바에서 가장 널리 사용되는 테스트 프레임워크입니다. 스프링 부트 프로젝트에서는 기본적으로 JUnit 5를 사용할 수 있습니다. 테스트 클래스를 작성할 때는 @Test 어노테이션을 사용하여 테스트 메서드를 정의합니다.
▶ 예제 코드
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class UserServiceTest {
@Test
public void testFindAll() {
// 테스트 코드 작성
assertEquals(1, 1);
}
}
3.4.2. Mockito를 사용한 단위 테스트
Mockito는 외부 의존성을 제거하고 단위 테스트를 작성할 수 있도록 도와주는 모킹 라이브러리입니다. Mockito를 사용하여 서비스 또는 컨트롤러에 대한 단위 테스트를 작성할 수 있습니다. 예를 들어, UserRepository를 모킹하여 UserService의 테스트를 작성해 봅시다.
▶ 예제 코드
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@InjectMocks
private UserService userService;
@Mock
private UserRepository userRepository;
@Test
public void testFindAll() {
// Given
List<User> expectedUsers = Arrays.asList(new User(1, "Alice"), new User(2, "Bob"));
when(userRepository.findAll()).thenReturn(expectedUsers);
// When
List<User> actualUsers = userService.findAll();
// Then
assertEquals(expectedUsers, actualUsers);
}
}
JUnit과 Mockito를 사용하여 스프링 부트와 마이바티스 프로젝트의 테스트 코드를 작성하는 방법을 알았습니다. 이를 통해 더 안정적인 애플리케이션을 구현할 수 있습니다.
'GD's IT Lectures : 기초부터 시리즈 > 스프링 부트(Spring Boot) & 마이바티스(Mybatis) 연동' 카테고리의 다른 글
[스프링 부트(Spring Boot) & 마이바티스(Mybatis) 연동] 마이바티스 기초 (0) | 2023.05.06 |
---|---|
[스프링 부트(Spring Boot) & 마이바티스(Mybatis) 연동] 데이터베이스 설정 (0) | 2023.05.06 |
[스프링 부트(Spring Boot) & 마이바티스(Mybatis) 연동] 개발 환경 설정 (0) | 2023.05.06 |
[스프링 부트(Spring Boot) & 마이바티스(Mybatis) 연동] 서론 (0) | 2023.05.06 |
[스프링 부트(Spring Boot) & 마이바티스(Mybatis) 연동] 연동이란? (0) | 2023.05.06 |
댓글