[Beyond SW] 20250929

이경민·2025λ…„ 9μ›” 29일

ν•œν™”μ‹œμŠ€ν…œ Beyond SW

λͺ©λ‘ 보기
11/40

Transaction

πŸ’‘ TRANSACTION은 데이터 λ² μ΄μŠ€μ—μ„œ ν•œ λ²ˆμ— μˆ˜ν–‰λ˜λŠ” μž‘μ—…μ˜ λ‹¨μœ„μ΄λ‹€.
μ‹œμž‘, μ§„ν–‰, μ’…λ£Œ 단계λ₯Ό κ°€μ§€λ©° λ§Œμ•½ 쀑간에 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ λ‘€λ°±(μ‹œμž‘ 이전 λ‹¨κ³„λ‘œ λ˜λŒλ¦¬λŠ” μž‘μ—…)을 μˆ˜ν–‰ν•˜κ³  데이터 λ² μ΄μŠ€μ— μ œλŒ€λ‘œ λ°˜μ˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” 컀밋(이후 둀백이 λ˜μ§€ μ•ŠμŒ)을 μ§„ν–‰ν•œλ‹€.
MySQL은 기본적으둜 μžλ™ 컀밋 섀정이 λ˜μ–΄ μžˆμ–΄(둀백이 μ•ˆλ¨). 둀백을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” μžλ™ 컀밋 섀정을 ν•΄μ œν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.

DML(INSERT, UPDATE, DELETE, REPLACE) μ‹€ν–‰ ν›„ DATABASE에 변경사항을 μ•Œλ €μ•Όν•¨
-> COMMIT

데이터 ν˜•μ‹μœΌλ‘œλŠ” 숫자,문자,λ‚ μ§œ,μ‹œκ°„ 이 μžˆλ‹€.

숫자 데이터 ν˜•μ‹

  • μ •μˆ˜ λ˜λŠ” μ‹€μˆ˜ λ“±μ˜ 숫자λ₯Ό ν‘œν˜„ν•œλ‹€.
  • FLOATμ΄λ‚˜ DOUBLEν˜•μ€ 큰 λ²”μœ„μ˜ 숫자λ₯Ό μ €μž₯ν•  수 μžˆμ§€λ§Œ μ •ν™•ν•˜μ§€ μ•Šμ€ κ·Όμ‚¬μΉ˜λ₯Ό μ €μž₯ν•œλ‹€. λ”°λΌμ„œ μ‹€μˆ˜ ν˜•μ„ μ €μž₯ν•˜κ³  싢어도 DECIMAL을 μ‚¬μš©ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€.
데이터 ν˜•μ‹λ°”μ΄νŠΈ 수숫자 λ²”μœ„μ„€λͺ…
BIT(N)N/B1~64Bit ν‘œν˜„, b'0000'ν˜•μ‹μœΌλ‘œ ν‘œν˜„
TINYINT1-128 ~ 127μ •μˆ˜
SMALLINT2-32,768 ~ 32,767μ •μˆ˜
MEDIUMINT3-8,388,608 ~ 8,388,607μ •μˆ˜
INT INTEGER4μ•½-21μ–΅ ~ +21μ–΅μ •μˆ˜
BIGINT8μ•½ -900κ²½ ~ +900κ²½μ •μˆ˜
FLOAT43.40E+38 ~ -1.17E-38μ†Œμˆ˜μ  μ•„λž˜ 7μžλ¦¬κΉŒμ§€ ν‘œν˜„
DOUBLE8-1.22E-308 ~ 1.79E+308μ†Œμˆ˜μ  μ•„λž˜ 15μžλ¦¬κΉŒμ§€ ν‘œν˜„
DECIMAL(m,[d]) NUMBER(m,[d])5~17-10^38+1 ~ 10^38-1전체 자릿수(m)와 μ†Œμˆ˜μ  μ΄ν•˜ 자릿수(d)λ₯Ό 가짐

문자 데이터 ν˜•μ‹

  • CHARλŠ” 고정길이 λ¬Έμžν˜•μœΌλ‘œ μžλ¦Ώμˆ˜κ°€ λΆˆλ³€μ΄λ‹€.
  • VARCHARλŠ” 가변길이 λ¬Έμžν˜•μœΌλ‘œ μžλ¦Ώμˆ˜κ°€ 가변이닀.
    (큰 자릿수λ₯Ό 섀정해도 μ €μž₯ν•  곡간을 효율적으둜 μ‚¬μš©ν•  수 μžˆλ‹€.)
  • CHAR ν˜•μ‹μœΌλ‘œ μ„€μ •ν•˜λŠ” 것이 INSERT/UPDATE μ‹œμ— 일반적으둜 더 쒋은 μ„±λŠ₯을 λ°œνœ˜ν•œλ‹€.
  • λŒ€μš©λŸ‰ λ°μ΄ν„°λŠ” TEXTκ³„μ—΄μ˜ 데이터 ν˜•μ‹μœΌλ‘œ μ €μž₯ν•œλ‹€.
  • BLOB(Binary Large Object)은 사진 파일, λ™μ˜μƒ 파일, λ¬Έμ„œ 파일 λ“±μ˜ λŒ€μš©λŸ‰ 이진 데이터λ₯Ό μ €μž₯ν•œλ‹€.
  • ENUM은 μ—΄κ±°ν˜• 데이터λ₯Ό μ‚¬μš©(μš”μΌμ΄λ‚˜ μΉ΄ν…Œκ³ λ¦¬ λ“±) μ‹œ ν™œμš©λ˜λŠ” 방식이닀.
  • SET은 μ΅œλŒ€ 64개λ₯Ό μ€€λΉ„ν•œ 후에 2κ°œμ”© μ„ΈνŠΈλ‘œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” 방식을 μ‚¬μš© μ‹œ ν™œμš©λ˜λŠ” 방식이닀.
  • LONGTEXTλŠ” λŒ€μš©λŸ‰ λ¬Έμ„œ 데이터, LONGBLOB은 λ™μ˜μƒ 파일과 같은 큰 λ°”μ΄λ„ˆλ¦¬ 파일 μ €μž₯ μ‹œμ— ν™œμš©ν•  수 μžˆλ‹€.
데이터 ν˜•μ‹λ°μ΄ν„° ν˜•μ‹λ°”μ΄νŠΈ μˆ˜μ„€λͺ…
CHAR(n)1 ~ 255고정길이 λ¬Έμžν˜•n을 1λΆ€ν„° 255κΉŒμ§€ μ§€μ • κ·Έλƒ₯ CHAR만 μ“°λ©΄ CHAR(1)κ³Ό 동일
VARCHAR(n)1 ~ 65535가변길이 λ¬Έμžν˜• n을 μ‚¬μš©ν•˜λ©΄ 1λΆ€ν„° 65535κΉŒμ§€ μ§€μ •
BINARY(n)1 ~ 255κ³ μ •κΈΈμ΄μ˜ 이진 데이터 κ°’
VARBINARY(n)1 ~ 255κ°€λ³€κΈΈμ΄μ˜ 이진 데이터 κ°’
TEXTTINYTEXT1 ~ 255255 크기의 TEXT 데이터 κ°’
TEXTTEXT1 ~ 65535N 크기의 TEXT 데이터 κ°’
TEXTMEDIUMTEXT1 ~ 1677721516777215 크기의 TEXT 데이터 κ°’
TEXTLONGTEXT1 ~ 4294967295μ΅œλŒ€ 4GB 크기의 TEXT 데이터 κ°’
BLOBTINYBLOB1 ~ 255255 크기의 BLOB 데이터 κ°’
BLOBBLOB1 ~ 65535N 크기의 BLOB 데이터 κ°’
BLOBMEDIUMBLOB1 ~ 1677721516777215 크기의 BLOB 데이터 κ°’
BLOBLONGBLOB1 ~ 4294967295μ΅œλŒ€ 4GB 크기의 BLOB 데이터 κ°’
ENUM(κ°’λ“€...)1 λ˜λŠ” 2μ΅œλŒ€ 65535개의 μ—΄κ±°ν˜• 데이터 κ°’
SET(κ°’λ“€...)1, 2, 3, 4, 8μ΅œλŒ€ 64개의 μ„œλ‘œ λ‹€λ₯Έ 데이터 κ°’

ENUM : ν•˜λ‚˜μ˜ κ°’λ§Œ 선택 κ°€λŠ₯. 미리 μ •μ˜λœ κ°’ μ€‘μ—μ„œ 단일 κ°’λ§Œ μ €μž₯ν•  λ•Œ μ‚¬μš©
SET : μ—¬λŸ¬ 개의 κ°’ 선택 κ°€λŠ₯. 미리 μ •μ˜λœ κ°’λ“€ μ€‘μ—μ„œ 볡수 선택 κ°€λŠ₯

CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    gender ENUM('λ‚¨μž', 'μ—¬μž', '기타')
);
 INSERT INTO users (username, gender) VALUES ('민수', 'λ‚¨μž,μ—¬μž'); -- ❌
CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    tags SET('인기', '할인', 'μ‹ μƒν’ˆ', 'ν•œμ •νŒ')
);
INSERT INTO products (name, tags) VALUES ('μ…”μΈ ', '할인,μ‹ μƒν’ˆ');    -- OK

JSON 데이터 νƒ€μž…

계측적 ꡬ쑰λ₯Ό κ°€μ§„ 데이터λ₯Ό κ·ΈλŒ€λ‘œ μ €μž₯ κ°€λŠ₯

ν˜•λ³€ν™˜

  • SQL λ°μ΄ν„°μ˜ ν˜•λ³€ν™˜μ—λŠ” λͺ…μ‹œμ  ν˜•λ³€ν™˜κ³Ό μ•”μ‹œμ  ν˜•λ³€ν™˜μ΄ μžˆλ‹€.

λͺ…μ‹œμ  ν˜•λ³€ν™˜(Explicit Conversion)

  • CAST (expression AS λ°μ΄ν„°ν˜•μ‹ [(길이)])
  • CONVERT (expression, λ°μ΄ν„°ν˜•μ‹ [(길이)])
  • 데이터 ν˜•μ‹μœΌλ‘œ κ°€λŠ₯ν•œ 것은 BINARY, CHAR, DATE, DATETIME, DECIMAL, JSON, SIGNED INTEGER, TIME, UNSIGNED INTEGER 등이 μžˆλ‹€.

μ•”μ‹œμ  ν˜•λ³€ν™˜(Implicit Conversion)

  • λ”°λ‘œ μ²˜λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λ‚΄λΆ€μ μœΌλ‘œ μžλ™μœΌλ‘œ ν˜•λ³€ν™˜μ΄ 이루어진닀.

CAST (SQL ν‘œμ€€ν•¨μˆ˜)

데이터 νƒ€μž…μ„ λ³€ν™˜ν•  λ•Œ μ‚¬μš©
CAST ('123.45' AS CHAR);

CONVERT (MYSQL μ „μš©ν•¨μˆ˜)

CAST와 λΉ„μŠ·ν•˜κ²Œ 데이터 νƒ€μž… λ³€ν™˜μ— μ‚¬μš©
SELECT CONVERT('2025-09-29', DATE);γ„Ή

CONCAT

λ¬Έμžμ—΄ 뢙이기 ν•¨μˆ˜
CONCAT('홍', '길동')

DML : 데이터λ₯Ό μ‘°μž‘ν•˜λŠ” μ–Έμ–΄)

INSERT
UPDATE
DELETE

DDL :데이터λ₯Ό μ •μ˜ν•˜λŠ” μ–Έμ–΄

CREATE ν…Œμ΄λΈ” 생성
ALTER
DROP ν…Œμ΄λΈ” μ‚­μ œ

CONSTRAINT μ œμ•½μ‘°κ±΄

πŸ’‘ν…Œμ΄λΈ”μ— 데이터가 μž…λ ₯λ˜κ±°λ‚˜ μˆ˜μ •λ  λ•Œμ˜ κ·œμΉ™μ„ μ •μ˜ν•œλ‹€. 데이터 무결성을 보μž₯ν•˜λŠ”λ° 도움이 λœλ‹€.

NOT NULL : NULL값을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” μ œμ•½μ‘°κ±΄. 컬럼 λ ˆλ²¨μ—λ§Œ μ μš©κ°€λŠ₯!

UNIQUE : 쀑볡값 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” μ œμ•½μ‘°κ±΄

PRIMARY KEY = NOT NULL + UNIQUE

  • ν…Œμ΄λΈ”μ—μ„œ ν•œ ν–‰μ˜ 정보λ₯Ό μ°ΎκΈ° μœ„ν•΄ μ‚¬μš©ν•  컬럼
  • ν…Œμ΄λΈ”μ— λŒ€ν•œ μ‹λ³„μž μ—­ν• (ν•œ ν–‰μ”© κ΅¬λΆ„ν•˜λŠ” 역할을 ν•œλ‹€.)
  • NOT NULL + UNIQUE μ œμ•½μ‘°κ±΄μ˜ 의미
  • ν•œ ν…Œμ΄λΈ”λ‹Ή ν•œ 개만 μ„€μ •ν•  수 있음
  • 컬럼 레벨, ν…Œμ΄λΈ” 레벨 λ‘˜ λ‹€ μ„€μ • κ°€λŠ₯함
  • ν•œ 개 μ»¬λŸΌμ— μ„€μ •ν•  μˆ˜λ„ 있고, μ—¬λŸ¬ 개의 μ»¬λŸΌμ„ λ¬Άμ–΄μ„œ μ„€μ •ν•  μˆ˜λ„ 있음(볡합킀)(ν…Œμ΄λΈ” 레벨 μ„€μ •λ§Œ κ°€λŠ₯함)

FROREIGN KEY

  • μ°Έμ‘° 무결성을 μœ„λ°°ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄ μ‚¬μš©
  • μ°Έμ‘°(REFERENCES)된 λ‹€λ₯Έ ν…Œμ΄λΈ”μ—μ„œ μ œκ³΅ν•˜λŠ” κ°’λ§Œ μ‚¬μš©ν•  수 있음
  • FOREIGN KEY μ œμ•½μ‘°κ±΄μ— μ˜ν•΄μ„œ ν…Œμ΄λΈ” κ°„μ˜ 관계(RELATIONSHIP)κ°€ ν˜•μ„± 됨
  • μ œκ³΅λ˜λŠ” κ°’ μ™Έμ—λŠ” NULL을 μ‚¬μš©ν•  수 있음
    μ‚­μ œλ‘€

ON UPDATE SET NULL
ON DELETE SET NULL

λΆ€λͺ¨ ν…Œμ΄λΈ”(μ°Έμ‘°λ˜λŠ” μͺ½) μ—μ„œ PK 값이 λ³€κ²½λ˜κ±°λ‚˜ μ‚­μ œλ  λ•Œ
β†’ μžμ‹ ν…Œμ΄λΈ”μ˜ μ™Έλž˜ ν‚€ 값이 μžλ™μœΌλ‘œ NULL둜 λ°”λ€œ

ON UPDATE CASCADE
ON DELETE CASCADE

λΆ€λͺ¨ 행이 μˆ˜μ •λ˜κ±°λ‚˜ μ‚­μ œλ  λ•Œ, μžμ‹ 행도 같이 λ°”λ€Œκ±°λ‚˜ μ‚­μ œλ¨

CHECK

  • check μ œμ•½ 쑰건 μœ„λ°˜μ‹œ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” μ œμ•½μ‘°κ±΄ ( 쑰건 μ•ˆλ§žλŠ”κ±΄ λ“€μ–΄μ˜€μ§€ λͺ»ν•΄!)
  • μ œμ•½μ‘°κ±΄ ν™•μΈμš© ν…Œμ΄λΈ” 생성 및 ν…ŒμŠ€νŠΈ 데이터 INSERT ν›„ μ‘°νšŒν•˜κΈ°
  • column levelμ—μ„œλ„ 도메인 λͺ…μ‹œ

DEFAULT

  • μ»¬λŸΌμ— null λŒ€μ‹  κΈ°λ³Έ κ°’ 적용
  • 컬럼 νƒ€μž…μ΄ DATE일 μ‹œ current_date만 κ°€λŠ₯
  • 컬럼 νƒ€μž…μ΄ DATETIME일 μ‹œ current_timeκ³Ό current_timestamp, now() λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯

0개의 λŒ“κΈ€