Spring Boot로 REST API를 생성하는 방법

Spring Boot로 REST API를 생성하는 방법

약어 REST는 REpresentational State Transfer의 약자이고 API는 Application Programming Interface의 약자입니다. 이들은 함께 REST API를 참조합니다. REST API는 REST 아키텍처에서 두 소프트웨어 시스템 간에 요청과 응답을 전송하는 서비스입니다.

REST 아키텍처는 POST, GET, PUT 및 DELETE의 네 가지 요청 동사 중 하나를 사용하여 URL을 통해 액세스할 수 있는 웹 서비스를 구축합니다. 따라서 REST API는 URL을 통해 리소스를 생성, 읽기, 업데이트 및 삭제할 수 있는 소프트웨어라고 할 수 있습니다.

Spring Boot를 사용하여 REST API를 생성하는 방법을 배울 수 있습니다.

Spring Boot 애플리케이션 초기화

가장 먼저 해야 할 일은 Spring의 기본 사항을 숙지하고 Spring Boot 애플리케이션을 설정하는 것입니다. 하지만 종속성을 변경해야 합니다. 웹 종속성 외에도 Spring Data JPA(Java Persistent API) 종속성과 사용할 데이터베이스용 드라이버(이 애플리케이션은 MySQL을 사용함)를 가져와야 합니다.

이 REST API에는 컨트롤러, 모델 및 리포지토리가 필요합니다. 따라서 REST API의 파일 구조는 다음과 같습니다.

REST API 파일 구조

모델 만들기

생성해야 하는 첫 번째 클래스는 데이터 논리를 저장하는 고객 모델입니다.

package com.onlineshopaholics.api.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Table(name="customer")
@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name="customername")
    private String name;

    private String email;

    public Integer getId() {
        return id;
    }

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

위의 고객 클래스에서 각 고객이 ID, 이름 및 이메일을 가지고 있음을 알 수 있습니다. 또한 다양한 용도로 사용되는 몇 가지 주석을 볼 수 있습니다.

  • @Entity: 고객 클래스를 JPA 엔티티로 선언합니다. 즉, JPA는 클래스의 필드를 사용하여 관계형 데이터베이스의 열을 생성합니다.
  • @Table: 고객 모델 클래스에 매핑될 테이블의 이름을 지정합니다.
  • @Id: 데이터베이스에서 엔터티를 고유하게 식별하는 속성을 지정합니다.
  • @GeneratedValue 및 @GenerationType: 이들은 함께 작동하여 연관된 필드에 대한 자동 생성 전략을 지정합니다. 따라서 id 필드는 새 고객을 생성할 때마다 고유한 값을 자동으로 생성합니다.
  • @Column: 데이터베이스의 열에 매핑되는 속성을 지정합니다. 따라서 이름 속성은 데이터베이스의 고객 이름 열에 매핑됩니다.

리포지토리 생성

이 리포지토리를 사용하면 데이터베이스의 고객 데이터와 상호 작용할 수 있습니다.

package com.onlineshopaholics.api.repository;

import org.springframework.data.repository.CrudRepository;
import com.onlineshopaholics.api.model.Customer;

public interface CustomerRepository extends CrudRepository<Customer, Integer>{}

고객 저장소는 Spring의 CrudRepositoy<T,ID> 인터페이스를 확장하여 엔터티의 고유 식별자 유형 Integer와 함께 Customer 모델 클래스를 전달합니다.

CrudRepository 인터페이스는 REST API에 필요한 일반 CRUD 메서드를 포함하여 10개 이상의 작업에 대한 액세스를 제공합니다. 따라서 CrudRepository는 필요한 메서드를 이미 정의하고 있으므로 CustomerRepository 인터페이스에서 명시적으로 선언할 필요가 없습니다.

컨트롤러 만들기

컨트롤러를 사용하면 모델과 리포지토리를 사용하여 데이터베이스의 데이터를 업데이트할 수 있습니다.

package com.onlineshopaholics.api.controller;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.onlineshopaholics.api.model.Customer;
import com.onlineshopaholics.api.repository.CustomerRepository;

@RestController
@RequestMapping("/customers")
public class CustomerController {
    @Autowired
    private CustomerRepository customerRepository;

    // create new customer
    @PostMapping("/add")
    public Customer addNewCustomer(@RequestBody Customer newCustomer){
        Customer user = new Customer();
        user.setName(newCustomer.getName());
        user.setEmail(newCustomer.getEmail());
        customerRepository.save(user);
        return user;
    }

    // view all customers
    @GetMapping("view/all")
    public @ResponseBody Iterable<Customer> getAllCustomers(){
        return customerRepository.findAll();
    }

    // view specific customer
    @GetMapping("view/{id}")
    public Optional<Customer> getCustomer(@PathVariable Integer id) {
        return customerRepository.findById(id);
    }

    // update an existing customer
    @PutMapping("/edit/{id}")
    public String update(@RequestBody Customer updateCustomer, @PathVariable Integer id) {
        return customerRepository.findById(id)
                 .map(customer -> {
                       customer.setName(updateCustomer.getName());
                       customer.setEmail(updateCustomer.getEmail());
                       customerRepository.save(customer);
                       return "Customer details have been successfully updated!";
                 }).orElseGet(() -> {
                       return "This customer doesn't exist";
                 });
    }

    // delete customer
    @DeleteMapping("delete/{id}")
    public String delete(@PathVariable("id")Integer id) {
        customerRepository.deleteById(id);
        return "Customer has been successfully deleted!";
    }
}

위의 컨트롤러는 5개의 CrudRepository<T,ID> 인터페이스 메서드(각각 특정 메서드에 할당됨)를 사용하여 REST API에 CRUD 작업을 제공합니다. 컨트롤러는 또한 기능을 수행할 수 있도록 하는 몇 가지 중요한 Spring 주석을 사용합니다.

  • @RestController: 이 주석은 두 가지 용도로 사용됩니다. 구성 요소 검색을 통해 검색할 클래스를 표시합니다. 또한 이 클래스의 모든 메소드에 대한 반환 값을 응답 본문에 쓰도록 Spring에 지시합니다.
  • @RequestMapping: 컨트롤러가 처리할 기본 요청 패턴을 정의합니다. 따라서 이 컨트롤러는 “/customers”에 대한 모든 요청을 처리합니다.
  • @ResponseBody: 메서드가 전체 엔터티를 반환하도록 허용합니다.
  • @RequestBody: 요청 본문을 객체로 변환할 수 있습니다.
  • @RequestParam: 객체에서 하나의 속성을 분리할 수 있습니다.
  • @PathVariable: 요청 값을 자리 표시자에 매핑할 수 있습니다. 삭제 메소드에 제공된 ID를 데이터베이스의 기존 값과 맵핑합니다.
  • @PostMapping: 리소스를 생성할 수 있습니다.
  • @GetMapping: 리소스 데이터를 읽을 수 있습니다.
  • @PutMapping: 리소스를 업데이트할 수 있습니다.
  • @DeleteMapping: 리소스를 삭제할 수 있습니다.

애플리케이션에 데이터베이스 연결

데이터베이스를 Spring 애플리케이션에 연결하려면 리소스 폴더 아래의 application.properties 파일 을 사용해야 합니다. 이 파일은 처음에는 비어 있으므로 사용하려는 데이터베이스에 대한 적절한 속성으로 채울 수 있습니다. 이 애플리케이션은 MySQL 데이터베이스를 사용하므로 application.properties 파일에는 다음 데이터가 포함됩니다.

spring.jpa.hibernate.ddl-auto=update
spring.jpa.open-in-view=false
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/onlineshopaholics
spring.datasource.username=root
spring.datasource.password=securepw
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

위의 데이터는 이 애플리케이션이 “root” 사용자 이름과 암호로 “securepw”를 사용하여 onlineshopaholics라는 MySQL 데이터베이스에 연결됨을 보여줍니다. 다음 단계는 MySQL에서 데이터베이스와 고객 테이블을 생성하는 것입니다.

요청 생성

REST API를 테스트하는 데 사용할 수 있는 많은 도구가 있습니다. Postman은 널리 사용되는 REST API 테스트 도구이며 이를 사용하여 구축한 간단한 API를 테스트할 수 있습니다. MySQL 테이블을 생성하고 Spring 애플리케이션을 실행한 후 Postman을 시작하고 4개의 요청 동사로 실험할 수 있습니다.

POST 요청

이 요청을 통해 REST API를 사용하여 새 고객을 만들 수 있습니다. 이 요청을 완료하려면 게시물 요청의 헤더 섹션으로 이동하여 새 헤더(Content-Type)를 생성해야 합니다. JSON을 사용하여 새 고객을 생성할 것이므로 이 헤더의 값을 application/json으로 설정해야 합니다.

REST API 게시물 헤더

요청 본문에서 유형을 원시로 변경하고 JSON을 삽입해야 합니다. 그런 다음 게시물 URL을 삽입해야 합니다.

REST API 게시물 본문

요청을 보내면 다음 응답이 반환됩니다.

REST API 사후 응답

요청이 성공했고 새 고객에게도 ID가 있음을 알 수 있습니다.

GET 요청

이제 고객이 있으므로 모든 고객을 반환하는 get 요청으로 고객을 볼 수 있습니다.

REST API 응답 받기

또는 ID별 각 고객:

ID 응답으로 REST API 가져오기

PUT 요청

새 성과 이메일로 Janet을 업데이트할 수 있습니다.

REST API 입력 응답

삭제 요청

데이터베이스에서 Janet을 삭제할 수도 있습니다.

REST API 삭제 응답

JUnit을 사용하여 Spring REST API 테스트

Spring Boot를 사용하면 Spring의 테스트 파일을 사용하여 모든 애플리케이션(REST API 포함)을 테스트할 수 있습니다. 소프트웨어 테스트는 Spring Boot에 중요합니다. 초기화된 각 Spring 애플리케이션은 테스트를 위해 JUnit을 사용하며 REST API에 요청을 보낼 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다