문서 읽는 데 35분 · A0

A-0: 개발 환경 설정 — 첫 SQL을 만나기 위한 준비

목차 28
전체 24강 중 1강 · 데이터베이스
난이도 · 입문

ℹ️Oracle SQL로 SQLD 자격증을 대비하며 실전 SQL을 쌓는 트랙이에요. 프로그래밍 경험이 없어도 시작할 수 있고, 부트캠프에서는 자바 기초 다음·스프링 부트 직전에 배치하길 권해요.

안녕하세요! 데이터베이스의 세계로 여러분을 안내할 홍순구 튜터입니다. 드디어 첫 시간이네요, 반갑습니다.

앞으로 우리는 Oracle 데이터베이스 위에서 SQL이라는 언어를 배우고, SQLD(SQL 개발자) 자격증까지 함께 준비합니다. 교재의 예제는 전부 하나로 이어져요. 바로 여러분이 매일 쓰는 인스타그램을 그대로 닮은 데이터베이스를 처음부터 직접 만들어 나가는 겁니다. 회원이 있고, 게시물이 있고, 댓글과 좋아요와 팔로우가 서로 얽히는 바로 그 구조를요.

"저는 프로그래밍을 한 번도 안 해봤는데 괜찮을까요?" 네, 전혀 걱정 마세요. 이 과목은 코딩 경험이 없어도 시작할 수 있게 설계했습니다. SQL은 영어 문장에 가까운 언어라, 한 줄씩 천천히 따라오면 누구나 데이터를 자유롭게 다루게 됩니다.

다만 본격적으로 SQL을 만나기 전에 딱 하나 준비할 게 있어요. SQL을 실행해 볼 무대, 바로 데이터베이스 실습 환경입니다. 요리를 배우려면 먼저 주방이 있어야 하죠? 오늘은 그 주방을 차리는 시간입니다. 환경만 잘 잡아두면 다음 시간부터는 SQL에만 온전히 집중할 수 있어요.

텍스트
 오늘의 여정 — 실습 환경을 잡고 첫 접속까지

  ① 무설치        브라우저만으로  가장 빠른 첫 SELECT
       │
  ② 로컬 Docker   docker compose up  내 컴퓨터에 진짜 DB    우리의 메인 경로
       │
  ③ 클라우드       Oracle Cloud  어디서든 접속되는 개인 DB
       │
       
   "환경이 살아있다" 확인  SELECT * FROM member 로 첫 조회 성공

자, 그럼 우리의 첫 데이터베이스를 켜러 가볼까요?

💡 오늘 수업의 핵심 — "내 컴퓨터 안에 진짜 데이터베이스를 띄우고, 조회 한 줄로 '환경이 살아있다'를 확인한다"

🎯 학습 목표

  • 실습 환경 세 가지 경로(무설치 · 로컬 Docker · 클라우드)의 차이를 이해하고, 내 상황에 맞는 것을 고를 수 있다.
  • docker compose up 한 줄로 Oracle 데이터베이스를 내 컴퓨터에 띄울 수 있다.
  • SQL 클라이언트로 접속해 SELECT * FROM member 로 환경이 정상 동작하는지 확인할 수 있다.

Step 1: "데이터베이스는 대체 어디서 돌아가나요?"

본격적인 설정에 앞서, 아주 짧게 개념 하나만 짚고 갈게요.

우리가 다룰 데이터베이스는 데이터를 차곡차곡 담아두는 거대한 창고예요. 그리고 그 창고를 관리하는 프로그램을 DBMS(Database Management System), 즉 데이터베이스 관리 시스템이라고 부릅니다. 우리가 이번 과목에서 쓸 DBMS가 바로 Oracle(오라클)이에요. (관계형 모델이니 테이블이니 하는 정식 개념은 다음 시간에 제대로 다룹니다. 오늘은 "데이터베이스도 결국 프로그램"이라는 것만 기억해 주세요.)

여기서 중요한 사실 하나. 데이터베이스는 프로그램이기 때문에, 누군가의 컴퓨터에서 돌아가고 있어야 우리가 접속할 수 있습니다. 그럼 그 프로그램을 어디서 돌릴까요? 크게 세 갈래 길이 있습니다.

세 갈래 길

경로 한 줄 설명 좋은 점 아쉬운 점
① 무설치 브라우저로 오라클이 빌려주는 DB에 접속 가입만 하면 0초 시작 영속성·동시 접속에 약함
② 로컬 Docker 🌟 내 컴퓨터 안에 DB를 띄움 인터넷 없이도 동작, 내 마음대로 처음 한 번 설치가 필요
③ 클라우드 클라우드에 내 전용 DB를 둠 어디서든 접속, 개인 영속 무료 한도·미사용 시 정지
텍스트
 ① 무설치        내 브라우저 ──인터넷── [ 오라클이 빌려주는 서버의 DB ]
 ② 로컬 Docker   내 컴퓨터 안에 [ 컨테이너 = 내 DB ]    인터넷 없이도 동작
 ③ 클라우드       내 브라우저 ──인터넷── [ 클라우드에 있는 내 전용 DB ]

그럼 누구에게 무엇이 맞을까요? 일단 SQL이 처음이라 "되는지부터 빨리 보고 싶다"면 ① 무설치가 좋아요. 제대로 공부하면서 데이터를 직접 넣고 빼며 체득하고 싶다면 ② 로컬 Docker가 정답입니다. 그래서 이 강의의 메인 경로는 ②예요. ③ 클라우드는 여러 기기에서 접속하거나 포트폴리오로 남기고 싶을 때 더해주면 됩니다.

오늘은 세 가지를 다 만나보되, ② 로컬 Docker를 중심으로 환경을 완성하겠습니다.

💡 한 줄 정리

데이터베이스는 어딘가에서 돌아가는 프로그램이고, 그걸 돌리는 방법이 무설치 · 로컬 Docker · 클라우드 세 가지다. 우리의 주력은 로컬 Docker.

🙋 학생 질문 — "튜터님, 세 가지를 다 알아야 하나요? 하나만 쓰면 안 돼요?"

당장은 하나만 써도 충분합니다. 우리는 ② 로컬 Docker 하나로 끝까지 갈 거예요.

그런데 세 가지를 한 번씩 보는 데는 이유가 있어요. 실무에서도 "잠깐 테스트만" 할 땐 무설치를, "내 PC에서 개발"할 땐 로컬을, "남에게 보여주거나 협업"할 땐 클라우드를 골라 씁니다. 상황마다 맞는 도구가 다르다는 감각을 첫날에 잡아두면, 나중에 "이건 어디서 돌려야 하지?" 하고 헤매지 않아요.


Step 2: "클릭 한 번으로 첫 SELECT — 무설치로 시작하기"

가장 빠르게 성공을 맛보는 길부터 가볼게요. 아무것도 설치하지 않고, 브라우저만으로요.

Oracle Live SQL이라는 사이트에 들어가 무료로 가입하면, 곧바로 SQL을 입력하는 창이 열립니다. 설치도, 설정도 없어요. 오라클이 자기네 서버에 DB를 띄워두고 잠깐 빌려주는 방식이거든요.

그럼 첫 SQL 한 줄을 실행해 봅시다.

SQL
SELECT 1 FROM dual;

SELECT는 "조회해라", 1은 그냥 숫자 1을 의미해요. 그런데 뒤의 dual(듀얼)은 뭘까요? dual오라클이 기본으로 제공하는, 딱 한 줄짜리 더미(dummy) 테이블입니다. 조회할 진짜 데이터가 없어도 "계산 한 번 해보고 싶다", "DB가 살아있나 확인하고 싶다" 할 때 쓰는 연습용 받침대예요.

이 한 줄을 실행하면 결과로 1 이 딱 하나 돌아옵니다.

텍스트
        1
 ---------
        1

별것 아닌 것 같죠? 하지만 방금 여러분은 SQL을 실행하고 데이터베이스의 응답을 받아본 겁니다. 이게 앞으로 수백 번 반복할 흐름의 첫걸음이에요. 질문(SQL)을 던지면 → DB가 답(결과)을 돌려준다.

다만 무설치 환경은 "첫 성공"에 좋은 만큼 한계도 분명해요. 내가 만든 데이터가 오래 보존된다는 보장이 약하고, 여러 명이 동시에 붙으면 불안정합니다. 그래서 진짜 공부는 다음 경로, 내 컴퓨터 안의 DB에서 합니다.

💡 한 줄 정리

무설치(Oracle Live SQL)는 브라우저 가입만으로 즉시 SQL을 실행해 볼 수 있는 가장 빠른 길이다. SELECT 1 FROM dual 로 첫 응답을 받아봤다.

🙋 학생 질문 — "튜터님, 왜 굳이 dual이라는 가짜 테이블이 필요해요?"

좋은 질문이에요. 오라클에서 SELECT는 문법상 반드시 "어느 테이블에서" 가져올지(FROM)를 적어야 합니다. 그런데 1+1 같은 단순 계산이나 현재 시각 확인처럼, 특정 테이블의 데이터가 필요 없는 경우가 있죠.

이때 형식만 채워줄 테이블이 필요한데, 그게 dual이에요. 행이 딱 하나뿐이라 결과도 딱 한 줄만 나옵니다. "문법은 지키되 내용은 비워둔 받침대"라고 생각하면 됩니다. 참고로 이건 오라클 특유의 표현이고, 다른 데이터베이스에서는 FROM 없이도 계산되는 경우가 있어요. 이런 방언 차이는 나중 모듈에서 자세히 다룹니다.


Step 3: "내 컴퓨터에 진짜 DB를 — Docker라는 표준 상자"

이제 우리의 메인 경로입니다. 내 컴퓨터 안에 Oracle 데이터베이스를 직접 띄워볼게요. 그런데 그냥 설치하면 안 되나, 왜 Docker를 쓰나부터 짚고 가겠습니다.

Oracle 같은 큰 데이터베이스를 컴퓨터에 직접 설치하는 건 생각보다 까다로워요. 운영체제(윈도우·맥·리눅스)마다 방법이 다르고, 설정도 복잡합니다. "분명 똑같이 했는데 나만 안 돼요" 같은 일이 자주 벌어지죠.

그래서 등장한 게 Docker(도커), 그리고 컨테이너(container)라는 개념입니다.

컨테이너를 항구의 표준 화물 컨테이너에 비유해 볼게요. 안에 든 게 냉장 식품이든 자동차든, 컨테이너 규격은 똑같아서 어떤 배든 어떤 항구든 그대로 실립니다. 소프트웨어 컨테이너도 마찬가지예요. 프로그램과 그 프로그램이 돌아가는 데 필요한 환경을 통째로 표준 상자에 담아둔 것이라, 내 PC든 친구 PC든 똑같이 동작합니다. "나만 안 되는" 문제가 사라지는 거죠.

우리가 쓸 상자는 이미 만들어져 있어요. 이름은 이렇습니다.

텍스트
 gvenzl/oracle-free:slim
   ├─ gvenzl       이미지를 만든 사람
   ├─ oracle-free  DB 종류 (Oracle Free)
   └─ slim         가벼운(slim) 버전

이 상자의 설계도이미지(image)라고 부르고, 그 설계도로 실제로 띄운 것을 컨테이너라고 불러요. 이미지를 내려받아 컨테이너로 띄우면 내 컴퓨터 안에 Oracle DB가 생기는 겁니다.

⚠️ 함정 — 이미지 이름 뒤의 :slim처럼 버전 숫자를 박지 않은 태그를 쓰는 걸 추천해요. :23.5.0 같이 특정 버전을 콕 집으면, 시간이 지나 그 버전이 사라지면 받기 어려워집니다. :slim은 "가벼운 최신 버전"을 항상 가리켜서 안전해요.

"맥은 오라클 못 돌린다던데요?" 그건 옛말입니다. 요즘 이 이미지는 애플 실리콘(M1~M4) 맥에서 별도 에뮬레이션 없이 그대로 돌아가요. 윈도우는 WSL2 환경에서 동작합니다.

💡 한 줄 정리

Docker는 프로그램과 실행 환경을 표준 상자(컨테이너)에 담아 "어디서나 똑같이" 돌게 해준다. 우리는 gvenzl/oracle-free:slim 이미지로 Oracle을 띄운다.

🙋 학생 질문 — "튜터님, 이미지랑 컨테이너가 헷갈려요. 뭐가 다른 거예요?"

붕어빵으로 비유해 볼게요. 이미지는 붕어빵 틀(설계도)이고, 컨테이너는 그 틀로 찍어낸 붕어빵(실제로 돌아가는 것)이에요.

틀(이미지) 하나로 붕어빵(컨테이너)을 여러 개 찍어낼 수 있죠. 우리는 gvenzl/oracle-free:slim이라는 틀을 한 번 내려받아서, 그걸로 Oracle 컨테이너 하나를 찍어내 띄우는 겁니다. 컨테이너를 지웠다가 다시 만들어도 틀은 그대로 남아 있어요.


Step 4: "한 장으로 띄우기 — docker compose up"

컨테이너를 띄우는 명령을 매번 길게 입력하긴 번거로워요. 그래서 어떤 컨테이너를, 어떤 설정으로 띄울지를 파일 한 장에 적어두고, 명령 한 줄로 띄웁니다. 그 파일이 docker-compose.yml이에요.

우리 프로젝트의 설정 파일을 통째로 보겠습니다.

YAML
# docker-compose.yml
services:
  oracle:
    image: gvenzl/oracle-free:slim
    container_name: instagram-oracle
    ports:
      - "1521:1521"
    environment:
      # gvenzl 이미지는 ORACLE_PASSWORD (공식 이미지의 ORACLE_PWD 와 다름 — 섞으면 첫 부팅 실패)
      ORACLE_PASSWORD: oracle
      # 앱 전용 유저를 FREEPDB1 에 자동 생성한다
      APP_USER: insta
      APP_USER_PASSWORD: insta1234
    volumes:
      # 최초 부팅 시 한 번 실행되는 초기화 스크립트 (회원·게시물 최소 시드)
      - ./sql/seed/00_init.sql:/container-entrypoint-initdb.d/00_init.sql
      - oracle-data:/opt/oracle/oradata
    healthcheck:
      test: ["CMD", "healthcheck.sh"]
      interval: 10s
      timeout: 5s
      retries: 20
      start_period: 90s

volumes:
  oracle-data:

낯선 단어가 많지만 핵심만 짚으면 됩니다.

  • image — 어떤 상자를 쓸지. 우리는 앞에서 본 gvenzl/oracle-free:slim.
  • ports"1521:1521". 1521은 Oracle이 접속을 받는 표준 문 번호(포트)예요. 이 문을 통해 우리가 접속합니다.
  • ORACLE_PASSWORD — 관리자 비밀번호. 여기선 oracle로 정했어요.
  • APP_USER / APP_USER_PASSWORD — 실습용 사용자 계정. insta / insta1234 로 자동 생성됩니다. (관리자 계정은 너무 강력해서, 평소엔 이 앱 계정으로 접속해요.)
  • volumes — 처음 켤 때 미리 준비한 회원·게시물 데이터를 자동으로 넣어줍니다.

⚠️ 함정 — 위 주석에도 적어뒀듯이, 이 이미지는 비밀번호를 ORACLE_PASSWORD로 받습니다. 인터넷의 다른 예제에서 본 ORACLE_PWD를 무심코 섞어 쓰면 첫 부팅부터 실패해요. 우리 강의는 ORACLE_PASSWORD로 통일합니다.

이제 이 파일이 있는 폴더에서 단 한 줄을 실행합니다.

Bash
docker compose up -d

-d는 "백그라운드로 띄워라"는 뜻이에요. 처음 켤 때는 상자(이미지)를 내려받고 데이터베이스를 만드느라 1~2분쯤 걸립니다. 로그를 들여다보다가 DATABASE IS READY TO USE! 라는 문장이 보이면 준비가 끝난 거예요.

Bash
docker compose logs -f

💡 한 줄 정리

docker-compose.yml에 설정을 적어두고 docker compose up -d 한 줄이면 Oracle DB가 내 컴퓨터에 뜬다. 접속 문은 1521번 포트, 실습 계정은 insta다.

🙋 학생 질문 — "튜터님, 컴퓨터를 껐다 켜면 제가 만든 데이터가 다 사라지나요?"

아니에요, 그래서 volumesoracle-data 한 줄을 둔 거예요.

컨테이너는 원래 지우면 그 안의 데이터도 함께 사라집니다. 그런데 데이터를 컨테이너 바깥의 저장 공간(볼륨)에 따로 보관해두면, 컨테이너를 껐다 켜거나 다시 만들어도 데이터가 그대로 남아요. oracle-data:/opt/oracle/oradata 가 바로 "DB 데이터를 볼륨에 보관해라"라는 뜻입니다. 완전히 초기화하고 싶을 때만 docker compose down -v 로 볼륨까지 비우면 돼요.


Step 5: "SQL 클라이언트로 문 열기"

DB 서버는 떴습니다. 그런데 그 안을 들여다보고 SQL을 입력하려면 도구가 하나 더 필요해요. 바로 SQL 클라이언트입니다.

비유하자면 DB 서버는 건물이고, SQL 클라이언트는 그 건물에 들어가 일을 보는 출입 도구예요. 건물(서버)은 1521번 문을 열어둔 채 기다리고, 우리는 클라이언트로 그 문을 통해 들어갑니다.

클라이언트는 여러 종류가 있어요.

  • DBeaver(디비버) 🌟 — 무료에 화면이 직관적이라 입문자에게 추천합니다.
  • SQL Developer — 오라클이 만든 공식 도구.
  • SQLcl — 명령줄에서 쓰는 가벼운 도구.

어떤 걸 쓰든 접속할 때 넣는 정보는 똑같습니다. 우리 환경 기준으로는 이렇게요.

텍스트
 호스트(Host)      : localhost
 포트(Port)        : 1521
 서비스명(Service) : FREEPDB1
 사용자(User)      : insta
 비밀번호(Password): insta1234

localhost는 "이 컴퓨터 자신"을 뜻해요. DB가 내 컴퓨터 안에 떠 있으니 localhost로 접속합니다. FREEPDB1은 우리가 접속할 데이터베이스의 서비스명이에요. (이 이미지가 기본으로 제공하는 이름입니다.)

⚠️ 함정 — 클라이언트 접속 창에 보면 서비스명(Service Name) 칸과 SID 칸이 따로 있는 경우가 많아요. FREEPDB1서비스명 칸에 넣어야 합니다. SID 칸에 잘못 넣으면 "그런 DB 없다"며 접속이 안 돼요. 둘이 비슷해 보여 입문자가 자주 헷갈리는 부분입니다.

정보를 맞게 넣고 연결 버튼을 누르면, 드디어 우리 데이터베이스에 들어갑니다.

💡 한 줄 정리

SQL 클라이언트(추천: DBeaver)로 localhost:1521FREEPDB1insta 계정으로 접속한다. FREEPDB1은 'SID'가 아니라 '서비스명' 칸에 넣는다.

🙋 학생 질문 — "튜터님, 그냥 docker로 띄웠으면 됐지 클라이언트는 왜 또 깔아요?"

역할이 달라서 그래요. Docker로 띄운 건 데이터를 보관하고 처리하는 DB 서버 본체예요. 사람이 직접 들여다보거나 SQL을 타이핑하기엔 불편하죠.

SQL 클라이언트는 그 서버에 접속해서 SQL을 편하게 입력하고, 결과를 표로 예쁘게 보여주는 화면이에요. 서버(요리하는 주방)와 클라이언트(주문을 넣고 음식을 받는 창구)는 따로라고 보면 됩니다. 실무에서도 DB 서버 한 대에 여러 사람이 각자의 클라이언트로 접속해서 일해요.


Step 6: "환경이 살아있다 — 첫 조회"

접속에 성공했다면, 이제 진짜 첫 조회를 해봅시다. 우리 환경에는 미리 준비해둔 회원 데이터가 자동으로 들어가 있어요. 한 줄이면 됩니다.

SQL
SELECT * FROM member;

SELECT *는 "모든 열을 조회해라", FROM member는 "member라는 곳에서"라는 뜻이에요. 실행하면 회원들이 이렇게 돌아옵니다.

member_id username nickname bio
1 jaehoon 김재훈 백엔드 공부 중
2 minji 이민지 사진과 커피
3 seungwoo 박승우 (빈칸)
4 haru 정하루 일상 기록
5 doyeon 최도연 (빈칸)
6 jisoo 강지수 여행 좋아해요
7 taeyang 윤태양 운동하는 개발자
8 narae 한나래 (빈칸)

회원 8명이 화면에 떴다면 축하합니다. 환경이 완벽하게 살아있다는 증거예요. 데이터베이스가 떠 있고, 그 안에 데이터가 들어있고, 우리가 SQL로 그걸 꺼내 보는 데 성공한 겁니다. 오늘 목표를 달성했어요.

지금은 결과를 눈으로만 즐겨도 충분해요. 그래도 살짝 미리 보자면, member처럼 데이터가 담긴 표를 테이블(table), 회원 한 명 한 명이 차지한 가로줄을 행(row), username·nickname 같은 세로 칸을 열(column)이라고 부릅니다. 자기소개(bio)를 안 쓴 회원은 빈칸으로 남아 있죠? 이 빈칸을 데이터베이스에서 뭐라고 부르고 어떻게 다루는지도 차차 배웁니다.

💡 한 줄 정리

SELECT * FROM member 로 미리 준비된 회원 8명이 조회되면 환경 구축 성공이다. 테이블·행·열이라는 이름은 다음 시간에 제대로 만난다.

🙋 학생 질문 — "튜터님, 이 회원 데이터는 제가 안 만들었는데 어디서 나온 거예요?"

Step 4의 docker-compose.yml을 다시 떠올려 보세요. volumes에 초기화 스크립트(00_init.sql) 한 줄이 있었죠?

데이터베이스를 처음 켤 때, 그 스크립트가 자동으로 실행되면서 회원 8명과 게시물 몇 개를 넣어둡니다. 여러분이 접속하자마자 조회가 되도록 미리 준비해둔 거예요. 이렇게 한 이유는, 첫날부터 "조회가 된다"는 성공 경험을 빠르게 드리기 위해서입니다. 직접 데이터를 넣고 표를 설계하는 일은 앞으로 강의를 진행하며 하나씩 해볼 거예요.


Step 7: "어디서든 접속되는 개인 DB — 클라우드"

마지막으로 세 번째 사다리, 클라우드를 짧게 안내할게요. 지금 당장 필요하진 않지만, 알아두면 쓸모가 큽니다.

Oracle Cloud Always Free는 오라클이 무료로 평생 제공하는 클라우드 데이터베이스예요. 브라우저에서 Database Actions → SQL 메뉴로 들어가면, 무설치 환경처럼 바로 SQL을 입력할 수 있습니다. 다만 이건 잠깐 빌리는 게 아니라 내 전용 DB라, 데이터가 계속 보존되고 어느 기기에서든 접속됩니다.

대신 무료인 만큼 제약이 있어요.

  • 무료 한도: DB 2개 / 저장 공간 20GB 정도.
  • 7일 동안 한 번도 안 쓰면 자동으로 정지됩니다. (다시 켜면 살아나요.)

그래서 클라우드는 이런 분께 잘 맞아요. 여러 기기(집·학원·카페)에서 같은 DB에 접속하고 싶거나, 만든 결과를 포트폴리오로 남기고 싶을 때요.

세 갈래 길을 마지막으로 한눈에 정리하면 이렇습니다.

경로 설치 데이터 보존 어디서 접속 이럴 때
① 무설치 없음 약함 브라우저 되는지 빨리 보고 싶을 때
② 로컬 Docker 🌟 처음 한 번 내 PC에 영속 내 컴퓨터 제대로 공부할 때 (메인)
③ 클라우드 없음 클라우드에 영속 어디서든 여러 기기·포트폴리오

💡 한 줄 정리

클라우드(Oracle Cloud Always Free)는 무설치이면서 데이터가 영속되는 개인 DB다. 여러 기기 접속·포트폴리오용으로 곁들이면 좋다.

🙋 학생 질문 — "튜터님, 그럼 그냥 처음부터 편한 클라우드만 쓰면 안 돼요?"

물론 클라우드만 써도 됩니다. 다만 입문 단계에서는 로컬 Docker를 권하는 이유가 있어요.

첫째, 인터넷이 끊겨도 내 컴퓨터 안의 DB는 멀쩡히 돌아갑니다. 둘째, 무료 클라우드는 한도와 미사용 정지가 있어서 한창 공부할 때 답답할 수 있어요. 셋째, 컨테이너를 직접 띄우고 지우고 다시 만들어 보는 경험 자체가 좋은 공부가 됩니다. 그래서 메인은 로컬, 클라우드는 필요할 때 더하는 식으로 가는 걸 추천해요.


마무리

첫 시간 수고 많으셨어요! 오늘은 SQL을 한 줄도 깊게 배우진 않았지만, 앞으로 모든 공부가 올라설 든든한 무대를 완성했습니다.

오늘 배운 핵심 세 가지

  • 💡 하나 — 데이터베이스는 어딘가에서 돌아가는 프로그램이고, 그걸 돌리는 길은 무설치 · 로컬 Docker · 클라우드 세 가지다. 우리의 메인은 로컬 Docker.
  • 💡 docker compose up -d 한 줄로 내 컴퓨터에 Oracle을 띄우고, SQL 클라이언트로 localhost:1521FREEPDB1insta 계정으로 접속한다.
  • 💡 SELECT * FROM member 로 회원 8명이 조회되면 환경이 살아있는 것이다. 질문(SQL)을 던지면 DB가 답(결과)을 돌려준다.

다음 시간 예고

오늘은 "데이터베이스도 프로그램"이라는 것만 가볍게 짚었죠. 다음 시간에는 한 발 더 들어갑니다. 데이터베이스와 DBMS가 정확히 무엇인지, 그리고 오늘 슬쩍 봤던 테이블 · 행(row) · 열(column)이 무슨 의미인지 제대로 짚어요. 회원을 한 명 한 명 구분해주는 기본키(primary key)라는 개념도 처음 만납니다.

그리고 오늘은 SELECT * FROM member 로 "그냥 다 보여줘"만 했지만, 다음 시간에는 "원하는 열만", "원하는 회원만" 골라 보는 진짜 의미 있는 첫 SELECT를 작성합니다. 오늘 띄워둔 이 환경 그대로 이어서 쓸 거예요. 그러니 컨테이너는 끄지 말고 두거나, 다음 시간에 docker compose up -d 로 다시 켜면 됩니다.


과제

오늘 과제는 손으로 직접 환경을 완성하고 첫 접속까지 성공시키는 거예요. SQL 실력보다 "환경이 내 손에서 돌아간다"는 경험이 목표입니다.

[기초] 내 컴퓨터에 Oracle 띄우고 첫 접속하기

이번 강의의 docker-compose.yml을 그대로 두고 docker compose up -d 로 데이터베이스를 띄워보세요. 준비가 끝나면 SQL 클라이언트(DBeaver 추천)로 FREEPDB1insta 계정으로 접속하고, SELECT * FROM member 를 실행해 회원 8명이 조회되는지 확인합니다. 화면에 8명이 떴다면 성공이에요.

[응용] 무설치 경로로도 첫 SELECT 성공시키기

Docker 말고 무설치 경로도 한 번 경험해 보세요. Oracle Live SQL에 가입한 뒤 SELECT 1 FROM dual 을 실행해 결과 1이 돌아오는지 확인합니다. 같은 SQL이라도 환경이 다르면 접속 방식이 어떻게 달라지는지 비교해 보세요.

[심화] docker-compose.yml 뜯어보고 한 군데 바꿔보기

docker-compose.ymlAPP_USERinsta가 아닌 다른 이름(예: myinsta)으로 바꾸면 어떻게 될지 예상해 보고, 실제로 바꿔서 다시 띄워본 뒤 그 계정으로 접속해 보세요. (힌트: 데이터를 새로 초기화하려면 docker compose down -v 후 다시 up 해야 합니다.) 설정 한 줄이 접속에 어떤 영향을 주는지 직접 확인하는 게 목표예요.


생각해볼 주제

1. 왜 세 가지 경로를 모두 알아둘까?

무설치 · 로컬 Docker · 클라우드. 같은 SQL을 실행하는데도 환경은 세 가지나 됩니다. 각 경로는 어떤 상황에서 빛나고, 어떤 약점을 가질까요? "딱 하나만 쓰면 되지"라는 생각의 함정은 무엇일지 고민해 보세요.

2. "설치"가 아니라 "컨테이너로 띄운다"는 것의 의미

우리는 Oracle을 직접 설치하지 않고 Docker 컨테이너로 띄웠어요. 직접 설치하는 방식과 컨테이너로 띄우는 방식은 무엇이 다를까요? "나만 안 되는" 문제가 왜 컨테이너에서는 줄어드는지, 자기 말로 설명해 보세요.

3. 데이터를 그냥 파일(엑셀·메모장)에 저장하면 안 되나?

데이터를 보관하는 거라면 엑셀이나 메모장에 적어두면 될 것 같기도 합니다. 그런데도 사람들은 굳이 무겁고 복잡한 데이터베이스(DBMS)를 씁니다. 왜 그럴까요? 회원이 수백만 명이고 여러 사람이 동시에 데이터를 고치는 인스타그램 같은 서비스를 떠올리며 생각해 보세요.

✅ 예시 답안정답 보기

과제는 SQL 실력이 아니라 "환경이 내 손에서 돌아간다"는 경험이 목표예요. 아래 답안과 똑같지 않아도, 환경을 띄우고 접속해 조회까지 성공했다면 충분합니다.

🎯 [과제 1 예시답안] 내 컴퓨터에 Oracle 띄우고 첫 접속하기

채점 포인트

항목 확인 비고
docker compose up -d 로 컨테이너가 떴는가 처음엔 1~2분 소요
준비 완료를 확인했는가 로그에 DATABASE IS READY TO USE!
접속 정보를 정확히 넣었는가 서비스명 FREEPDB1, 계정 insta
SELECT * FROM member 로 8명을 확인했는가 8명이 아니면 환경 점검

풀이 예시

설정 파일이 있는 폴더에서 데이터베이스를 띄웁니다.

Bash
docker compose up -d

1~2분 뒤 준비가 끝나면, SQL 클라이언트(DBeaver)에 아래 정보로 접속합니다.

텍스트
 호스트   : localhost
 포트     : 1521
 서비스명 : FREEPDB1
 사용자   : insta
 비밀번호 : insta1234

접속이 되면 조회 한 줄을 실행합니다.

SQL
SELECT * FROM member;

회원 8명이 돌아오면 성공입니다.

member_id username nickname bio
1 jaehoon 김재훈 백엔드 공부 중
2 minji 이민지 사진과 커피
3 seungwoo 박승우 (빈칸)
4 haru 정하루 일상 기록
5 doyeon 최도연 (빈칸)
6 jisoo 강지수 여행 좋아해요
7 taeyang 윤태양 운동하는 개발자
8 narae 한나래 (빈칸)

💡 튜터의 한마디 — 만약 접속이 안 된다면 90%는 두 가지 중 하나예요. 첫째, 데이터베이스가 아직 준비 중인데 너무 빨리 접속을 시도한 경우(1~2분 더 기다리세요). 둘째, FREEPDB1을 'SID' 칸에 잘못 넣은 경우(반드시 '서비스명' 칸). 이 두 가지만 점검하면 대부분 풀립니다.

🎯 [과제 2 예시답안] 무설치 경로로도 첫 SELECT 성공시키기

채점 포인트

항목 확인 비고
Oracle Live SQL에 가입했는가 브라우저만으로
SELECT 1 FROM dual 을 실행했는가 설치·설정 없음
결과 1이 돌아왔는가 한 줄 응답
두 환경의 접속 방식 차이를 설명했는가 무설치 vs 로컬

풀이 예시

Oracle Live SQL에 가입한 뒤, SQL 입력창에 한 줄을 실행합니다.

SQL
SELECT 1 FROM dual;

결과는 이렇게 한 줄이 돌아옵니다.

텍스트
        1
 ---------
        1

두 환경의 차이를 비교하면 이렇습니다.

구분 무설치(Live SQL) 로컬 Docker
접속 방법 브라우저 가입 후 즉시 입력창 클라이언트로 localhost:1521 접속
준비 없음 docker compose up 한 번
데이터 보존 약함 내 PC에 영속

💡 튜터의 한마디 — 같은 SELECT인데 무설치에서는 "가입하니 바로 입력창"이고, 로컬에서는 "서버를 띄우고 클라이언트로 문을 열어" 접속했죠. SQL이라는 언어는 어디서나 똑같지만, 그 언어를 실행할 무대를 차리는 방법은 환경마다 다르다는 걸 몸으로 느꼈다면 이 과제는 성공입니다.

🎯 [과제 3 예시답안] docker-compose.yml 뜯어보고 한 군데 바꿔보기

채점 포인트

항목 확인 비고
바꾸기 전에 결과를 예상했는가 접속 계정이 바뀔 것
APP_USER를 다른 이름으로 수정했는가 예: myinsta
데이터를 초기화하고 다시 띄웠는가 down -vup
새 계정으로 접속에 성공했는가 설정과 접속의 연결 이해

풀이 예시

docker-compose.yml의 사용자 이름을 바꿉니다.

YAML
    environment:
      ORACLE_PASSWORD: oracle
      APP_USER: myinsta          # insta → myinsta 로 변경
      APP_USER_PASSWORD: insta1234

APP_USER는 처음 데이터베이스를 만들 때 한 번 생성됩니다. 그래서 이미 떠 있는 상태에서 이름만 바꾸면 적용되지 않아요. 데이터를 초기화하고 새로 띄워야 합니다.

Bash
docker compose down -v
docker compose up -d

준비가 끝나면, 이번엔 바뀐 계정으로 접속합니다.

텍스트
 사용자   : myinsta
 비밀번호 : insta1234
SQL
SELECT * FROM member;

새 계정으로도 회원 8명이 그대로 조회됩니다. (초기화 스크립트가 새 계정 아래에 데이터를 다시 넣어주기 때문이에요.)

💡 튜터의 한마디down -v 없이 이름만 바꿔서는 새 계정이 안 생긴다는 점, 직접 부딪혀 보셨나요? 데이터베이스 계정·초기 데이터는 "최초 생성 시점"에 만들어집니다. 이 감각은 나중에 데이터를 직접 설계하고 초기화할 때 아주 요긴해요. 설정 파일 한 줄이 접속과 데이터에 어떻게 이어지는지 본 게 이 과제의 핵심입니다.


🤔 [생각해볼 주제 1] 왜 세 가지 경로를 모두 알아둘까?

문제 상황 요약

같은 SQL을 실행하는데도 환경은 무설치 · 로컬 Docker · 클라우드 세 가지나 됩니다. "딱 하나만 쓰면 되지"라는 생각의 함정은 무엇일까요?

튜터의 가이드 및 해설

세 경로는 각자 다른 상황에서 빛납니다. 핵심은 트레이드오프예요.

  • 무설치는 시작이 0초라는 게 최대 강점입니다. 대신 데이터가 오래 보존된다는 보장이 약하고, 여러 명이 동시에 붙으면 불안정해요. "되는지 빨리 보고 싶다", "잠깐 한 줄만 돌려보겠다"에 맞습니다.
  • 로컬 Docker는 인터넷 없이도 내 컴퓨터에서 온전히 돌고, 데이터를 직접 넣고 빼며 제약을 체득할 수 있어요. 대신 처음 한 번 띄우는 수고가 듭니다. 제대로 공부할 때의 정답입니다.
  • 클라우드는 어디서든 접속되고 데이터가 영속됩니다. 대신 무료 한도와 미사용 정지가 있죠. 여러 기기에서 쓰거나 포트폴리오로 남길 때 좋습니다.

"하나만 쓰면 되지"의 함정은, 막상 상황이 바뀌었을 때(인터넷이 끊기거나, 협업이 필요하거나, 빠른 확인만 필요할 때) 가진 도구가 안 맞아 멈칫하게 된다는 거예요. 도구마다 강점이 다르다는 걸 알면, 그때그때 맞는 걸 골라 쓸 수 있습니다.

🎯 SQLD는 이렇게 나온다

실습 환경을 어디서 띄우는지 자체는 SQLD 시험 범위가 아닙니다. 다만 이 과정에서 잡은 감각, "데이터베이스는 서버에서 돌아가는 프로그램이고 우리는 그것에 접속한다"는 그림은 1과목 데이터베이스 개요의 토대가 됩니다. DB 서버와 사용자(클라이언트)가 분리돼 있다는 구조를 떠올릴 수 있으면 충분해요.

💡 실무에선

실무에서도 환경을 상황별로 분리해 씁니다. 빠른 확인은 가벼운 도구로, 개발은 내 로컬 DB에서, 협업·배포 전 검증은 공용 서버나 클라우드에서요. "이 작업은 어느 환경에서 해야 안전한가"를 판단하는 것 자체가 개발자의 기본기입니다.

🤔 [생각해볼 주제 2] "설치"가 아니라 "컨테이너로 띄운다"는 것의 의미

문제 상황 요약

우리는 Oracle을 직접 설치하지 않고 Docker 컨테이너로 띄웠습니다. 직접 설치와 컨테이너로 띄우는 것은 무엇이 다르고, 왜 "나만 안 되는" 문제가 컨테이너에서 줄어들까요?

튜터의 가이드 및 해설

직접 설치는 내 운영체제 위에 프로그램을 직접 얹는 방식이에요. 그래서 윈도우·맥·리눅스마다 설치법이 다르고, 내 컴퓨터에 이미 깔린 다른 프로그램과 충돌하기도 합니다. "분명 똑같이 했는데 나만 에러"가 여기서 나옵니다.

컨테이너는 다릅니다. 프로그램과 그것이 돌아가는 데 필요한 환경(설정·라이브러리 등)을 통째로 한 상자에 담아둔 것이라, 내 PC의 사정과 거의 무관하게 똑같이 동작해요. 항구의 표준 화물 컨테이너가 내용물과 상관없이 어느 배에나 실리는 것과 같습니다.

그래서 "나만 안 되는" 문제가 줄어듭니다. 모두가 같은 상자(이미지)를 받아 띄우니, 강사의 화면과 학생의 화면이 같은 환경이 되는 거죠. 강의에서 환경 트러블이 줄어드는 큰 이유가 이것입니다.

🎯 SQLD는 이렇게 나온다

컨테이너 기술 자체는 SQLD 출제 범위가 아닙니다. 시험에는 SQL 작성과 데이터 모델링이 나오지, 환경 구축은 나오지 않아요. 그러니 이 주제는 "공부를 매끄럽게 하기 위한 토대"로 받아들이면 됩니다. 시험 부담 없이 환경을 잡는 도구로 이해해 두세요.

💡 실무에선

컨테이너는 현대 개발의 표준에 가깝습니다. 개발자가 만든 환경을 그대로 다른 사람이나 서버에 옮길 수 있어서, "내 컴퓨터에선 됐는데요"라는 고질적인 문제를 크게 줄여줍니다. 데이터베이스뿐 아니라 거의 모든 프로그램을 이렇게 띄우는 흐름이라, 지금 한 경험이 그대로 이어집니다.

🤔 [생각해볼 주제 3] 데이터를 그냥 파일(엑셀·메모장)에 저장하면 안 되나?

문제 상황 요약

데이터를 보관하는 거라면 엑셀이나 메모장에 적어두면 될 것 같습니다. 그런데도 사람들은 굳이 무겁고 복잡한 데이터베이스(DBMS)를 씁니다. 왜일까요?

튜터의 가이드 및 해설

회원이 몇 명 안 되고 나 혼자만 본다면 엑셀로도 충분합니다. 문제는 인스타그램처럼 데이터가 거대하고, 여러 사람이 동시에 고치는 상황이에요. 여기서 엑셀·메모장은 무너집니다.

  • 동시 사용 — 수백만 명이 동시에 좋아요를 누르는데, 엑셀 파일 하나를 여럿이 함께 고치면 서로 덮어써서 데이터가 깨집니다. DBMS는 여러 사람이 동시에 다뤄도 안전하게 처리합니다.
  • 빠른 검색 — 수백만 줄에서 특정 회원을 찾을 때, 엑셀은 처음부터 훑지만 DBMS는 색인을 써서 순식간에 찾아냅니다.
  • 무결성 — "회원이 없는데 그 회원의 게시물만 남는" 같은 모순을 DBMS는 규칙으로 막아줍니다.
  • 안정성 — 작업 도중 문제가 생겨도 데이터가 어중간하게 망가지지 않도록 지켜줍니다.

즉 DBMS는 "많은 데이터를, 여러 사람이, 안전하고 빠르게" 다루기 위한 전문 도구예요. 우리가 Oracle을 쓰는 이유도 여기에 있습니다.

🎯 SQLD는 이렇게 나온다

이건 SQLD와 직접 맞닿은 주제예요. 1과목에서 데이터베이스와 DBMS가 무엇인지, 왜 파일 방식 대신 DBMS를 쓰는지를 묻는 문제가 나옵니다. 특히 동시 접근 제어, 데이터 무결성, 데이터 독립성 같은 키워드는 "DBMS의 장점"으로 자주 등장하니, 오늘 떠올린 이유들을 단어로 정리해 두면 좋습니다.

💡 실무에선

실무에서는 작은 설정값이나 임시 메모는 여전히 파일로 두기도 합니다. 하지만 서비스의 핵심 데이터(회원·주문·게시물 등)는 반드시 데이터베이스에 둡니다. "이 데이터가 동시에 수정되는가, 정확성이 중요한가, 양이 큰가"를 따져 파일과 DB 중 어디에 둘지 판단하는 게 실무 감각입니다.

전체 목록 데이터베이스