본문 바로가기

Study Information Technology

Spring Boot와 PostgreSQL 연동하기

728x90
반응형

Spring Boot와 PostgreSQL 연동하기

Overview

Spring Boot와 PostgreSQL을 연동하는 방법을 자세히 설명하겠습니다. 이 과정은 데이터베이스와의 연결 설정부터 시작하여, 기본적인 CRUD 작업을 수행할 수 있는 애플리케이션을 만드는 방법을 포함합니다. PostgreSQL은 오픈 소스 관계형 데이터베이스 시스템으로, Spring Boot와의 통합이 비교적 간단하고 강력한 성능을 제공합니다. 이 가이드는 PostgreSQL을 데이터베이스로 사용하는 Spring Boot 애플리케이션을 처음부터 끝까지 설정하는 방법을 단계별로 설명합니다.

1. 프로젝트 생성

Spring Boot 애플리케이션을 생성하기 위해서는 Spring Initializr를 사용할 수 있습니다. Spring Initializr는 웹 기반의 프로젝트 생성 도구로, 필요한 의존성을 선택하여 기본적인 Spring Boot 프로젝트 구조를 생성할 수 있습니다.

  1. Spring Initializr 접속: Spring Initializr 웹사이트에 접속합니다.

  2. 프로젝트 설정:

  • Project: Gradle Project 또는 Maven Project를 선택합니다. 여기서는 Maven을 예로 들겠습니다.
  • Language: Java를 선택합니다.
  • Spring Boot: 최신 버전을 선택합니다.
  • Project Metadata:
  • Group: com.example
  • Artifact: myapp
  • Name: myapp
  • Description: Demo project for Spring Boot with PostgreSQL
  • Package name: com.example.myapp
  • Packaging: Jar를 선택합니다.
  • Java: Java 17 또는 21을 선택합니다.
  1. Dependencies:
  • Spring Web: RESTful API를 개발할 때 필요합니다.
  • Spring Data JPA: JPA를 사용하여 데이터베이스와 상호작용합니다.
  • PostgreSQL Driver: PostgreSQL 데이터베이스와 연결하기 위한 드라이버입니다.
  1. Generate 버튼을 클릭하여 프로젝트를 다운로드합니다.

  2. 다운로드한 ZIP 파일을 압축 해제하고 IDE에서 열어줍니다.

2. PostgreSQL 데이터베이스 설정

PostgreSQL 데이터베이스를 설치하고 설정하는 과정입니다.

  1. PostgreSQL 설치: PostgreSQL은 PostgreSQL 공식 웹사이트에서 다운로드할 수 있습니다. 설치 후 PostgreSQL 데이터베이스를 실행합니다.

  2. 데이터베이스 생성:

    CREATE DATABASE myappdb;
  3. 사용자 생성 및 권한 부여:

    CREATE USER myappuser WITH ENCRYPTED PASSWORD 'password';
    GRANT ALL PRIVILEGES ON DATABASE myappdb TO myappuser;

3. Spring Boot 설정

애플리케이션이 PostgreSQL 데이터베이스에 연결될 수 있도록 설정하는 과정입니다.

  1. application.properties 파일 설정:

src/main/resources/application.properties 파일에 PostgreSQL 연결 설정을 추가합니다.

spring.datasource.url=jdbc:postgresql://localhost:5432/myappdb
spring.datasource.username=myappuser
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
  • spring.datasource.url: PostgreSQL 데이터베이스의 URL입니다. 여기서는 로컬에서 실행되고 있는 PostgreSQL 데이터베이스를 가리킵니다.
  • spring.datasource.usernamespring.datasource.password: 데이터베이스에 접근하기 위한 사용자명과 비밀번호입니다.
  • spring.jpa.database-platform: Hibernate가 사용할 PostgreSQL 데이터베이스의 Dialect입니다.
  • spring.jpa.show-sql: SQL 쿼리를 콘솔에 출력할지 여부입니다.
  • spring.jpa.hibernate.ddl-auto: 애플리케이션 실행 시 Hibernate가 데이터베이스 스키마를 자동으로 업데이트할지 여부를 설정합니다. update로 설정하면 엔티티 클래스와 데이터베이스 테이블의 스키마를 동기화합니다.

4. 엔티티 클래스 생성

데이터베이스와 상호작용하기 위한 엔티티 클래스를 생성합니다.

  1. 엔티티 클래스 생성:
package com.example.myapp.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String email;

// 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 getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}
}
  • @Entity 어노테이션을 사용하여 이 클래스가 JPA 엔티티임을 나타냅니다.
  • @Id@GeneratedValue는 기본 키와 자동 생성 전략을 설정합니다.
  1. Repository 인터페이스 생성:
package com.example.myapp.repository;

import com.example.myapp.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
  • JpaRepository를 상속받아 CRUD 작업을 자동으로 제공합니다.
  1. Service 클래스 생성:
package com.example.myapp.service;

import com.example.myapp.model.User;
import com.example.myapp.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class UserService {

@Autowired
private UserRepository userRepository;

public User saveUser(User user) {
return userRepository.save(user);
}

public List<User> getAllUsers() {
return userRepository.findAll();
}

public Optional<User> getUserById(Long id) {
return userRepository.findById(id);
}

public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
  • @Service 어노테이션을 사용하여 서비스 클래스를 정의합니다.
  1. Controller 클래스 생성:
package com.example.myapp.controller;

import com.example.myapp.model.User;
import com.example.myapp.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/users")
public class UserController {

@Autowired
private UserService userService;

@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User createdUser = userService.saveUser(user);
return ResponseEntity.ok(createdUser);
}

@GetMapping
public ResponseEntity<List<User>> getAllUsers() {
List<User> users = userService.getAllUsers();
return ResponseEntity.ok(users);
}

@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
Optional<User> user = userService.getUserById(id);
return user.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}
  • @RestController@RequestMapping을 사용하여 RESTful API 엔드포인트를 정의합니다.

5. 애플리케이션 실행

이제 모든 설정이 완료되었습니다. Spring Boot 애플리케이션을 실행하고, PostgreSQL 데이터베이스와 연결이 잘 되는지 확인해보겠습니다.

  1. 애플리케이션 실행: IDE에서 MyappApplication 클래스를 실행하거나 터미널에서 mvn spring-boot:run 명령어를 실행하여 애플리케이션을 실행합니다.

  2. 테스트: Postman 또는 cURL을 사용하여 API 엔드포인트를 테스트합니다.

  • 사용자 생성:

    curl -X POST http://localhost:8080/users -H "Content-Type: application/json" -d '{"username":"john_doe","email":"john@example.com"}'
  • 모든 사용자 조회:

    curl http://localhost:8080/users
  • 특정 사용자 조회:

    curl http://localhost:8080/users/1
  • 사용자 삭제:

    curl -X DELETE http://localhost:8080/users/1

6. 발생할 수 있는 에러 및 해결책

728x90
반응형