관리 메뉴

거니의 velog

(6) 스프링 부트와 API 서버 1 본문

SpringBoot_React 풀스택 프로젝트

(6) 스프링 부트와 API 서버 1

Unlimited00 2024. 2. 26. 21:50

* 최근의 애플리케이션 개발 방향화면을 구성하는 프론트엔드와 화면에 필요한 데이터를 제공하는 백엔드의 철저한 분리이다. 이런 구조에서 프론트엔드 애플리케이션에 데이터를 전달하는 서버를 API 서버라고 한다.
* API 서버는 화면을 구성하는 대신에 데이터를 전달하는 것만을 처리한다. 기존의 GET/POST 전송 방식을 벗어나 PUT/DELETE/OPTIONS 등의 다양한 방식을 활용하고 XML이나 JSON 등을 이용하는데 이처럼 다양한 방식으로 특정한 자원을 처리하는 서비스를 'RESTful'하다고 표현한다. 이번 장에서는 스프링 부트를 이용해서 RESTful한 API 서버를 구성해 보자.
* 이번 장의 개발 목표는 다음과 같다.

(1) Spring Data JPA를 이용한 데이터 처리

(2) DTO와 엔티티 객체의 변환과 처리

(3) 스프링 부트 RESTful 서비스 개발

1. 프로젝트 설정

* 예제 프로젝트는 이전 장에서 구성된 mallapi 프로젝트로 할 것이다. VSCode에 추가된 STS(Spring Tool Suites) 플러그인으로 프로젝트를 생성하였다.


[NOTE]
* 스프링 부트는 웹사이트에서도 프로젝트를 생성하고, 다운로드해서 사용하는 방식도 가능하다.
https://start.spring.io/

* 이 사이트에서 프로젝트를 생성해서 사용할 수 있는데 개발 도구에서 스프링 부트를 지원하지 않는 경우 유용하게 사용할 수 있는 방법이다.
* 공식적으로 스프링 프레임워크는 스프링 부트로 전환되었기 때문에 스프링의 개발에는 STS 4 버전이 사용된다. STS 3 버전은 기존의 스프링 프레임워크를 지원했지만, 비공식적인 지원만이 남아 있다.


* 프로젝트의 src/main/resources 폴더에 있는 application.properties 내용을 다시 확인해 보자.

# 데이터베이스 관련 설정
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/malldb
spring.datasource.username=malldbuser
spring.datasource.password=malldbuser

# JPA에서 생성하는 SQL 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true

* application.properties 에 작성된 내용 중 위의 4라인은 데이터베이스 관련 설정이다. 스프링 부트의 경우 데이터베이스 처리는 HikariCP라는 커넥션풀을 사용하는데, 위의 정보들이 가장 최소한의 정보이다. 만일 세밀한 설정이 더 필요하다면 'spring datasource...' 설정들을 추가할 수 있다(maximumPoolSize, connectionTimeout 등등).
* 스프링 프레임워크는 설정이 잘못되면 프로젝트 자체가 실행되지 않기 때문에 항상 개발 전에 프로젝트의 실행 여부를 반드시 확인해야 한다. VSCode는 프로젝트의 내용이 변경되면 자동으로 다시 시작하는 기능(hot swapping)이 지원되기 때문에 매번 서버를 다시 시작하는 불편함을 줄일 수 있다.
* 프로젝트의 정상 동작은 프로젝트 생성 시에 자동으로 만들어진 MallapiApplicaion.java를 실행해서 확인한다.

* 프로젝트의 실행이 준비된 상태라면 아래 그림처럼 'Run | Debug'를 선택할 수 있다.


(1) Spring Data JPA 설정

* 스프링 부트는 다양한 방식으로 데이터베이스와의 연동을 지원하지만, 프로젝트에서는 JPA를 쉽게 이용할 수 있는 'Spring Data JPA'를 이용한다. 'Spring Data JPA'는 설정에 따라서 자동으로 테이블의 생성까지도 지원하고 데이터베이스 처리에 필요한 SQL의 생성도 자동으로 해주기 때문에 개발 시간을 단축시킬 수 있다.
* application.properties 파일에 자동으로 테이블이 생성되거나 변경될 수 있는 옵션이 추가되어 있다.

# JPA에서 생성하는 SQL 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true

* spring.jpa.hibernate.ddl-auto 설정은 SQL의 DDL(테이블 생성이나 객체를 생성할 때 사용) 기능을 의미하는데 다음과 같은 속성값을 이용할 수 있다.

- create : 기존 테이블 삭제 후 다시 생성(DROP + CREATE)

- create-drop : create와 같으나 종료 시점에 테이블 DROP

- update : 변경 분만 반영(개발 환경에서만 사용할 것)

- validate : 엔티티와 테이블이 정상적인지만 확인

- none : DDL 처리에 관여하지 않음

* 프로젝트 설정에 사용한 update는 변경된 내용을 다시 데이터베이스에 반영해 주고, 기존의 테이블을 삭제하지 않기 때문에 테스트에 적합하다(간혹 문제가 발생하는 경우에는 테이블을 삭제하고 다시 실행하면 테이블이 생성된다).
* spring.jpa.properties.hibernate.format_sql=true 는 스프링 부트가 실행되면서 사용하는 SQL들의 포맷팅을 의미하는데 true 인 경우 줄바꿈 처리가 되기 때문에 좀 더 알아보기 쉬워진다. spring.jpa.show_sql=true 는 말 그대로 실행 과정에서 만들어지는 SQL문을 출력할 것인지를 의미한다.


(2) 엔티티 클래스 작성

* JPA는 엔티티(entity) 객체를 사용해서 데이터베이스와 애플리케이션 사이에 데이터를 동기화하고 관리한다. 엔티티 객체를 생성하기 위해서는 엔티티 클래스를 생성하는데 이를 위해서 domain 패키지를 추가하고 Todo 클래스를 추가한다.

* Spring Data JPA에서 엔티티를 설정하는 방법은 어노테이션들을 추가해서 처리한다. @Entity 가 있는 클래스는 엔티티 클래스가 되는데 엔티티 클래스의 경우 반드시 데이터베이스의 PK를 의미하는 @Id가 있도록 작성해야 한다.

package com.unlimited.mallapi.domain;

import java.time.LocalDate;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Entity
@Table(name = "tbl_todo")
@Getter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Todo {

    // 할일 번호
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long tno;
    // 할일 제목
    private String title;
    // 작성자
    private String writer;
    // 완료 여부
    private boolean complete;
    // 마감일
    private LocalDate dueDate;

}

* Todo의 경우 고유한 PK를 가지기 위한 방법으로는 @GeneratedValue를 이용해서 사용자가 지정하지 않고 자동으로 생성되는 방식을 이용하였다.
* GenerationType.IDENTITY는 PK의 생성 방식을 데이터베이스 쪽에서 알아서 처리한다는 의미로, MariaDB는 자동으로 생성되는 auto_increment 방식으로 처리된다.
* builder 패턴에 대해서는 아래 포스트를 참조하자.
https://e-7-e.tistory.com/202

Builder 패턴... (lombok @Builder)

자바를 사용하는 사람이라면 아래 형식의 코드를 마나 봤을 거당. 속성명 앞에 with를 붙여서 withName, withAge등으로 쓰이는 것도 봤을 가능성이 높당. 이미 꽤 많이 사용되고, Lombok에서도 @Builder 어

e-7-e.tistory.com

* Todo 클래스를 추가한 후에 스프링 부트 프로젝트를 실행하면 중간에 아래와 같이 테이블 생성에 필요한 DDL 이 자동으로 생성되어 실행되는 것을 확인할 수 있다.

[Repository 설정과 테스트]
* 엔티티 처리에 대한 기능은 Spring Data JPA의 JpaRepository로 처리한다. 프로젝트 내에 repository 패키지를 생성하고 TodoRepository 인터페이스를 추가한다.

package com.unlimited.mallapi.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.unlimited.mallapi.domain.Todo;

public interface TodoRepository extends JpaRepository<Todo, Long> {

}

* JpaRepository 를 상속해서 만드는 TodoRepository 는 별도의 메서드 등을 작성하지 않아도 CRUD와 페이징 처리 등의 기능이 제공된다.


 

'SpringBoot_React 풀스택 프로젝트' 카테고리의 다른 글

(8) 스프링 부트와 API 서버 3  (0) 2024.02.28
(7) 스프링 부트와 API 서버 2  (0) 2024.02.28
(5) React-Router 3  (0) 2024.02.26
(4) React-Router 2  (0) 2024.02.26
(3) React-Router 1  (0) 2024.02.26