본문 바로가기

Study Information Technology

Spring Boot로 RESTful API 구축하기

728x90
반응형

Spring Boot로 RESTful API 구축하기

Overview

Spring Boot는 Java 개발자들에게 매우 인기 있는 프레임워크로, 간편하고 신속하게 애플리케이션을 개발할 수 있는 환경을 제공합니다. 특히 RESTful API를 구축하는 데 유용한 기능들을 제공하여, 다양한 클라이언트가 사용할 수 있는 서비스를 쉽게 만들 수 있습니다. 본 글에서는 Spring Boot를 사용하여 RESTful API를 구축하는 방법을 단계별로 자세히 설명하겠습니다. 각 단계에서는 코드 예시, 에러 처리, 그리고 해결책을 포함하여 실용적인 정보를 제공할 것입니다.

1. Spring Boot 프로젝트 설정

프로젝트 생성
Spring Boot 프로젝트를 생성하는 가장 간단한 방법은 Spring Initializr를 사용하는 것입니다. 이 사이트를 통해 Maven 또는 Gradle 프로젝트를 선택하고 필요한 의존성을 추가할 수 있습니다. 예를 들어, RESTful API 구축을 위한 Spring Web 의존성을 추가해야 합니다.

Group: com.example
Artifact: demo
Dependencies: Spring Web, Spring Data JPA, H2 Database

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

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

2. 모델 클래스 정의

RESTful API에서는 데이터 전송 객체(DTO)를 사용하여 클라이언트와 서버 간에 데이터를 교환합니다. 간단한 예로 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
public Long getId() {
return id;
}

public void setId(Long 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;
}
}

3. 데이터베이스 연결 설정

application.properties 파일에서 H2 데이터베이스와 연결 설정을 추가합니다.

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

4. 리포지토리 인터페이스 작성

Spring Data JPA를 사용하여 CRUD 작업을 수행할 수 있는 리포지토리 인터페이스를 작성합니다.

package com.example.demo.repository;

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

public interface UserRepository extends JpaRepository<User, Long> {
}

5. REST 컨트롤러 작성

이제 클라이언트의 요청을 처리할 REST 컨트롤러를 작성하겠습니다.

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.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {

@Autowired
private UserRepository userRepository;

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

@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User savedUser = userRepository.save(user);
return new ResponseEntity<>(savedUser, HttpStatus.CREATED);
}

@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return userRepository.findById(id)
.map(user -> new ResponseEntity<>(user, HttpStatus.OK))
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}

@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User userDetails) {
return userRepository.findById(id)
.map(user -> {
user.setName(userDetails.getName());
user.setEmail(userDetails.getEmail());
User updatedUser = userRepository.save(user);
return new ResponseEntity<>(updatedUser, HttpStatus.OK);
})
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
return userRepository.findById(id)
.map(user -> {
userRepository.delete(user);
return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
})
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
}

6. 에러 처리

위 코드에서 다양한 HTTP 상태 코드를 반환하도록 설정했습니다. 예를 들어, 사용자가 존재하지 않을 경우 404 Not Found를 반환합니다. 이를 통해 클라이언트는 요청이 성공했는지, 실패했는지를 쉽게 알 수 있습니다.

에러 처리를 좀 더 세부적으로 하고 싶다면, 예외 처리 클래스(@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(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResponseEntity<String> handleGeneralException(Exception ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}

7. 테스트

API를 테스트하기 위해 Postman과 같은 도구를 사용할 수 있습니다. 각 엔드포인트에 대해 GET, POST, PUT, DELETE 요청을 시도해 보세요. 예를 들어, 새로운 사용자를 생성하기 위한 POST 요청은 다음과 같은 JSON 데이터를 포함해야 합니다.

{
  "name": "John Doe",
  "email": "john@example.com"
}

이 요청을 통해 서버는 새로운 사용자 데이터를 생성하고 201 Created 응답을 반환합니다. 잘못된 데이터 형식으로 요청할 경우 400 Bad Request를 받을 수 있습니다.

8. 마무리 및 배포

이제 RESTful API가 기본적으로 작동하는 상태입니다. 추가적인 기능(예: 보안, JWT 인증 등)을 구현하여 더욱 견고한 서비스를 구축할 수 있습니다. 배포는 AWS, Heroku와 같은 플랫폼을 통해 손쉽게 진행할 수 있습니다.

참고문서

이상으로 Spring Boot를 사용한 RESTful API 구축 방법에 대해 자세히 설명드렸습니다. 추가적인 질문이나 구현하고 싶은 특정 기능이 있다면 언제든지 말씀해 주세요!

반응형