실습 환경 만들기
LocalDB 와 SSMS 를 갖추고 실습 데이터베이스를 만듭니다. 이후 모든 단원이 이 자료를 사용합니다.
무엇을 갖추어야 하나
둘이면 됩니다. 둘 다 무료이고 윈도에서 바로 설치됩니다.
- SQL Server LocalDB — 데이터베이스 그 자체입니다. 서비스로 늘 떠 있지 않고 연결할 때 켜졌다가 사용하지 않으면 꺼지므로, 개발 장비에 두기에 가볍습니다.
- SSMS(SQL Server Management Studio) — 문장을 적어 보내고 결과를 보는 도구입니다. 데이터베이스가 아니라 그것에 말을 거는 창구입니다.
맥이나 리눅스를 사용한다면 LocalDB 와 SSMS 가 없습니다. 대신 도커로 SQL Server 를 띄우고 Azure Data Studio 로 연결하면 이 트랙의 예제가 모두 동작합니다.
LocalDB 설치와 확인
LocalDB 는 SQL Server Express 를 내려받는 자리에서 함께 받습니다. 다만 Express 서버를 설치할 필요는 없습니다. 설치 관리자를 실행하면 설치 유형을 묻는데, 여기서 Download Media(미디어 다운로드)를 선택하고 패키지 목록에서 LocalDB 를 선택하면 SqlLocalDB.msi 하나만 내려받습니다. 그 파일을 실행하면 끝입니다.
Basic(기본)이나 Custom(사용자 지정)을 선택하면 Express 서버가 통째로 설치됩니다. 그렇게 해도 LocalDB 는 함께 들어오지만, 늘 떠 있는 서비스가 하나 늘어납니다. 배우는 동안에는 필요하지 않습니다.
Visual Studio 를 설치할 때 데이터 저장 및 처리 워크로드를 함께 선택했다면 이미 깔려 있습니다. 내려받기 전에 아래 명령으로 확인해 보십시오. 인스턴스 이름이 나오면 설치된 것입니다.
sqllocaldb info
이 단원의 명령은 브라우저가 아니라 여러분의 터미널에서 돌립니다.
이름을 붙여 다시 물으면 버전과 상태가 나옵니다. State 가 Stopped 여도 괜찮습니다. 연결하면 저절로 켜집니다.
sqllocaldb info MSSQLLocalDB
sqllocaldb info MSSQLLocalDB
Version 이 15.0 이상이어야 이 트랙의 예제가 모두 동작합니다(15.0 이 SQL Server 2019 입니다). 명령을 찾을 수 없다고 나오면 설치가 끝나지 않았거나 터미널을 새로 열어야 하는 경우입니다.
SSMS 로 연결하기
SSMS 를 설치해 실행하면 연결 창이 먼저 뜹니다. 서버 이름에 아래 값을 그대로 적고 인증은 Windows 인증 을 선택합니다. 아이디와 비밀번호는 필요 없습니다.
(localdb)\MSSQLLocalDB
연결되면 왼쪽에 개체 탐색기가 나타납니다. 위쪽 새 쿼리 를 누르면 문장을 적는 창이 열리고, F5 로 실행합니다. 제대로 붙었는지는 아래 문장으로 확인합니다.
SELECT SERVERPROPERTY('ProductVersion') AS ver, SERVERPROPERTY('Edition') AS edition;
| ver | edition |
|---|---|
| 17.0.4025.3 | Express Edition (64-bit) |
버전 숫자는 설치한 판에 따라 다릅니다. 위 결과는 SQL Server 2025 이고, 15.0 이상이면 그대로 따라올 수 있습니다.
실습 데이터베이스 만들기
이 트랙의 모든 예제는 같은 데이터 위에서 돌아갑니다. 단원마다 테이블을 새로 만들면 매번 준비하느라 정작 배울 것에 닿지 못합니다.
아래 스크립트를 열어 전체를 복사한 뒤 SSMS 의 새 쿼리 창에 붙여 넣고 F5 로 실행하십시오. 한 번이면 끝납니다.
lab-setup.sql 실습 데이터베이스를 만드는 스크립트입니다. 새 창에서 열립니다. 열기실행하면 MssqlLab 데이터베이스가 만들어지고 테이블 여섯 개와 자료가 함께 채워집니다. 마지막에 아래 결과가 나오면 제대로 된 것입니다.
| 테이블 | 행 수 |
|---|---|
| Member.USERS | 20 |
| Board.BOARDS | 3 |
| Board.CATEGORIES | 10 |
| Board.POSTS | 507 |
| Board.COMMENTS | 1013 |
| Board.FILES | 100 |
행 수가 위와 다르면 안 됩니다. 이 스크립트는 난수나 현재 시각을 사용하지 않고 고정된 기준일과 번호 계산만으로 자료를 만듭니다. 누가 언제 돌려도 같은 자료가 나와야 이후 단원에 적힌 결과와 여러분의 화면이 맞아떨어집니다.
예제를 돌리다 자료를 지우거나 고쳐 헝클어졌다면 같은 스크립트를 다시 실행하십시오. 맨 앞에서 데이터베이스를 지우고 다시 만들므로 언제든 처음 상태로 돌아갑니다.
만들어진 것 살펴보기
개체 탐색기에서 MssqlLab 을 펼치면 테이블 여섯 개가 보입니다. 문장으로도 볼 수 있습니다.
USE MssqlLab; SELECT num, code, name, use_category, use_reply FROM Board.BOARDS ORDER BY num;
| num | code | name | use_category | use_reply |
|---|---|---|---|---|
| 1 | notice | 공지사항 | 0 | 0 |
| 2 | free | 자유게시판 | 1 | 1 |
| 3 | qna | 질문답변 | 1 | 1 |
첫 줄의 USE MssqlLab 은 어느 데이터베이스를 볼지
정하는 문장입니다. 이것을 빠뜨리면 지금 연결된 다른 데이터베이스에서 테이블을
찾다가 없다는 오류가 납니다. 이후 단원의 예제는 이 줄을 매번 적지 않으므로,
쿼리 창 위쪽의 데이터베이스 선택 상자를 MssqlLab 로
맞춰 두는 편이 편합니다.
글 테이블이 답글을 담는 방법
여섯 테이블 가운데 Board.POSTS 만 구조가 조금 특별합니다.
게시판에는 글에 답글이 달리고 그 답글에 다시 답글이 달립니다. 그런데 테이블은 행과 열
둘로만 이루어져 있어 계층을 그대로 담을 수 없습니다. 그래서 열 넷으로 나눠 담습니다.
CREATE TABLE Board.POSTS ( -- ... parent_num INT NULL, -- 부모 글. 원글이면 NULL group_num INT NOT NULL, -- 원글의 번호. 한 덩어리를 묶습니다 depth SMALLINT NOT NULL, -- 답글 깊이(원글 0) sort_no INT NOT NULL, -- 덩어리 안에서의 차례 -- ... );
parent_num 하나만 있어도 관계는 표현됩니다. 나머지 셋은
목록 화면을 위한 것입니다 — 글 수백 건을 정렬해 페이지로 끊어 낼 때마다 부모를 따라
거슬러 올라가면 느려지므로, 덩어리와 차례를 열로 들고 있다가 그대로 정렬합니다.
실습 데이터에서 답글이 세 단으로 달린 덩어리를 하나 보면 이렇습니다.
SELECT num, parent_num, group_num, depth, sort_no, title FROM Board.POSTS WHERE group_num = 6 ORDER BY sort_no;
| num | parent_num | group_num | depth | sort_no | title |
|---|---|---|---|---|---|
| 6 | NULL | 6 | 0 | 0 | 저장 프로시저 질문드립니다 |
| 352 | 6 | 6 | 1 | 1 | [답글] 저장 프로시저 질문드립니다 |
| 456 | 352 | 6 | 2 | 2 | [답글] [답글] 저장 프로시저 질문드립니다 |
셋 모두 group_num 이 6 으로 같고,
sort_no 순으로 늘어놓으면 답글이 부모 바로 아래 옵니다.
이 구조를 계층으로 파고들며 조회하는 방법은 2.5 에서, 다른 방식과 비교하는 것은
3.9 에서 다룹니다.
직접 해보기
회원 테이블에 몇 명이 들어 있는지 확인해 보세요. 20 이 나와야 합니다.
회원 한 명을 지운 뒤 스크립트를 다시 실행해 20 명으로 돌아오는지 확인해 보세요. 앞으로 자료가 헝클어질 때마다 이 방법으로 되돌리면 됩니다.
- LocalDB 와 SSMS 둘이면 됩니다. 서버 이름은 (localdb)\MSSQLLocalDB 입니다.
- 버전이 15.0 이상(SQL Server 2019)이어야 이 트랙의 예제가 모두 동작합니다.
- lab-setup.sql 을 한 번 실행하면 테이블 여섯 개와 자료가 함께 만들어집니다.
- 행 수는 20 · 3 · 10 · 507 · 1013 · 100 으로 늘 같습니다. 다르면 스크립트를 다시 실행하십시오.
- 자료가 헝클어지면 같은 스크립트를 다시 실행해 처음으로 되돌립니다.