의존성 설정
프로젝트 루트의 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
주요 설정 항목 설명
| 파라미터 | 설명 |
|---|---|
| useSSL | SSL 연결 사용 여부 (개발 환경에서는 false) |
| serverTimezone | 서버 시간대 설정 |
| allowPublicKeyRetrieval | public 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
}
}
}
5월 28일 22:58에 게시됨