본문 바로가기

Study Information Technology

Spring Boot와 MongoDB 통합하기

728x90
반응형

Spring Boot와 MongoDB 통합하기

Overview

Spring Boot는 Java 개발자들이 애플리케이션을 쉽게 개발할 수 있도록 돕는 프레임워크입니다. MongoDB는 NoSQL 데이터베이스 중 하나로, 비정형 데이터를 유연하게 저장하고 처리할 수 있습니다. Spring Boot와 MongoDB를 통합하면, 데이터베이스 설계나 쿼리 작성에 있어서 유연성을 극대화하면서도, Spring Boot의 편리한 기능들을 활용할 수 있습니다. 이번 설명에서는 Spring Boot 애플리케이션과 MongoDB를 통합하는 방법을 자세히 다루겠습니다.


1. 프로젝트 설정

1.1. Spring Boot 초기 설정

Spring Boot 애플리케이션을 시작하려면, 먼저 spring-boot-starter-data-mongodb 의존성을 포함한 프로젝트를 생성해야 합니다. 이 작업은 Spring Initializr를 통해 간편하게 할 수 있습니다.

Spring Initializr 사용 방법:

  1. Spring Initializr에 접속합니다.
  2. 프로젝트 메타데이터를 입력합니다:
  • Project: Maven Project
  • Language: Java
  • Spring Boot: 2.7.5 (최신 버전 확인 후 선택)
  • Group: com.example
  • Artifact: demo
  • Name: demo
  • Packaging: Jar
  • Java: 11 (또는 사용 중인 JDK 버전)
  1. Dependencies를 추가합니다:
  • Spring Data MongoDB
  • Spring Web (웹 애플리케이션을 만들 경우)
  1. Generate 버튼을 클릭하여 ZIP 파일을 다운로드하고, 이를 압축 해제하여 IDE에서 엽니다.

1.2. 의존성 추가

pom.xml 파일에 MongoDB 의존성이 포함되어 있어야 합니다. Spring Initializr에서 자동으로 추가되지만, 수동으로 추가할 경우 아래의 의존성을 넣습니다:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2. MongoDB 설정

2.1. MongoDB 연결 설정

application.properties 또는 application.yml 파일에 MongoDB 연결 정보를 설정합니다. application.properties 파일을 사용하는 경우, 다음과 같이 설정합니다:

spring.data.mongodb.uri=mongodb://localhost:27017/mydatabase
  • localhost는 MongoDB 서버의 호스트 주소입니다.
  • 27017은 MongoDB의 기본 포트입니다.
  • mydatabase는 사용할 데이터베이스의 이름입니다.

application.yml 파일을 사용하는 경우, 설정은 다음과 같습니다:

spring:
data:
mongodb:
uri: mongodb://localhost:27017/mydatabase

2.2. MongoDB 클라이언트 라이브러리 추가

MongoDB와의 연결을 위해 mongodb-driver와 같은 클라이언트 라이브러리를 추가할 수 있습니다. Spring Boot에서는 이 라이브러리가 자동으로 포함됩니다.

3. 도메인 모델 정의

3.1. 도메인 클래스 작성

MongoDB에 저장할 데이터를 표현하기 위해 도메인 클래스를 정의합니다. 예를 들어, 사용자 정보를 저장하는 User 클래스를 다음과 같이 작성할 수 있습니다:

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "users")
public class User {
@Id
private String id;
private String name;
private String email;

// 기본 생성자
public User() {}

// 생성자
public User(String name, String email) {
this.name = name;
this.email = email;
}

// getter와 setter
public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}
}
  • @Document 애노테이션은 이 클래스가 MongoDB의 users 컬렉션과 매핑된다는 것을 나타냅니다.
  • @Id 애노테이션은 MongoDB 문서의 고유 식별자 필드를 지정합니다.

4. 레포지토리 인터페이스 정의

4.1. MongoRepository 인터페이스 생성

Spring Data MongoDB는 데이터베이스 작업을 단순화하기 위해 MongoRepository 인터페이스를 제공합니다. UserRepository 인터페이스를 다음과 같이 작성합니다:

import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserRepository extends MongoRepository<User, String> {
// 사용자 정의 쿼리 메서드 추가 가능
User findByEmail(String email);
}
  • MongoRepository<User, String>User 도메인 객체를 사용하여 MongoDB와 상호작용할 수 있게 합니다.
  • findByEmail 메서드는 사용자 정의 쿼리 메서드 예제입니다.

5. 서비스 및 컨트롤러 작성

5.1. 서비스 클래스 작성

비즈니스 로직을 처리하기 위해 서비스 클래스를 작성합니다. 예를 들어, 사용자 서비스를 다음과 같이 정의할 수 있습니다:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
@Autowired
private UserRepository userRepository;

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

public User getUserByEmail(String email) {
return userRepository.findByEmail(email);
}

public void deleteUserById(String id) {
userRepository.deleteById(id);
}
}
  • @Service 애노테이션은 이 클래스가 서비스 역할을 한다는 것을 나타냅니다.
  • @Autowired는 Spring이 UserRepository 인스턴스를 주입해 줍니다.

5.2. 컨트롤러 클래스 작성

REST API를 제공하기 위해 컨트롤러 클래스를 작성합니다. 예를 들어, 사용자 컨트롤러는 다음과 같이 작성할 수 있습니다:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;

@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User createdUser = userService.createUser(user);
return ResponseEntity.ok(createdUser);
}

@GetMapping("/{email}")
public ResponseEntity<User> getUserByEmail(@PathVariable String email) {
User user = userService.getUserByEmail(email);
return user != null ? ResponseEntity.ok(user) : ResponseEntity.notFound().build();
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUserById(@PathVariable String id) {
userService.deleteUserById(id);
return ResponseEntity.noContent().build();
}
}
  • @RestController는 이 클래스가 REST API를 제공하는 컨트롤러임을 나타냅니다.
  • @RequestMapping은 기본 URL 경로를 설정합니다.
  • @PostMapping, @GetMapping, @DeleteMapping은 HTTP 메서드에 따라 요청을 처리합니다.

6. 예외 처리

6.1. 예외 처리 방법

MongoDB 작업 중 에러가 발생할 수 있으며, 이를 처리하기 위해 @ControllerAdvice를 사용하여 전역적으로 예외를 처리할 수 있습니다. 예를 들어, 사용자 정의 예외를 생성하고 처리하는 방법은 다음과 같습니다:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}

// 다른 예외 처리기 추가 가능
}
  • @ControllerAdvice는 전역 예외 처리를 가능하게 합니다.
  • @ExceptionHandler는 특정 예외를 처리할 메서드를 정의합니다.

7. 테스트

7.1. 단위 테스트 작성

Spring Boot는 JUnit과 Spring Test를 사용하여 테스트를 작성할 수 있습니다. UserService를 테스트하는 예제는 다음과 같습니다:

import static org.mockito.Mockito.*;
import static org.assertj.core.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserServiceTests {

@Mock
private UserRepository userRepository;

@InjectMocks
private UserService userService;

@Test
void testCreateUser() {
User user = new User("John Doe", "john@example.com");
728x90
반응형