[SpringBoot] Spring Boot를 사용해 REST API 만들기(1)

Spring Boot 프로젝트 생성

  1. Spring Initializr로 이동하거나 IDE에서 Spring Boot 프로젝트를 생성합니다.
  2. 프로젝트 설정:
    • Project: Maven or Gradle
    • Language: Java
    • Spring Boot Version: 최신 안정 버전 선택
    • Dependencies: Spring Web, Spring Data JPA, H2 Database (또는 사용할 데이터베이스 드라이버)
  3. 생성 후 프로젝트를 열고 설정 파일 수정 (application.properties 또는 application.yml).

프로젝트 구성

src/main/java
├── com.example.linkup
    ├── controller       // REST 컨트롤러
    ├── service          // 서비스 레이어
    ├── repository       // 데이터베이스 레이어
    ├── model            // 엔티티
    └── LinkupApplication.java  // 메인 클래스

 

다음과 같이 기본적인 디렉토리 구조를 만들어두고 작업을 시작 해야한다

 

Spring Boot 를 통해서 사용자의 정보를 저장하기 위해서 다음과 같이 Entity를 작성해 주었습니다.

 

(1) 엔티티 작성

package com.bugisu.linkup.model;

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

@Entity
@Table(name = "users") // 테이블 이름을 명시적으로 설정
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String username;
  private String password;
  private String email;
  private String phone;
  private String birthdate;

  // Getters and Setters
  public Long getId() { return id; }
  public void setId(Long id) { this.id = id; }
  public String getUsername() { return username; }
  public void setUsername(String username) { this.username = username; }
  public String getPassword() { return password; }
  public void setPassword(String password) { this.password = password; }
  public String getEmail() { return email; }
  public void setEmail(String email) { this.email = email; }
  public String getPhone() { return phone; }
  public void setPhone(String phone) { this.phone = phone; }
  public String getBirthdate() { return birthdate; }
  public void setBirthdate(String birthdate) { this.birthdate = birthdate; }
}

(2) 리포지토리 작성

package com.bugisu.linkup.repository;

import com.bugisu.linkup.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

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

(3) 서비스 작성

package com.bugisu.linkup.service;

import com.bugisu.linkup.model.User;
import com.bugisu.linkup.repository.UserRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
  private final UserRepository repository;

  public UserService(UserRepository userRepository) {
    this.repository = userRepository;
  }
  //Read
  public List<User> getAllUsers() {
    return repository.findAll();
  }
  public User getUserById(Long id) {
    return repository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
  }

  //Update
  public  User saveUser(User user) {
    return repository.save(user);
  }
  //Delete
  public void deleteUser(Long id) {
    repository.deleteById(id);
  }
}

(4) 컨트롤러 작성

package com.bugisu.linkup.controller;

import com.bugisu.linkup.model.User;
import com.bugisu.linkup.service.UserService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

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

    private final UserService service;

    public UserController(UserService service) {
        this.service = service;
    }

    // Default GET endpoint
    @GetMapping
    public ResponseEntity<String> getDefaultEndpoint() {
        return ResponseEntity.ok("Default GET endpoint for /api/linkup");
    }

    // Get all users
    @GetMapping("/users")
    public ResponseEntity<List<User>> getAllUsers() {
        return ResponseEntity.ok(service.getAllUsers());
    }

    // Get user by ID
    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        return ResponseEntity.ok(service.getUserById(id));
    }

    // Create a new user
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        return ResponseEntity.ok(service.saveUser(user));
    }

    // Update an existing user
    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        return ResponseEntity.ok(service.saveUser(user));
    }

    // Delete a user
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        service.deleteUser(id);
        return ResponseEntity.noContent().build();
    }
}

설정 파일 작성

application.properties 에서 다음 설정을 해주어야한다

application.properties 설정

# App name
spring.application.name=linkup

# Server port
server.port=8080

# Context path
server.servlet.context-path=/api

# Restart WAS
spring.devtools.livereload.enabled=true

# Spring Datasource
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/db7
spring.datasource.username=db7
spring.datasource.password=zxc123

# JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true

# File upload setting for Servlet
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=C:/upload
spring.servlet.multipart.max-request-size=30MB
spring.servlet.multipart.max-file-size=10MB

# File upload setting for Application
com.example.upload.path=C:/upload

#log level ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
logging.level.org.springframework.security.web=trace
logging.level.com.example=debug

# OAuth2 include
spring.profiles.include=oauth

 

pom.xml 파일 설정

 

pom.xml 파일은 Maven 프로젝트에서 필요한 라이브러리 종속성과 빌드 구성을 정의하는 데 사용됩니다. Spring Boot 애플리케이션을 개발할 때, 필요한 종속성과 빌드 플러그인, 설정을 이곳에서 관리합니다.

 

  • 의존성 자동 관리: 필요한 라이브러리를 정의만 하면 Maven이 자동으로 다운로드하고 설정.
  • 빌드 자동화: 플러그인을 통해 애플리케이션을 컴파일, 테스트, 패키징, 실행.
  • 코드 생성: QueryDSL 같은 코드 생성 도구를 통해 생산성을 향상.
  • 일관성 유지: 프로젝트 팀원 간 동일한 환경과 설정을 공유.

프로젝트 정보

<groupId>com.bugisu</groupId>
<artifactId>linkup</artifactId>
<version>0.0.1-SNAPSHOT</version>

 

  • groupId: 프로젝트의 그룹 이름 (일반적으로 조직 도메인 이름을 반대로 작성).
  • artifactId: 프로젝트의 이름.
  • version: 프로젝트의 현재 버전.

properties 

<properties>
    <java.version>17</java.version>
</properties>

 

  • Java 17 버전을 사용할 것을 명시합니다.

dependencies

  • Spring Boot 의존성
    • spring-boot-starter-data-jpa: JPA(ORM)와 데이터베이스 관련 기능 제공.
    • spring-boot-starter-web: REST API, 웹 개발 관련 기능 제공.
    • spring-boot-devtools: 개발 편의를 위한 핫 리로딩 기능 제공.
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<scope>runtime</scope>
	<optional>true</optional>
</dependency>
  • 데이터베이스 드라이버
    • mariadb-java-client: MariaDB와 통신하기 위한 JDBC 드라이버.
<!-- MariaDB JDBC Driver -->
<dependency>
	<groupId>org.mariadb.jdbc</groupId>
	<artifactId>mariadb-java-client</artifactId>
	<version>3.1.3</version>
</dependency>
  • QueryDSL
    • 동적 쿼리를 쉽게 작성하기 위한 라이브러리.
    • querydsl-jpa, querydsl-apt, querydsl-core 등이 포함되어 있음.
<!-- QueryDSL Dependencies -->
<dependency>
	<groupId>com.querydsl</groupId>
	<artifactId>querydsl-jpa</artifactId>
	<classifier>jakarta</classifier>
	<version>5.1.0</version>
</dependency>
<dependency>
	<groupId>com.querydsl</groupId>
	<artifactId>querydsl-apt</artifactId>
	<classifier>jakarta</classifier>
	<version>5.1.0</version>
</dependency>
<dependency>
	<groupId>com.querydsl</groupId>
	<artifactId>querydsl-core</artifactId>
	<version>5.1.0</version>
</dependency>
  • JWT 관련 의존성
    • JSON Web Token(JWT)을 사용한 인증 및 권한 부여 기능 제공.
<!-- JWT Dependencies -->
<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt-api</artifactId>
	<version>0.12.6</version>
</dependency>
<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt-impl</artifactId>
	<version>0.12.6</version>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt-jackson</artifactId>
	<version>0.12.6</version>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt-gson</artifactId>
	<version>0.12.6</version>
</dependency>
  • Thumbnailator
    • 이미지 처리와 섬네일 생성에 사용.
<!-- Thumbnailator -->
<dependency>
	<groupId>net.coobird</groupId>
	<artifactId>thumbnailator</artifactId>
	<version>0.4.20</version>
</dependency>
  • 테스트 의존성
    • spring-boot-starter-test: 단위 테스트와 통합 테스트 지원.

 

 

전체코드

더보기
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>3.4.1</version>
   <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.bugisu</groupId>
  <artifactId>linkup</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>linkup</name>
  <description>Demo project for Spring Boot</description>
  <properties>
   <java.version>17</java.version>
  </properties>
  <dependencies>
   <!-- Spring Boot Dependencies -->
   <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
   </dependency>
   <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
   </dependency>
   <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
   </dependency>
   <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
   </dependency>

   <!-- MariaDB JDBC Driver -->
   <dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>3.1.3</version>
   </dependency>

   <!-- QueryDSL Dependencies -->
   <dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
    <classifier>jakarta</classifier>
    <version>5.1.0</version>
   </dependency>
   <dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <classifier>jakarta</classifier>
    <version>5.1.0</version>
   </dependency>
   <dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-core</artifactId>
    <version>5.1.0</version>
   </dependency>

   <!-- Thumbnailator -->
   <dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.20</version>
   </dependency>

   <!-- JWT Dependencies -->
   <dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.12.6</version>
   </dependency>
   <dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.12.6</version>
    <scope>runtime</scope>
   </dependency>
   <dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.12.6</version>
    <scope>runtime</scope>
   </dependency>
   <dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-gson</artifactId>
    <version>0.12.6</version>
   </dependency>
  </dependencies>

  <build>
   <plugins>
    <!-- Maven Compiler Plugin -->
    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
     <configuration>
      <annotationProcessorPaths>
       <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
       </path>
      </annotationProcessorPaths>
     </configuration>
    </plugin>
    <!-- Spring Boot Maven Plugin -->
    <plugin>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
     <configuration>
      <excludes>
       <exclude>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
       </exclude>
      </excludes>
     </configuration>
    </plugin>
    <!-- QueryDSL Plugin -->
    <plugin>
     <groupId>com.mysema.maven</groupId>
     <artifactId>apt-maven-plugin</artifactId>
     <version>1.1.3</version>
     <executions>
      <execution>
       <goals>
        <goal>process</goal>
       </goals>
       <configuration>
        <outputDirectory>target/generated-sources/java</outputDirectory>
        <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
       </configuration>
      </execution>
     </executions>
    </plugin>
   </plugins>
  </build>
</project>

 

이렇게 설정해주고 실행을 한번 해주면 MariaDB 안에 내가 만든 Table 이 생성된 것을 확인 할 수 있다