[SpringBoot/DB] PostgreSQL 처음 사용해보기

다은·2025년 5월 20일
1

DB

목록 보기
1/4
post-thumbnail

SpringBoot로 프로젝트를 시작할 때 어떤 DB를 사용할지 고민해본 적이 있으신가요?
저는 지금까지 당연하게, 자연스럽게 Java + MySQL 기반 환경을 사용해왔는데요, 최근 떠오르는 DB가 있다길래 한 번 새로운 환경에 도전해보려 합니다.


1. PostgreSQL?

PostgreSQL은 가장 잘 쓰이는 관계형 데이터베이스 중 하나로, 비관계형 및 관계형 데이터 유형을 모두 지원하는 오픈소스 데이터베이스입니다.

관계형 DB 중에서 최다 SQL 언어를 지원할 뿐만 아니라, NoSQL 언어도 지원하기 때문에 다양한 데이터 유형을 기반으로 유연한 성능을 보여줍니다.

https://www.postgresql.org/download/ 에서 macOS용 application을 다운로드 할 수 있으며, 앱을 설치한 후 구동해보면, 위와 같은 화면을 마주할 수 있습니다.



2. PostgreSQL 문법

PostgreSQL을 처음 시작할 때 필요한 문법은 다음과 같습니다.

PostgreSQL CLI 시작하기

psql -d postgres

PostgreSQL DB 생성하기

createdb testdb

위의 명령어들은 bash창에서 수행하고 각 DB와 관련된 명령어들은 psql 쉘 내부에서 수행됩니다. 그러나, postgreSQL 앱을 설치했음에도 터미널이 psql과 같은 명령어를 정상적으로 인식하지 못 할 경우에는 따로 PATH 설정을 추가해주어야 합니다.

MacOS 기준 Postgres.app의 psql은 다음과 같은 경로에 위치하므로 환경변수를 설정합니다.

echo 'export PATH="/Applications/Postgres.app/Contents/Versions/latest/bin:$PATH"' >> ~/.zprofile
source ~/.zprofile

터미널을 종료한 후 psql을 다시 입력해보면 터미널이 정상적으로 명령어를 인식하는 것을 확인할 수 있습니다.



User 생성하기
User을 성공적으로 생성하면,CREATE ROLE라는 문구를 볼 수 있습니다.

\du # user 목록 조회하기
CREATE USER username WITH PASSWORD 'passwordd';

User 권한 부여

방금 생성한 User에게 특정 권한을 부여하고자 합니다. 해당 권한이 없으면 테이블 생성 및 기타 작업을 수행할 수 없으므로, User을 생성했다면 반드시 수행하고자 하는 작업에 대한 권한을 부여해야 합니다.

GRANT ALL PRIVILEGES ON SCHEMA public TO username;



ProgreSQL문법은 SQL 표준 문법을 따르고 있어, 쿼리를 작성하는 데에는 큰 어려움이 없습니다. 하지만 PostgreSQL만의 확장 문법이 몇 가지 존재하며 그 중 인상 깊은 세 가지를 소개하고자 합니다.

JSON 확장 문법

Json type 필드를 함께 저장할 수 있는데, ->>을 이용해 Json 필드의 key에 해당하는 value에 한 번에 접근할 수 있습니다.

CREATE TABLE logs (
  id SERIAL,
  data JSONB
);

INSERT INTO logs (data) VALUES ('{"event": "login", "success": true}');
SELECT data->>'event' FROM logs;  # "login" 출력

배열 확장 문법

아래 SQL은 name이라는 배열 안에 ‘ai’라는 값이 존재하는지 확인합니다. 이처럼 배열을 이용해 여러 개의 값을 하나의 행에 저장할 수 있습니다.

CREATE TABLE logs (
  id SERIAL,
  name TEXT[],
  created_at TIMESTAMP
);

INSERT INTO logs (name) VALUES (ARRAY['tech', 'ai', 'data']);
SELECT * FROM logs WHERE 'ai' = ANY(name);

SERIAL

MySQL의 auto-increment와 유사한 데이터 타입으로, 정수 타입을 자동 증가시키는 편의 타입입니다.
SEQUENCE 객체를 기반으로 하기 때문에 수동으로도 조작할 수 있으며, SERIAL은 내부적으로 아래와 같이 동작한다고 합니다.

CREATE TABLE users (
  id SERIAL PRIMARY KEY
);
CREATE SEQUENCE users_id_seq;
CREATE TABLE users (
  id INTEGER NOT NULL DEFAULT nextval('users_id_seq')
);
ALTER SEQUENCE users_id_seq OWNED BY users.id;



3. SpringBoot 환경 설정

postgresql을 springboot 프로젝트에 도입하고자 합니다. 도입 과정 및 간단한 DB 연결 여부까지 확인해보겠습니다.

postgresql 관련 의존성을 주입해줍니다.

implementation("org.postgresql:postgresql")

application.yml에 db에 연결할 때 필요한 정보들을 기입해줍니다. MySQL을 연결하는 과정과 거의 유사하며 포트번호만 5432로 다릅니다.

spring:
  profiles:
    active: local
  application:
    name: dev
  datasource:
    url: jdbc:postgresql://localhost:5432/{DB_URI}
    username: {DB_USERNAME}
    password: {DB_PASSWORD}
    driver-class-name: org.postgresql.Driver
  sql:
    init:
      platform: postgresql
  jpa:
    database-platform: org.hibernate.dialect.PostgreSQLDialect
    hibernate:
      ddl-auto: update
    generate-ddl: true
    show-sql: true

복잡한 기능이 아닌, DB와의 연결 유무만을 확인할 것이므로, 간단한 User Entity를 작성합니다.

이 과정에서 새롭게 알게 된 점은, PostgreSQL에는 user 라는 예약어가 존재한다는 것입니다. 그래서 user라는 테이블을 생성하려고 하면 syntax error가 발생하면서 테이블을 생성하지 못하며, 테이블 이름은 users 혹은 다른 이름으로 바꾸는 것을 권장한다고 합니다.

@Entity
@Table(name = "users")
data class User(
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long = 0,
    val username: String
)
interface UserRepository : JpaRepository<User, Long>

User을 저장하는 API와 전체 User 리스트를 반환하는 간단한 API를 작성했습니다.

@RestController
@RequestMapping("/api/users")
class UserController(
    private val userRepository: UserRepository
) {
    @PostMapping
    fun create(@RequestBody user : User): User =
        userRepository.save(user)

    @GetMapping
    fun list(): List<User> =
        userRepository.findAll()
}



4. SpringBoot - PostgreSQL 연동 확인

서버를 시작하니 다음과 같이 users 테이블이 생성되었습니다.

  1. POST localhost:8080/api/users
  2. GET localhost:8080/api/users
    업로드중..

다음과 같이 작성해둔 API를 통해 DB와 성공적으로 연동되었다는 것을 알 수 있습니다.

profile
CS 마스터를 향해 ..

0개의 댓글