Table of Contents
Spring Boot – MySQL 에서 PostgreSQL 로 전환
의존성 및 설정 변경
가장 먼저 build.gradle 또는 pom.xml에서 데이터베이스 드라이버를 교체해야 합니다.
-
Dependency 교체:
-
mysql-connector-java(혹은mysql-connector-j)를 삭제하고org.postgresql:postgresql을 추가합니다. -
application.yml (또는 properties):
-
spring.datasource.url:jdbc:mysql://...에서jdbc:postgresql://...로 변경합니다. -
spring.jpa.database-platform: 명시적으로 Dialect를 설정했다면org.hibernate.dialect.MySQLDialect에서org.hibernate.dialect.PostgreSQLDialect로 변경합니다. (최신 Hibernate 버전은 자동 감지하므로 생략해도 무방합니다.)
주요 기술적 차이점
두 데이터베이스는 아키텍처와 사양에 있어 차이가 있으며, 특히 JPA 엔티티를 작성하거나 SQL 쿼리를 짤 때 체감됩니다.
| 구분 | MySQL | PostgreSQL |
|---|---|---|
| 대소문자 구분 | 설정에 따라 다르지만 기본적으로 구분 안 함 | 식별자(테이블, 컬럼명)가 대소문자를 구분함 |
| 자동 증가 키 | AUTO_INCREMENT 사용 |
SERIAL 또는 IDENTITY 컬럼 사용 |
| 불리언(Boolean) | TINYINT(1)로 저장 (0/1) |
Native BOOLEAN 타입 지원 (true/false) |
| JSON 데이터 | JSON 컬럼 지원 | JSONB 타입 지원 (인덱싱 및 검색 성능 탁월) |
| 표준 준수 | 관대함 (비표준 문법 허용) | SQL 표준을 엄격하게 준수 |
개발 시 주의해야 할 점 (함정 카드)
대소문자 문제 (Case Sensitivity)
PostgreSQL은 테이블명이나 컬럼명을 쌍따옴표(")로 감싸지 않으면 기본적으로 소문자로 처리합니다.
- 만약 JPA에서
@Column(name = "UserName")처럼 대문자를 섞어 명시했다면, PostgreSQL은 이를username으로 인식하여 "컬럼을 찾을 수 없다"는 에러를 뱉을 수 있습니다. 가능한 모든 식별자를 소문자(user_name)로 통일하는 것이 정신 건강에 좋습니다.
데이터 타입 매핑
- Boolean: MySQL은
TINYINT(1)을 쓰지만, Postgres는 진짜boolean타입을 씁니다. 기존 데이터가 0/1로 들어가 있다면 마이그레이션 시 주의해야 합니다. - JSON: Postgres의
JSONB는 매우 강력합니다. 단순히 텍스트로 저장하지 말고, JPA에서@JdbcTypeCode(SqlTypes.JSON)(Hibernate 6 기준)을 사용하여 엔티티 필드에 매핑하면 편리하게 객체로 다룰 수 있습니다.
시퀀스(Sequence) 생성 전략
MySQL에서는 주로 GenerationType.IDENTITY를 사용하여 데이터베이스의 자동 증가 설정을 따릅니다. PostgreSQL에서도 동일하게 동작하지만, GenerationType.SEQUENCE를 사용하는 것이 Postgres의 기본 철학에 더 가깝고, 대량 데이터를 삽입할 때 성능상 이점이 있을 수 있습니다.
요약: 무엇을 먼저 확인해야 할까?
- 기존 SQL 쿼리: Native Query(직접 짠 쿼리)가 있다면 MySQL 전용 문법(예:
IFNULL,TINYINT관련 처리)이 포함되어 있는지 확인하고 수정하세요. - 데이터 마이그레이션: 만약 기존 MySQL 데이터를 옮겨야 한다면, 단순히 데이터만 옮기는 것이 아니라 데이터 타입 변환(Type Casting) 이슈를 꼭 검토해야 합니다.
- 대소문자 컨벤션: 식별자 이름을 소문자_스네이크_케이스로 통일하는지 확인하세요.