이번 문서의 목표: 이 문서를 다 읽으면 컴퓨터에 Oracle 데이터베이스를 직접 띄우고, DBeaver로 접속하고, 이 과목 전체가 공유하는 실습 데이터(seed.sql)를 적재해서, 03편 이후 어떤 편을 펴더라도 예제 SQL을 그대로 복사해 실행하고 결과를 눈으로 확인할 수 있다.
0. 왜 SQLD에서 실습이 특히 중요한가
SQLD의 가장 흔한 문제 유형은 “이 SQL을 실행하면 결과가 어떻게 나오는가”를 묻는 것이다. 그런데 이 유형의 정답은 눈으로만 봐서는 확신이 서지 않는 경우가 많다.
NULL이 섞인 컬럼을 집계할 때COUNT(*)와COUNT(컬럼)의 값이 갈리는 순간OUTER JOIN을 실행했을 때 결과 행이 정확히 몇 개로 늘어나는지- 동점이 있을 때
RANK와DENSE_RANK가 매기는 숫자가 어디서부터 달라지는지 NOT IN목록 안에NULL이 하나만 섞여도 결과 전체가 텅 비어버리는 것
이런 지점은 “안다고 생각했는데 막상 시험장 선택지 앞에서 흔들리는” 대표적인 함정이다. 반대로 한 번이라도 직접 돌려서 결과 화면을 본 사람은 선택지를 훨씬 빠르고 확실하게 고른다. 그래서 이 부록은 나머지 30개 편 어디에서든 예제 SQL을 그 자리에서 실행해 볼 수 있는 환경을 만드는 것을 목표로 한다.
이 시험은 응시 자격 제한이 없어 컴퓨터·터미널이 낯선 입문자도 많이 응시한다. 그래서 이 문서는 “터미널이 뭔지”, “포트가 뭔지” 같은 가장 기본적인 개념부터 하나씩 설명한다. 이미 익숙하다면 해당 설명은 건너뛰어도 좋다.
1. Docker 설치하기
Docker가 무엇인가
Docker는 프로그램을 “컨테이너(container)“라는 독립된 상자 안에서 실행해 주는 도구다. Oracle 데이터베이스는 원래 설치 절차가 꽤 복잡한 프로그램인데, Docker를 쓰면 그 복잡한 설치 과정을 컨테이너 안에 미리 다 넣어 둔 상태로 통째로 받아서, 명령 한 줄로 실행할 수 있다. 컴퓨터에 직접 Oracle을 설치하는 것이 아니라, Oracle이 이미 설치되어 있는 상자를 빌려 와 내 컴퓨터 위에서 돌리는 것이라고 이해하면 된다. 나중에 필요 없어지면 그 상자만 통째로 지우면 되므로, 내 컴퓨터의 다른 프로그램에 영향을 주지 않는다는 장점도 있다.
설치 절차
운영체제에 맞는 Docker Desktop을 내려받아 설치한다.
- Windows: Docker Desktop은 내부적으로 WSL2(Windows Subsystem for Linux 2, 윈도우 안에서 리눅스 환경을 함께 돌리는 기능)를 사용한다. 설치 프로그램이 WSL2가 없으면 자동으로 안내하니, 안내 창이 뜨면 그대로 따라가면 된다.
- macOS: Apple Silicon(M1 이상)과 Intel 칩 버전이 따로 있으니, 내 컴퓨터의 칩 종류에 맞는 설치 파일을 받는다.
설치가 끝나면 Docker Desktop 프로그램을 한 번 실행해서 왼쪽 아래(또는 상단)에 있는 상태 표시가 “실행 중”으로 바뀔 때까지 기다린다. 이 상태여야 아래 명령들이 동작한다.
설치 확인
터미널(윈도우는 PowerShell이나 명령 프롬프트, macOS는 터미널 앱)을 열고 다음을 입력한다.
docker --versionDocker version 2x.x.x, build ...처럼 버전 정보가 나오면 설치가 끝난 것이다.
2. Oracle 컨테이너 띄우기
실행 명령
터미널에 다음 한 줄을 입력한다.
docker run -d --name oracle -p 1521:1521 -e ORACLE_PASSWORD=zeno gvenzl/oracle-free:slim각 부분이 무슨 뜻인가
| 조각 | 의미 |
|---|---|
docker run | 새 컨테이너(상자)를 실행하라는 명령 |
-d | 백그라운드(background, 화면에 나타나지 않고 뒤에서 계속 돌아가는 상태)로 실행한다. 이 옵션이 없으면 터미널 창을 닫는 순간 컨테이너도 함께 멈춘다 |
--name oracle | 이 컨테이너에 oracle이라는 이름표를 붙인다. 나중에 docker logs oracle처럼 이 이름으로 다시 찾을 수 있다 |
-p 1521:1521 | 포트(port) 연결. 포트란 컴퓨터가 네트워크로 대화할 때 쓰는 창구 번호라고 생각하면 된다. 아파트 동 안에 있는 여러 개의 호실 같은 것으로, 같은 컴퓨터 안에서도 프로그램마다 다른 포트로 대화한다. 1521:1521은 “내 컴퓨터의 1521번 창구로 오는 연결을, 컨테이너 안의 1521번 창구로 그대로 전달하라”는 뜻이다. 1521은 Oracle이 전통적으로 쓰는 기본 포트 번호다 |
-e ORACLE_PASSWORD=zeno | 환경변수(environment variable, 프로그램 실행 시 전달하는 설정값)로 관리자 비밀번호를 zeno로 지정한다. 실습용이라 간단하게 정했을 뿐이니, 원하는 값으로 바꿔도 된다(이 문서의 뒤 내용에서는 zeno를 쓴다고 가정한다) |
gvenzl/oracle-free:slim | 실행할 이미지(image, 컨테이너의 설계도) 이름. 아래에서 이 이미지를 선택한 이유를 자세히 설명한다 |
왜 gvenzl/oracle-xe가 아니라 gvenzl/oracle-free인가
인터넷에서 “Docker Oracle” 예제를 검색하면 gvenzl/oracle-xe를 쓰는 글이 아직도 많이 보인다. 하지만 이 이미지는 그대로 따라 쓰면 안 된다.
Oracle은 무료로 제공하던 경량판 데이터베이스의 이름을 Express Edition(XE) 에서 Database Free(23ai) 로 바꾸면서, 이 변화에 맞춰 Docker 이미지도 새 이름으로 옮겼다. 옛 이름(oracle-xe)으로 된 이미지는 2024년 10월 1일 이후로 갱신이 끊겼고, 새 이름(oracle-free)은 이 문서를 쓰는 시점(2026년 8월 30일)까지도 계속 갱신되고 있다. 인터넷의 예제 대부분이 옛날에 작성된 글이라 아직 oracle-xe를 그대로 쓰고 있을 뿐이니, 새로 실습 환경을 만든다면 반드시 gvenzl/oracle-free를 써야 한다.
| 이미지 | 최근 갱신 | 판정 |
|---|---|---|
gvenzl/oracle-xe | 2024년 10월 1일 | 쓰지 않는다(갱신이 끊긴 구버전) |
gvenzl/oracle-free | 2026년 8월 30일 | 이것을 쓴다 |
첫 실행은 몇 분이 걸린다
docker run 명령을 입력하면 화면에 곧바로 긴 글자(컨테이너 ID)가 출력되는데, 이것을 보고 “벌써 다 됐다”고 착각하기 쉽다. 실제로는 그렇지 않다. Oracle 데이터베이스 자체를 처음부터 초기화하는 작업이 뒤에서 계속 진행 중이며, 컴퓨터 사양에 따라 몇 분에서 십몇 분까지 걸릴 수 있다. 이 단계에서 “안 되는구나” 하고 포기하는 경우가 가장 많으니, 반드시 진행 상황을 직접 눈으로 확인하고 기다려야 한다.
docker logs -f oracle-f는 “follow”의 줄임말로, 로그(실행 기록)가 새로 찍힐 때마다 화면에 계속 이어서 보여 달라는 뜻이다. 화면에 다음과 같은 문구가 나타나면 초기화가 끝난 것이다.
#########################
DATABASE IS READY TO USE!
#########################이 문구를 확인한 뒤 Ctrl + C를 눌러 로그 보기를 종료하면 된다(컨테이너 자체는 그대로 계속 실행된다).
3. DBeaver 설치와 접속
이 단계에서 가장 많은 사람이 막힌다. 하나씩 순서대로 따라간다.
DBeaver 설치
1. 설치 파일 내려받기
dbeaver.io/download 에서 DBeaver Community(무료판) 설치 파일을 내려받는다. Enterprise(유료판)가 아니라 Community를 받아야 한다.
2. 설치 실행
내려받은 설치 파일을 실행하고 안내대로 “다음”을 눌러 설치를 끝낸다.
3. DBeaver 실행
설치가 끝나면 DBeaver를 실행한다. 처음 실행하면 빈 화면이 나온다.
새 연결 만들기
1. 새 데이터베이스 연결 시작
왼쪽 위의 “새 데이터베이스 연결” 아이콘(콘센트 플러그 모양)을 클릭하거나, 메뉴에서 데이터베이스 항목 안의 새 연결을 선택한다.
2. Oracle 선택
데이터베이스 종류 목록에서 Oracle을 찾아 선택하고 다음으로 넘어간다.
3. 접속 정보 입력
다음 표의 값을 그대로 입력한다.
| 항목 | 값 |
|---|---|
| Host | localhost |
| Port | 1521 |
| Database/Service | FREEPDB1 |
| Username | system |
| Password | 2단계에서 정한 값(이 문서 예시 기준 zeno) |
4. Service Name인지 SID인지 확인
Oracle 연결 화면에는 접속 대상을 Service Name(서비스 이름)으로 지정할지 SID로 지정할지 고르는 선택지가 있다. gvenzl/oracle-free 이미지는 서비스 이름 FREEPDB1을 쓰므로, 반드시 Service Name을 선택한 상태에서 FREEPDB1을 입력해야 한다. 이 선택이 SID로 되어 있으면 값이 맞아도 접속이 실패하니, 접속이 안 될 때 가장 먼저 확인해야 할 지점이다.
5. 드라이버 다운로드
처음 Oracle에 연결하면 DBeaver가 “Oracle 드라이버 파일이 없습니다. 내려받으시겠습니까”라는 팝업을 띄운다. 여기서 다운로드를 눌러 받아야 접속이 가능하다.
6. 연결 테스트
입력 화면 아래의 “연결 테스트” 버튼을 눌러 본다. “성공적으로 연결되었습니다”라는 메시지가 나오면 마침 버튼을 눌러 연결을 완료한다.
4. seed.sql 적재하기
이 과목의 모든 실습 예제가 공유하는 테이블 데이터를 담은 파일이 public/sqld/seed.sql이다. 이 파일을 한 번만 실행해 두면, 이후 03편부터 어떤 편을 펴더라도 그 편의 예제 SQL을 그대로 복사해 실행할 수 있다.
1. seed.sql 파일 준비
사이트에서 파일을 내려받거나, 저장소의 public/sqld/seed.sql 내용을 복사해 내 컴퓨터에 같은 이름의 파일로 저장해 둔다.
2. SQL 편집기 열기
DBeaver에서 방금 만든 Oracle 연결을 선택한 상태로, 상단 메뉴에서 새 SQL 편집기를 연다(연결된 데이터베이스를 클릭한 뒤 SQL 편집기 열기를 선택하면 된다).
3. 내용 붙여넣기
seed.sql 파일을 열어 내용 전체를 복사한 뒤, 방금 연 SQL 편집기에 붙여넣는다.
4. 스크립트 전체 실행
여기서 반드시 주의해야 한다. DBeaver의 실행 버튼에는 “단건 실행”(커서가 있는 문장 하나만 실행)과 “스크립트 실행”(편집기 안의 모든 문장을 순서대로 실행) 두 가지가 있다. seed.sql은 여러 개의 CREATE TABLE과 INSERT, PL/SQL 블록이 순서대로 이어지는 파일이므로, 반드시 스크립트 실행(보통 단축키가 Alt + X이고, 재생 버튼 여러 개가 겹친 모양의 아이콘이다)을 눌러야 한다. 단건 실행 버튼을 누르면 커서가 있는 한 문장만 실행되어 나머지가 만들어지지 않는다.
5. 적재 확인
스크립트 실행이 끝나면 파일 맨 아래에 있던 확인용 SELECT 문들의 결과가 차례로 표시된다. 그중 하나를 아래에서 다시 시도해 본다.
SELECT * FROM 사원;행이 몇 건 나오면 성공이다.
4-1. 22·23편만을 위한 보조 스크립트: seed-22-23.sql
사원 테이블은 08·09·15·22·23편에서 반복해 쓰이는데, 22편(Top N·ROWNUM·계층형 질의)과 23편(PIVOT)은 문서 안에서 08·09·15편과는 다른, 독자적인 5명짜리 예시 데이터를 쓴다. 인원 구성 자체가 달라 하나의 사원 테이블로 두 그룹을 동시에 재현할 수 없으므로, seed.sql은 08·09·15편을 정본으로 채택했다.
22·23편의 예제를 문서에 적힌 숫자 그대로 확인하고 싶다면, public/sqld/seed-22-23.sql을 추가로 실행해 사원 테이블을 이 두 편 전용 데이터로 잠시 바꿔야 한다. 실행 방법은 seed.sql을 적재할 때와 같다(DBeaver SQL 편집기에 붙여넣고 스크립트 실행).
seed-22-23.sql을 실행하면 사원 테이블이 22·23편 전용 데이터로 완전히 바뀌어, 08·09·15편의 실습 결과가 더 이상 문서와 맞지 않게 된다. 22·23편 실습이 끝나고 다시 08·09·15편으로 돌아가려면 seed.sql을 재실행해 사원 테이블을 원래 상태로 되돌려야 한다.
5. 무설치 대안: Oracle Live SQL
Docker 설치가 부담스럽거나, 컴퓨터 사양이 낮아 Docker Desktop을 돌리기 어려운 경우도 있다. 이런 상황을 위한 대안이 Oracle Live SQL(livesql.oracle.com )이다.
Oracle Live SQL은 브라우저만 있으면 별도 설치 없이 곧바로 Oracle SQL을 실행해 볼 수 있는 무료 웹 서비스다. 무료 계정 가입이 필요하지만, 컴퓨터에 아무것도 설치하지 않아도 된다는 것이 가장 큰 장점이다.
다만 Docker 방식과 다른 점이 하나 있다. Docker로 띄운 내 컴퓨터의 데이터베이스는 한 번 seed.sql을 적재해 두면 컴퓨터를 껐다 켜도(컨테이너를 다시 시작하면) 데이터가 그대로 남아 있다. 반면 Oracle Live SQL은 세션(브라우저 접속 단위)이 유지되지 않는 경우가 있어, 접속할 때마다 seed.sql을 다시 붙여넣어 실행해야 할 수 있다. 자주, 꾸준히 실습할 계획이라면 Docker 쪽이 더 편하고, “일단 한 번 가볍게 SQL 결과만 확인해 보고 싶다”는 상황에는 Live SQL이 더 빠른 선택이다.
6. 다른 DBMS로 연습하면 안 되는 이유
설치가 더 쉽다는 이유로 SQLite나 MySQL로 연습하려는 경우가 있는데, 이 과목에서는 절대로 권장하지 않는다. SQLD는 Oracle SQL을 기준으로 출제되며, 다음 표의 문법은 Oracle에만 있고 MySQL·SQLite에는 아예 존재하지 않는다.
| 시험에 나오는 문법 | Oracle | MySQL | SQLite |
|---|---|---|---|
ROWNUM | 지원 | 미지원 | 미지원 |
CONNECT BY(계층형 질의) | 지원 | 미지원 | 미지원 |
DECODE | 지원 | 미지원 | 미지원 |
NVL | 지원 | 미지원(IFNULL로 대체) | 미지원(IFNULL로 대체) |
DUAL | 지원 | 형태만 다르게 지원 | 미지원 |
ROWNUM, CONNECT BY, DECODE, NVL, DUAL은 22·23·25편에서 다루는 만큼 SQLD 기출에 반복해서 나오는 핵심 문법이다. 다른 DBMS로 연습하면 이 문법 자체를 실행해 볼 방법이 없어, 결국 시험에 나오지 않는 문법만 잔뜩 익히고 정작 필요한 문법은 한 번도 손으로 쳐 보지 못한 채 시험장에 들어가게 된다. 25편에서 다루는 DBMS 간 차이는 “알아 두면 실무에 도움이 되는 보너스 지식”이지, Oracle 학습을 대체할 수 있는 것이 아니다.
7. 안 될 때 확인할 것들
| 증상 | 원인 | 해결 |
|---|---|---|
docker run 실행 시 포트 관련 오류 | 컴퓨터의 1521번 포트를 이미 다른 프로그램이 쓰고 있음 | -p 1522:1521처럼 앞의 숫자(내 컴퓨터 쪽 포트)를 다른 값으로 바꾸고, DBeaver 접속 정보의 Port도 그 값으로 맞춘다 |
| DBeaver 접속이 계속 실패함(방금 컨테이너를 띄운 직후) | 아직 데이터베이스 초기화가 끝나지 않은 상태에서 접속을 시도함 | docker logs -f oracle로 DATABASE IS READY TO USE! 문구가 나올 때까지 기다린 뒤 다시 접속한다 |
ORA-01017 등 비밀번호 오류 | docker run 실행 시 지정한 비밀번호와 DBeaver에 입력한 비밀번호가 다름 | 컨테이너를 띄울 때 쓴 -e ORACLE_PASSWORD 값을 다시 확인하고 DBeaver 접속 정보를 그 값으로 고친다 |
docker run 실행 시 이름 충돌 오류 | oracle이라는 이름의 컨테이너가 이미 존재함(이전에 한 번 만든 적이 있음) | docker start oracle로 기존 컨테이너를 다시 켜거나, docker rm oracle로 지운 뒤 새로 만든다 |
| 컨테이너가 계속 재시작되거나 응답이 없음 | 컴퓨터의 메모리(RAM)가 부족함 | Docker Desktop의 설정에서 컨테이너에 할당하는 메모리를 늘리거나, 다른 무거운 프로그램을 종료한 뒤 다시 시도한다. 그래도 어렵다면 5절의 Oracle Live SQL을 대신 쓴다 |
8. 환경 점검 실습
seed.sql 적재가 끝났다면, 아래 SQL을 하나씩 직접 실행해서 결과를 확인해 본다. 결과를 미리 적어 두지 않을 테니, 각 문장을 실행하기 전에 “몇 건이 나올까”를 먼저 예상해 보고 실제 결과와 맞춰 보자.
-- 1) 사원 테이블에 몇 명이 들어 있는지 확인
SELECT COUNT(*) FROM 사원;-- 2) EMP와 DEPT를 조인했을 때 몇 행이 나오는지 확인 (16편에서 다시 배운다)
SELECT E.NAME, D.DNAME
FROM EMP E
JOIN DEPT D ON E.DEPT_ID = D.DEPT_ID;-- 3) 직원 테이블에 부서별 순위를 매겨 본다 (19편에서 다시 배운다)
SELECT 사번, 이름, 부서, 급여,
RANK() OVER (PARTITION BY 부서 ORDER BY 급여 DESC) AS 순위
FROM 직원;세 쿼리 모두 오류 없이 표 형태의 결과가 나오면, 실습 환경 준비가 끝난 것이다. 이 상태에서 03편부터 순서대로 읽어 나가면 된다.
핵심 정리
- SQLD는 “실행 결과를 예측하는” 문제 비중이 높아, 직접 돌려서 확인하는 실습이 다른 과목보다 훨씬 중요하다.
- 실습 기준 DBMS는 Oracle 하나로 고정한다.
ROWNUM·CONNECT BY·DECODE·NVL·DUAL이 MySQL·SQLite에는 없어, 다른 DBMS로 연습하면 틀린 문법을 익히게 된다. - Docker 이미지는 갱신이 끊긴
gvenzl/oracle-xe가 아니라, 계속 갱신되는gvenzl/oracle-free를 써야 한다. - 컨테이너를 처음 띄우면 초기화에 몇 분이 걸리므로,
docker logs -f oracle로DATABASE IS READY TO USE!문구를 확인한 뒤 접속을 시도한다. - DBeaver 접속 시 Database/Service 항목은 SID가 아니라 Service Name(
FREEPDB1)으로 선택해야 한다. public/sqld/seed.sql을 DBeaver의 SQL 편집기에 붙여넣고 반드시 스크립트 실행으로 한 번에 돌려야 모든 테이블과 데이터가 만들어진다.- Docker 설치가 부담되면 Oracle Live SQL로 대체할 수 있지만, 세션이 유지되지 않아 매번 seed.sql을 다시 실행해야 할 수 있다.