Spring 프로젝트 세팅

Spring boot를 활용해 API 서버를 생성하기 위해 필요한 라이브러리를 추가하고, MySQL을 사용하기 위한 설정을 추가한다.

Spring Boot Gradle 3.3.1과 JDK 17을 사용

Gradle과 Maven의 차이점

  • Gradle은 Groovy 기반의 빌드 도구
  • Maven은 XML 기반의 빌드 도구
  • Gradle은 Groovy 스크립트를 사용하기 때문에 더 간결하고 가독성이 좋다.

Groovy란?

  • JVM 기반의 동적 언어
  • Java와 호환성이 좋다.
  • Java의 라이브러리를 그대로 사용할 수 있다.

Groovy가 더 최신이고 빠르지만, 아직까진 Maven이 더 많이 사용되고, 더 많은 자료와 라이브러리가 존재한다.

이번 프로젝트의 목적은 최신 프레임워크에 익숙해지는 것이기 때문에 Gradle을 사용한다.

사용할 라이브러리

  • MySQL Driver: Spring Boot에서 MySQL을 사용하기 위한 라이브러리
  • Spring Boot DevTools: Spring Boot 애플리케이션을 개발할 때 유용한 도구, 코드를 수정하면 자동으로 서버를 재시작 등
  • Lombok: 자바 개발을 편리하게 해주는 라이브러리, Getter, Setter, Constructor, ToString 등의 코드를 자동으로 생성
  • Spring Web: Spring Boot에서 웹 개발을 위한 라이브러리, RESTful 웹 서비스를 개발할 때 사용
  • Spring Data JPA: Spring Boot에서 JPA를 사용하기 위한 라이브러리, JPA란 Java Persistence API의 약자로 자바 진영의 ORM 기술 표준, 데이터베이스 테이블을 자바 객체로 매핑해주는 기술

각 설정에 대한 설명

  • spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver: MySQL 드라이버 클래스 이름
  • spring.application.name: 프로젝트 명
  • spring.datasource.url: 데이터베이스 URL
    • JDBC(Java DataBase Connectivity)란?: 자바 프로그램에서 데이터베이스에 일관된 방식으로 접근할 수 있도록 API를 제공하는 클래스의 집합.
  • spring.datasource.username: 데이터베이스 계정 이름
  • spring.datasource.password: 데이터베이스 계정 비밀번호
  • spring.jpa.hibernate.ddl-auto: JPA가 데이터베이스 스키마를 어떻게 관리할지를 설정, update로 설정하여 동기화함
    • 엔티티란 데이터베이스 테이블에 대응하는 자바 클래스
    • 엔티티 클래스를 변경하면 데이터베이스 스키마도 변경해야 하는데, 이때 hibernate.ddl-auto 속성을 사용
    • 다른 옵션
      • create: 엔티티 클래스를 기반으로 데이터베이스 스키마를 새로 생성
      • create-drop: create와 같지만 종료 시점에 데이터베이스 스키마를 삭제
      • validate: 엔티티 클래스와 데이터베이스 스키마를 비교하여 차이가 있으면 경고
      • none: hibernate가 데이터베이스 스키마를 관리하지 않음
      • 나중에 배포할 때는 update 대신 validate나 none을 사용하는 것이 좋음
  • spring.jpa.properties.hibernate.format_sql: JPA가 생성하는 SQL 쿼리를 보기 좋게 포맷팅함
  • spring.jpa.show-sql: JPA가 생성하는 SQL 쿼리를 콘솔에 출력함, 디버깅 목적
  • server.port: 기본 포트인 8080대신 8081 포트 사용

테이블 생성

package studio.edix.projectapi.domain;

import jakarta.persistence.Column;
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;

import java.time.LocalDate;

@Entity // JPA Entity 클래스임을 명시해주는 어노테이션
@ToString // toString() 메소드를 자동으로 생성해주는 어노테이션
@Getter // getter 메소드를 자동으로 생성해주는 어노테이션
@Builder // 생성자를 만들어주는 어노테이션
@AllArgsConstructor // 모든 필드를 인자로 받는 생성자를 만들어주는 어노테이션
@NoArgsConstructor // 기본 생성자를 만들어주는 어노테이션
@Table(name = "todos") // 테이블 이름을 명시해주는 어노테이션
public class Todo {

    @Id // Primary Key임을 명시해주는 어노테이션
    @GeneratedValue(strategy = GenerationType.IDENTITY) // Primary Key의 생성 방식을 명시해주는 어노테이션
    private Long todoId;

    @Column(length = 100, nullable = false)
    private String title;

    @Column(length = 1000)
    private String content;

    private boolean completed;

    private LocalDate dueDate;
}

src/main/java/studio/edix/projectapi 경로에 domain 패키지를 만들고, 그 안에 Todo.java 파일을 만든다.

위처럼 Todo를 위한 JPA Entity 클래스를 만들어주었다.
생긴것이 데코레이터와 비슷한데 데코레이터와 어노테이션은 다르다.
데코레이터는 함수와 메서드의 동작을 수정하거나 확장한다. 주로 함수의 실행 전후에 추가 동작을 삽입하거나 동작을 변경한다.

어노테이션은 클래스, 메서드, 필드, 매개변수 등의 다양한 곳에 적용할 수 있고, 메타데이터를 추가하여 컴파일 시점 또는 런타임에 프레임워크에 의해 해석되어 동작을 변경한다.

위처럼 코드를 작성하고 실행하면 위에서 spring.jpa.show-sql=true로 설정해놨기 때문에 콘솔에 아래와 같은 SQL문이 출력된다.

Hibernate: 
    create table todos (
        todo_id bigint not null auto_increment,
        completed bit not null,
        content varchar(1000),
        due_date date,
        title varchar(100) not null,
        primary key (todo_id)
    ) engine=InnoDB

테스트 코드

이제 테이블이 생성된 것을 확인했으니, 테스트 코드를 작성한다.
직접 들어가서 확인하거나 로그를 찍는 방법이 있지만, 테스트 코드를 미리미리 작성해두면 편하고, 프로젝트가 커지면 테스트 코드 없이 직접 확인하기 힘들어진다.
우선 main 폴더 안에 test/java/studio/edix/projectapi 경로에 repository 패키지를 만들고, 그 안에 TodoRepositoryTest.java 파일을 만든다.