Play Framework 프로젝트에 MySQL 데이터베이스 연동 설정

의존성 설정

프로젝트 루트의 build.sbt 파일에 JDBC 플러그인과 MySQL 커넥터를 추가합니다.

libraryDependencies ++= Seq(
  jdbc,
  "com.mysql" % "mysql-connector-j" % "8.0.33"
)

데이터베이스 연결 구성

conf/application.conf 파일에서 H2 설정을 주석 처리하고 MySQL 설정을 추가합니다.

# 기존 H2 설정 비활성화
# db.default.driver=org.h2.Driver
# db.default.url="jdbc:h2:mem:play"
# db.default.username=sa
# db.default.password=""

# MySQL 연결 설정
db.default.driver=com.mysql.cj.jdbc.Driver
db.default.url="jdbc:mysql://127.0.0.1:3306/playdb?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true"
db.default.username=dbuser
db.default.password="dbpass"

MySQL 서버 실행

터미널에서 MySQL 서비스를 시작합니다.

$ sudo systemctl start mysql
# 또는 macOS
$ mysql.server start

주요 설정 항목 설명

파라미터설명
useSSLSSL 연결 사용 여부 (개발 환경에서는 false)
serverTimezone서버 시간대 설정
allowPublicKeyRetrievalpublic key 검색 허용 (MySQL 8.0+)

자주 발생하는 오류와 해결

드라이버 클래스 로드 실패

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 오류 발생 시:

  • MySQL Connector/J 버전 8.0 이상에서는 com.mysql.cj.jdbc.Driver 사용
  • build.sbt 의존성 동기화: sbt update 실행

연결 타임아웃

방화벽 또는 MySQL 서버 상태 확인:

# MySQL 포트 확인
$ sudo netstat -tlnp | grep 3306

# 원격 접속 권한 부여 (필요시)
GRANT ALL PRIVILEGES ON playdb.* TO 'dbuser'@'%';
FLUSH PRIVILEGES;

인증 플러그인 오류

MySQL 8.0의 caching_sha2_password 문제 해결:

-- 기존 사용자 인증 방식 변경
ALTER USER 'dbuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'dbpass';

연결 풀 설정 (선택)

고성능 환경을 위한 HikariCP 설정:

db.default.hikaricp.maximumPoolSize=20
db.default.hikaricp.minimumIdle=5
db.default.hikaricp.connectionTimeout=30000
db.default.hikaricp.idleTimeout=600000
db.default.hikaricp.maxLifetime=1800000

애플리케이션에서 데이터베이스 사용

import javax.inject.Inject
import play.api.db.Database
import scala.concurrent.{ExecutionContext, Future}

class BookRepository @Inject()(db: Database)(implicit ec: ExecutionContext) {
  
  def findById(id: Long): Future[Option[Book]] = Future {
    db.withConnection { conn =>
      val stmt = conn.prepareStatement("SELECT * FROM books WHERE id = ?")
      stmt.setLong(1, id)
      val rs = stmt.executeQuery()
      if (rs.next()) {
        Some(Book(rs.getLong("id"), rs.getString("title")))
      } else None
    }
  }
}

태그: Play Framework MySQL JDBC SBT HikariCP

5월 28일 22:58에 게시됨