학습
Scala 스칼라에서의 데이터베이스 연동
Scala 스칼라에서의 데이터베이스 연동 — 중급
스칼라에서의 데이터베이스 연동
1. 도입 (왜 배워야 하는가)
데이터베이스 연동은 현대 소프트웨어 개발에서 필수적인 기술입니다. 대부분의 애플리케이션은 사용자 데이터를 저장하고 검색해야 하며, 이를 위해 데이터베이스와 연결하는 방법을 알아야 합니다. 스칼라는 함수형 프로그래밍 언어로, 데이터베이스와의 상호작용을 효율적으로 처리할 수 있는 라이브러리와 도구들을 제공합니다.
이러한 기술을 배우지 않으면, 데이터 저장 및 관리의 비효율성으로 인해 애플리케이션 성능 저하나 데이터 손실 등의 문제를 겪을 수 있습니다. 예를 들어, 사용자가 로그인을 하거나 상품을 구매할 때, 그 정보를 데이터베이스에 저장하지 않으면 다음에 로그인할 때 사용자 정보를 찾을 수 없게 됩니다.
2. 핵심 개념 설명
데이터베이스 (Database)
- 데이터를 체계적으로 저장하고 관리하는 시스템입니다.
- 예를 들어, 도서관의 책들이 정리된 책장과 같습니다. 책장에 책이 정리되어 있지 않으면 원하는 책을 찾기가 매우 어렵습니다.
- 데이터베이스와 상호작용하는 데 사용하는 언어입니다.
- 도서관에서 "이 책 어디에 있어?"라고 물어보는 것과 같습니다.
- Java 및 Scala에서 데이터베이스와 연결하기 위해 사용하는 API입니다.
- 도서관의 사서와 같은 역할을 하며, 사용자의 요청을 데이터베이스에 전달합니다.
SQL (Structured Query Language)
JDBC (Java Database Connectivity)
| 용어 | 정의 |
|---|---|
| 데이터베이스 | 데이터를 저장하는 장소 |
| SQL | 데이터베이스에 명령을 내리는 언어 |
| JDBC | 데이터베이스와 연결하는 API |
3. 기본 코드 예제
스칼라에서 JDBC를 사용하여 데이터베이스에 연결하는 기본 예제를 살펴보겠습니다.
import java.sql.{Connection, DriverManager}
object DatabaseExample {
def main(args: Array[String]): Unit = {
// 데이터베이스 연결 정보
val url = "jdbc:mysql://localhost:3306/mydb"
val username = "user"
val password = "password"
// 데이터베이스 연결
val connection: Connection = DriverManager.getConnection(url, username, password)
// 연결이 성공적으로 이루어졌는지 확인
if (connection != null) {
println("데이터베이스에 성공적으로 연결되었습니다.")
} else {
println("데이터베이스 연결에 실패했습니다.")
}
// 연결 종료
connection.close()
}
}
실행 결과:
데이터베이스에 성공적으로 연결되었습니다.
코드 한 줄씩 동작 설명:
import java.sql.{Connection, DriverManager}: JDBC 관련 클래스를 가져옵니다.val url = "jdbc:mysql://localhost:3306/mydb": 연결할 데이터베이스의 URL을 설정합니다.val username = "user": 데이터베이스 사용자 이름을 설정합니다.val password = "password": 데이터베이스 비밀번호를 설정합니다.DriverManager.getConnection(url, username, password): 데이터베이스에 연결을 시도합니다.if (connection != null): 연결이 성공적으로 이루어졌는지 확인합니다.connection.close(): 데이터베이스 연결을 종료합니다.- 연결 시 사용자 이름과 비밀번호를 반드시 포함해야 합니다.
- 스칼라에서의 데이터베이스 연동은 필수적이며, JDBC를 통해 가능합니다.
- SQL을 사용하여 데이터베이스와 상호작용하며, 데이터베이스의 기본 개념을 이해해야 합니다.
- 실전 예제에서는 사용자 로그인 및 상품 추가와 같은 실제 작업을 다루었습니다.
- 다음 단계로는 ORM(Object-Relational Mapping) 프레임워크인 Slick을 배우는 것을 추천합니다. ORM은 데이터베이스와 객체 간의 매핑을 쉽게 해주어 개발 효율성을 높여줍니다.
4. 실전 활용 예제
예제 1: 사용자 로그인
쇼핑몰에서 사용자가 로그인을 시도할 때, 데이터베이스에서 사용자 정보를 확인하고 인증하는 코드입니다.
def login(username: String, password: String): Boolean = {
val connection: Connection = DriverManager.getConnection(url, this.username, this.password)
val statement = connection.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?")
statement.setString(1, username)
statement.setString(2, password)
val resultSet = statement.executeQuery()
val isValidUser = resultSet.next() // 사용자 정보가 존재하는지 확인
connection.close()
isValidUser
}
예제 2: 상품 추가
쇼핑몰에서 관리자가 신규 상품을 추가할 때 사용하는 코드입니다.
def addProduct(name: String, price: Double): Unit = {
val connection: Connection = DriverManager.getConnection(url, this.username, this.password)
val statement = connection.prepareStatement("INSERT INTO products (name, price) VALUES (?, ?)")
statement.setString(1, name)
statement.setDouble(2, price)
statement.executeUpdate() // 상품 추가 실행
connection.close()
}
5. 흔한 실수와 주의사항
실수 1: 연결 정보 누락
잘못된 코드:
val connection: Connection = DriverManager.getConnection(url)
올바른 코드:
val connection: Connection = DriverManager.getConnection(url, username, password)
실수 2: 연결 종료 누락
잘못된 코드:
// 연결 종료를 하지 않음
올바른 코드:
connection.close() // 항상 연결을 종료해야 메모리 누수를 방지합니다.