바이브 코딩 시대의 데이터베이스3-2 연습 문제
테크타니 LEARN — 섹션 03 · 연습 문제

3-2 연습 문제 — 컬럼 한 줄에서
약속을 읽어냅니다

이번 강의에서 배운 것 — 컬럼 이름, 한 컬럼 한 가지 의미, 그리고 NULL · NOT NULL · DEFAULT. 오늘도 SQL은 쓰지 않습니다. 대신 컬럼을 직접 진단하고, 값이 비었을 때 무슨 일이 일어나는지 판단해 보세요.

문제3문제 (도전 1 포함)권장 소요12분사용 테이블members · products준비물없음 — 스키마만 읽으면 OK

섹션 3 에서의 위치

3-1 테이블 · 행 · 열 · 값

완료 ✓

3-2 컬럼의 약속

강의 완료 ✓

3-2 연습 문제

지금 여기

3-3 데이터 타입

값에 맞는 그릇

AI 과외 선생님 활용법

2-4에서 만든 AI 과외 선생님 세션을 그대로 쓰세요. 막힐 때 정답부터 묻지 말고 — “이 컬럼에 NULL을 허용해야 할지 판단이 안 서. 판단 기준만 힌트로 알려줘” 처럼 기준을 물어보세요. 다 푼 뒤에는 본인의 근거를 적어서 검증받는 게 가장 남습니다.

문제 1. 이 컬럼 설계, 어디가 잘못됐나요

어떤 개발자가 회원 정보를 담는 테이블을 이렇게 만들었습니다.

❌ 진단이 필요한 테이블
컬럼값 예시
data1김철수
data235/M
date2025-01-15
세 컬럼 모두 3-2에서 배운 약속을 어기고 있습니다

세 컬럼을 각각 진단하고, 어떻게 고쳐야 하는지 우리 실제 members 스키마를 참고해 답해보세요.

정답 보기

data1member_name — 이름이 표지판 역할을 못 합니다

값은 들어 있어도 그 값이 무엇을 뜻하는지 매번 설명서를 찾아야 합니다. 사람에게도 불편하지만, AI에게 스키마를 주고 SQL을 요청할 때 컬럼의 뜻을 잘못 추측하게 만든다는 게 더 큰 문제예요.

data2age + gender 두 개로 분리 — 한 칸에 두 가지 의미가 들어 있습니다

35/M은 사람 눈에는 읽히지만, 데이터베이스가 나이만 필요할 때는 매번 값을 둘로 잘라야 합니다. 나이가 30 이상인 회원을 찾거나 나이만 수정하기도 불편해지고요. 판단 기준은 이것이었죠 — 따로 찾고, 비교하고, 바꿔야 하는 값이라면 각각의 컬럼으로.

datejoined_at — 이름이 너무 넓습니다

가입한 날짜인지 주문한 날짜인지 알 수 없습니다. 그래서 우리 스키마는 가입일을 joined_at, 주문일을 ordered_at으로 구분해 두었습니다.

문제 2. NULL 을 써야 할까요, 다른 값을 써야 할까요

아래 네 상황에서 그 칸에 무엇이 들어가야 할지 고르고, 이유를 설명해보세요. 보기는 NULL, 숫자 0, 빈 문자열 '', 글자 '없음' 입니다.

이 칸에는 무엇이 들어가야 할까?
#상황
회원이 가입할 때 별명을 아직 정하지 않았다
어떤 상품의 재고가 정말로 하나도 남지 않았다
설문에서 응답자가 나이 항목에 답하지 않았다
회원이 "별명 없이 쓰겠다"고 명시적으로 선택했다
힌트

매번 이렇게 물어보세요 — “이건 기록된 값이 없는 걸까, 아니면 값이 기록됐는데 그 값이 0 · 빈 문자열 · 없음인 걸까?”

정답 보기
#상황이유
별명 미정NULL아직 기록된 값이 없는 상태입니다
재고가 진짜 0개숫자 0기록된 값이 있습니다 — 세어봤더니 0개인 것
나이 무응답NULL몰라서 기록하지 못한 것 — 나이가 0살인 게 아닙니다
별명 없이 쓰겠다 선택'' 또는 '없음'본인이 답을 했습니다 — “별명을 두지 않겠다” 는 기록된 값

②와 ③이 핵심 대비입니다. 재고 0세어본 결과가 0이고, 나이 무응답은 세어보지도 못한 상태예요. 둘을 똑같이 0으로 저장하면 나중에 “나이 0살인 회원이 왜 이렇게 많지?” 같은 잘못된 결론이 나옵니다.

①과 ④의 차이도 짚어두세요. 강의에서 나왔던 문장 그대로 — 별명이 없는 것별명이 정말로 없음인 사람은 다릅니다. 값이 없다는 상태를 다른 값으로 억지로 대신하지 않는 게 NULL의 존재 이유입니다.

참고

nickname 과 재고 컬럼은 실제 shop 스키마에 없습니다. 개념 설명을 위한 가상의 컬럼이에요.

문제 3 (도전). 이 행은 저장될까요?

가상의 상품 테이블이 아래처럼 설계돼 있다고 해봅시다.

가상 예시 — products_v2 스키마
컬럼규칙DEFAULT
product_nameNOT NULL없음
priceNOT NULL없음
statusNULL 허용'판매중'

새 상품을 저장하려는 시도가 네 번 있었습니다. 각각 저장에 성공하는지, 성공한다면 status 에 무엇이 저장되는지 답하세요.

네 번의 저장 시도
#넣은 값
product_name='무선 마우스', price=32000 (status 생략)
product_name='키보드', price=75000, status='품절'
product_name='보조배터리' (price · status 둘 다 생략)
product_name='다크 초콜릿', price=9000, status=NULL 명시
정답 보기
#결과status 에 저장되는 값이유
저장 성공판매중생략했으므로 미리 정해둔 기본값이 들어갑니다
저장 성공품절명시했으므로 기본값은 쓰이지 않습니다
저장 실패priceNOT NULL 인데 비었습니다 — 약속 위반
저장 성공NULLstatusNULL 을 허용합니다 — 생략이 아니라 명시예요

③이 DEFAULTNOT NULL 의 관계를 보여줍니다. price 에는 DEFAULT 가 없으므로 생략하면 채워줄 값이 없고, NOT NULL 이므로 비운 채로 저장할 수도 없습니다. 그래서 데이터베이스가 저장을 거부해요.

④가 가장 헷갈립니다. 값을 생략하는 것과 NULL명시하는 것은 다릅니다. 생략해야 기본값이 들어가고, NULL 을 직접 넣으면 “기록된 값이 없음” 이라는 그 상태가 그대로 저장됩니다.

여기서 얻어갈 감각

DEFAULT 는 데이터베이스가 상황을 보고 추측하는 값이 아닙니다. 테이블을 설계할 때 미리 정해놓은 값이고, 생략했을 때만 동작합니다.

다 풀었다면

✓ 3-2 훈련 완료 기준

컬럼 한 줄을 볼 때 이름만 읽지 않고 — “무엇을 뜻하는가 · 비워도 되는가 · 기본값이 있는가” 세 가지를 자동으로 확인하게 됐다면 오늘 목표는 달성입니다.

여유가 있다면 — DBeaver 로 직접 확인

DBeaver 좌측 트리에서 shop → Tables → members 를 더블클릭한 뒤 Columns 탭을 열어보세요. 각 컬럼의 타입과 Not Null 체크 표시를 눈으로 확인할 수 있습니다. productsorders 도 같은 방식으로 읽어보세요.

값이 있기만 하면 약속을 지킨 걸까요? 가격을 글자로 저장하거나 전화번호를 숫자로 저장하면 어떤 문제가 생길까요? 다음 강의에서는 값에 맞는 그릇 고르기를 다룹니다.

NEXT LESSON3-3 데이터 타입 — 값에 맞는 그릇 고르기

INT · DECIMAL · VARCHAR · CHAR · DATE · BOOLEAN — 겉모양이 아니라 무엇을 할 것인지로 고릅니다.

GO ▸ 3-3 시작하기