쿼리 실행하기
행을 케이스 클래스로 읽어 보세요.
쿼리 실행하기은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.
sql 보간기
Doobie의 sql 문자열 보간기는 쿼리의 핵심입니다. SQL을 파싱하고 삽입된 Scala 값을 안전하게 바인딩된 매개변수로 변환합니다.
보간된 값은 JDBC ? 자리 표시자가 되므로 SQL 삽입 공격이 발생하지 않으며 PreparedStatement를 수동으로 연결할 필요도 없습니다.
import doobie.implicits._
val minAge = 18
val frag = sql"select name from users where age >= $minAge"Fragment에서 Query로
sql"..." 표현식은 Fragment입니다. 이를 읽기 작업으로 실행하려면 .query[A]를 호출하고 행의 타입 A를 지정합니다.
Doobie는 Read[A] 타입클래스를 사용해 결과 열을 A에 매핑하며, 기본 타입과 튜플, 케이스 클래스도 지원합니다.
case class User(name: String, age: Int)
val q: Query0[User] =
sql"select name, age from users".query[User]unique, option, to
Query0[A]는 여러 누적기를 제공합니다. .unique는 정확히 한 행을, .option은 0개 또는 1개의 행을 기대하며, .to[List]은 모든 행을 수집합니다.
각 메서드는 나중에 .transact하는 ConnectionIO를 반환합니다.
val one: ConnectionIO[User] = q.unique
val maybe: ConnectionIO[Option[User]] = q.option
val all: ConnectionIO[List[User]] = q.to[List]행을 케이스 클래스에 매핑하기
각 필드에 열 매핑이 있으면 Doobie가 케이스 클래스의 Read 인스턴스를 자동으로 파생합니다. 열 순서는 select 목록과 일치해야 합니다.
따라서 번거로운 행 파싱 없이 풍부한 도메인 타입으로 바로 조회할 수 있습니다.
case class Account(id: Long, email: String, active: Boolean)
val accounts =
sql"select id, email, active from accounts"
.query[Account].to[Vector]매개변수화된 쿼리
보간된 모든 Scala 값은 해당 Put 인스턴스를 사용해 매개변수로 바인딩됩니다. 서로 다른 위치를 포함해 원하는 만큼 보간할 수 있습니다.
값을 문자열로 이어 붙이는 것이 아니라 바인딩하므로 타입이 검사되고 주입 공격이 불가능합니다.
def findByEmail(email: String): ConnectionIO[Option[Account]] =
sql"select id, email, active from accounts where email = $email"
.query[Account].option대용량 결과 스트리밍
결과 집합이 큰 경우 .stream을 사용해 fs2 Stream[ConnectionIO, A]를 가져오세요. 서버 측 커서를 사용해 행을 지연 방식으로 가져오므로 메모리 사용량이 제한됩니다.
fs2 조합기와 함께 사용하면 수백만 개의 행도 조금씩 처리할 수 있습니다.
import fs2.Stream
val s: Stream[ConnectionIO, Account] =
sql"select id, email, active from accounts"
.query[Account].stream가져오기 크기 제어
일부 드라이버에서는 기본 커서 가져오기 크기가 모든 데이터를 한 번에 불러올 수 있습니다. .streamWithChunkSize(n)은 JDBC 가져오기 크기를 설정해 커서가 왕복 한 번마다 n개의 행을 가져오게 합니다.
이 값을 조정하면 왕복 횟수와 메모리 사용량 사이의 균형을 맞출 수 있습니다.
val s =
sql"select id, email, active from accounts"
.query[Account]
.streamWithChunkSize(512)선택적 열과 NULL 허용
NULL을 허용하는 열은 행 타입에서 Option[A]으로 매핑됩니다. 열에 NULL이 들어올 수 있다면 반드시 Option으로 읽어야 하며, 그렇지 않으면 Doobie가 NULL 값에서 예외를 발생시킵니다.
이렇게 하면 경계에서 NULL 허용 여부가 명시적으로 드러나고 타입 안전성도 확보됩니다.
case class Person(id: Long, nickname: Option[String])
val ps =
sql"select id, nickname from people".query[Person].to[List]Fragment로 SQL 작성하기
Fragment 값은 ++로 조합할 수 있으므로 매개변수를 바인딩한 상태로 여러 조각에서 쿼리를 구성할 수 있습니다.
fr 보간기는 뒤에 공백이 붙은 fragment를 만들어 주므로 절을 이어 붙일 때 편리합니다.
val base = fr"select id, email, active from accounts"
val where = fr"where active = $${true}"
val q = (base ++ where).query[Account]동적 WHERE 절
Doobie의 Fragments 도우미는 조건부 절을 구성합니다. Fragments.whereAndOpt는 선택적 필터를 결합하고, 실제로 지정된 필터만 출력합니다.
안전한 동적 검색 쿼리를 작성하는 관용적인 방법입니다.
import doobie.util.fragments._
val emailOpt: Option[String] = Some("a@b.com")
val filter = whereAndOpt(emailOpt.map(e => fr"email = $e"))
val q = (fr"select id, email, active from accounts" ++ filter)빌드 시 쿼리 검사
Doobie의 check 분석은 데이터베이스 스키마를 대상으로 쿼리를 실행해 열의 타입과 개수가 Scala 타입과 일치하는지 확인합니다.
테스트에서 사용하면 스키마 변경이 운영 환경에 도달하기 전에 발견할 수 있습니다.
import doobie.scalatest._
// inside a spec mixing in IOChecker
check(sql"select id, email, active from accounts".query[Account])빠른 확인
알맞은 누적기를 선택하세요.
복습
sql 보간기는 매개변수화된 Fragment를 만들고, .query[A]는 이를 Read[A]를 통해 매핑된 Query0[A]로 변환합니다.
.unique, .option, .to[List], .stream 중 하나를 선택해 행을 누적하세요. 동적 절에는 Fragments를 사용하고, 스키마에 대한 검증에는 check를 사용하세요.
AI 튜터와 함께 Scala을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 39
- 레슨
- 143
자주 묻는 질문
“쿼리 실행하기” 강의는 무료인가요?
네 — “쿼리 실행하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.
“쿼리 실행하기”에서 뭘 배우나요?
행을 케이스 클래스로 읽어 보세요. 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“쿼리 실행하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.