3-3 연습 문제 — 이 값에는
어떤 그릇이 맞을까
이번 강의에서 배운 것 — INT · DECIMAL · VARCHAR · CHAR · DATE · BOOLEAN, 그리고 겉모양이 아니라 용도로 고른다는 기준. 오늘은 타입을 직접 골라보고, 잘못 고르면 실제로 무슨 일이 벌어지는지 눈으로 확인합니다.
섹션 3 에서의 위치
완료 ✓
강의 완료 ✓
지금 여기
기본키 · 외래키 · 테이블 만들기
타입 문제는 “정답이 하나” 가 아닌 경우가 많습니다. 그래서 AI에게 물을 때 본인이 고른 타입과 이유를 먼저 말하고 검증받으세요 — “우편번호를 VARCHAR로 고르고 앞의 0 때문이라고 판단했는데, 이 근거가 맞아?” 처럼요.
문제 1. 왜 이 타입일까요
우리 실제 shop 스키마의 컬럼 네 개입니다. 각각 왜 이 타입을 골랐는지 설명해보세요.
| 컬럼 | 타입 | 값 예시 |
|---|---|---|
| price | INT | 89000 |
| product_name | VARCHAR(100) | 무선 이어폰 |
| gender | CHAR(1) | M |
| joined_at | DATE | 2025-01-15 |
정답 보기
price INT — 계산하고 비교할 값이라서
원 단위 정수만 저장하면 되고, 합계를 내거나 “3만 원 이상” 처럼 크기를 비교해야 합니다. 소수점이 필요 없으니 DECIMAL까지 갈 이유도 없어요.
product_name VARCHAR(100) — 길이가 제각각이라서
니트는 두 글자, 프리미엄 그래놀라는 훨씬 길죠. 길이가 달라지는 글자는 VARCHAR입니다. 괄호 안의 100은 허용할 최대 글자 수예요.
gender CHAR(1) — 항상 한 글자라서
M 아니면 F, 언제나 딱 한 글자입니다. 길이가 고정된 값이라 CHAR(1)이 맞습니다.
joined_at DATE — 날짜로 다뤄야 해서
날짜 타입으로 저장하면 없는 날짜를 막을 수 있고, 순서 비교나 “가입한 지 며칠 됐나” 같은 기간 계산도 가능합니다. 글자로 저장하면 이 세 가지를 전부 잃어요.
문제 2. 새 컬럼의 타입을 고르세요
쇼핑몰에 기능을 추가하면서 컬럼 네 개가 필요해졌습니다. 각각 어떤 타입이 맞을지 고르고 이유를 붙이세요.
| # | 담아야 할 값 | 값 예시 |
|---|---|---|
| ① | 회원의 우편번호 | 06234 |
| ② | 주문이 접수된 시각 (분·초까지) | 2025-02-01 14:32:07 |
| ③ | 상품 리뷰 평점 (소수점 한 자리) | 4.5 |
| ④ | 회원이 마케팅 수신에 동의했는지 | 동의 / 미동의 |
네 가지 질문을 순서대로 던져보세요 — 계산하는가? 모양을 지켜야 하는가? 날짜 계산이 필요한가? 답이 둘뿐인가?
정답 보기
| # | 값 | 타입 | 이유 |
|---|---|---|---|
| ① | 우편번호 | VARCHAR | 앞의 0 을 지켜야 합니다 — 계산할 값이 아닙니다 |
| ② | 주문 시각 | DATETIME | 날짜만으로는 부족하고 시·분·초까지 필요합니다 |
| ③ | 평점 | DECIMAL | 소수점 아래를 정확히 저장해야 합니다 — INT 는 4.5 를 못 담음 |
| ④ | 수신 동의 | BOOLEAN | 답이 참 / 거짓 두 가지뿐입니다 |
①이 오늘의 함정입니다. 06234는 숫자처럼 보이지만 숫자 타입에 넣으면 맨 앞 0이 사라져 6234가 됩니다. 전화번호와 똑같은 이유예요 — 계산하지 않는 번호는 숫자가 아니라 문자열일 수 있습니다.
③도 자주 틀립니다. 평점을 INT로 두면 4.5가 저장될 때 소수점이 잘려 4가 됩니다. 소수점 아래까지 정확히 다뤄야 하면 DECIMAL이에요.
문제 3 (도전). 가격을 문자열로 담으면 무슨 일이 생길까
어떤 개발자가 price를 INT가 아니라 VARCHAR로 만들었습니다. 상품 네 개가 들어 있어요.
| product_name | price (VARCHAR) |
|---|---|
| USB-C 케이블 | '8000' |
| 다크 초콜릿 | '9000' |
| 무선 이어폰 | '89000' |
| 패딩 점퍼 | '129000' |
이 상태에서 가격이 싼 순서대로 정렬하면 어떤 순서로 나올까요? 직접 순서를 적어본 뒤 정답을 확인하세요.
문자열은 글자를 앞에서부터 한 자씩 비교합니다. 숫자의 크기가 아니라 —
사전에서 단어를 찾는 방식이에요. 첫 글자 1 · 8 · 9 를 먼저 비교하면 어떤
순서가 될까요?
정답 보기
| 순위 | INT 로 저장했다면 ✓ | VARCHAR 로 저장하면 ❌ |
|---|---|---|
| 1위 | 8,000 — USB-C 케이블 | '129000' — 패딩 점퍼 |
| 2위 | 9,000 — 다크 초콜릿 | '8000' — USB-C 케이블 |
| 3위 | 89,000 — 무선 이어폰 | '89000' — 무선 이어폰 |
| 4위 | 129,000 — 패딩 점퍼 | '9000' — 다크 초콜릿 |
왜 이렇게 될까요? 문자열은 앞에서부터 한 글자씩 비교합니다.
- 첫 글자만 보면
'1'<'8'<'9'→ 그래서'129000'이 맨 앞으로 갑니다 '8000'과'89000'은 첫 글자가 같으니 둘째 글자로 비교 →'0'<'9'→'8000'이 먼저- 마지막이
'9000'
129000이 8000보다 작아서가 아니라 — 글자 1이 글자 8보다 앞서기 때문입니다. 여기서 오류 메시지는 뜨지 않습니다. 그냥 조용히 틀린 순서가 나올 뿐이에요.
타입을 잘못 고르면 에러가 아니라 “그럴듯하게 틀린 결과”가 나옵니다. AI가 만들어준 SQL이 잘 도는 것처럼 보여도 결과가 이상하다면 — 컬럼 타입부터 확인해 보세요.
다 풀었다면
새 컬럼을 만들 때 “이 값이 어떻게 생겼지?” 가 아니라 “이 값으로 무엇을 할 거지?” 를 먼저 묻게 됐다면 오늘 목표는 달성입니다.
DBeaver 좌측 트리에서 shop → Tables → products 를 더블클릭하고 Columns
탭을 열면 price INT, product_name VARCHAR(100) 처럼 실제 타입이 그대로
보입니다. 오늘 배운 기준으로 컬럼을 하나씩 읽어보세요 — 이 값으로 무엇을 할까?
이제 컬럼의 이름과 규칙, 타입까지 읽을 수 있게 됐습니다. 다음은 각 행을 정확히 구분하는 기본키(PK) 입니다.