Spring Boot 프로젝트 생성
- Spring Initializr로 이동하거나 IDE에서 Spring Boot 프로젝트를 생성합니다.
- 프로젝트 설정:
- Project: Maven or Gradle
- Language: Java
- Spring Boot Version: 최신 안정 버전 선택
- Dependencies: Spring Web, Spring Data JPA, H2 Database (또는 사용할 데이터베이스 드라이버)
- 생성 후 프로젝트를 열고 설정 파일 수정 (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 에서 다음 설정을 해주어야한다
# 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 파일은 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 이 생성된 것을 확인 할 수 있다