λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ—£οΈ μ‹ μž… 인터뷰/λ°μ΄ν„°λ² μ΄μŠ€

μ‹ μž… 개발자 κΈ°μˆ λ©΄μ ‘ : λ°μ΄ν„°λ² μ΄μŠ€ 01

πŸ—£οΈ DBMSλž€?

 

DBMS (Database Management Sysyem, λ°μ΄ν„°λ² μ΄μŠ€ 관리 μ‹œμŠ€ν…œ) λŠ” λ°μ΄ν„°λ² μ΄μŠ€ λ‚΄ 데이터에 μ ‘κ·Όν•˜λ„λ‘ λ„μ™€μ£ΌλŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€. DBMSλŠ” 크게 μ§ˆμ˜μ²˜λ¦¬κΈ°μ™€ μ €μž₯μ‹œμŠ€ν…œμœΌλ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€. DBλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ , OS에 쒅속적인 파일 μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ˜ ν™•μž₯성을 ν•΄μΉ˜κ³  검색 효율이 크게 λ–¨μ–΄μ§‘λ‹ˆλ‹€. λ˜ν•œ 파일 μ‹œμŠ€ν…œμ˜ 데이터 쀑볡, 비일관성, 검색 λ“±μ˜ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

널리 μ‚¬μš©λ˜λŠ” DBMS 쀑 μΌλΆ€λŠ” MySql, Oracle λ“±μž…λ‹ˆλ‹€.

 

πŸ—£οΈ RDBMSλž€?

 

κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ 관리 μ‹œμŠ€ν…œ (RDBMS)은 λ°μ΄ν„°λ² μ΄μŠ€μ— λ³„λ„μ˜ ν…Œμ΄λΈ”μ— μ €μž₯된 κ΄€κ³„ν˜• 데이터 λͺ¨λΈμ„ κΈ°λ°˜μœΌλ‘œν•˜λ©° 곡톡 μ—΄μ˜ μ‚¬μš©κ³Ό 관련이 μžˆμŠ΅λ‹ˆλ‹€. SQL (Structured Query Language)을 μ‚¬μš©ν•˜μ—¬ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터에 μ‰½κ²Œ μ•‘μ„ΈμŠ€ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ—£οΈ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ΄μš©ν•΄ κ°œλ°œν•΄ λ³Έ κ²½ν—˜μ΄ μžˆλ‚˜μš”?

 

μ €λŠ” OOν”„λ‘œμ νŠΈλ₯Ό μˆ˜ν–‰ν•˜λ©° OO에 λŒ€ν•œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό ꡬ좕 및 ν™œμš©ν–ˆμŠ΅λ‹ˆλ‹€. OOν…Œμ΄λΈ”μ„ μƒμ„±ν–ˆκ³ , κ²ΉμΉ˜λŠ” OOκ°€ μ—†λ‹€λŠ” 점을 κ³ λ €ν•΄ OO을 κΈ°λ³Έ ν‚€λ‘œ μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€. 그리고 ν•„μš”ν•œ 정보 OO에 따라 JOIN 연산을 μ΄μš©ν•΄ ν…Œμ΄λΈ”μ„ μ‘°νšŒν•΄ μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν–ˆμŠ΅λ‹ˆλ‹€.

 

κ΅¬μΆ•ν–ˆλ˜ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•œ 정보, ν…Œμ΄λΈ”μ˜ ꡬ성, ν‚€ 값을 생각해 보고 닡변을 μ€€λΉ„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
κ΅¬μΆ•ν–ˆλ˜ λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν‚€ 값에 λŒ€ν•œ μœ νš¨μ„±μ„ λ¬»κ±°λ‚˜, ERDλ₯Ό κ°„λž΅νžˆ κ·Έλ¦¬λŠ” 것을 μš”κ΅¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μΆ”κ°€λ‘œ μ–΄λ–€ DBMSλ₯Ό μ‚¬μš©ν–ˆκ³ , μ™œ μ‚¬μš©ν–ˆλŠ”μ§€, μž₯단점은 무엇인지λ₯Ό μ•Œκ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

 


πŸ—£οΈ NoSQL이 무엇인지 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ™€ 비ꡐ해 μ„€λͺ…ν•΄ λ³΄μ„Έμš”.

 

NoSQL은 λΉ„κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ‘œ, 2차원 ν˜•νƒœμ˜ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ³΄λ‹€ μœ μ—°ν•œ 데이터 ꡬ쑰λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ Document, Key-Value, Graph λ“± λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ 데이터λ₯Ό μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ„œλ²„ 증섀을 ν†΅ν•œ λ°μ΄ν„°λ² μ΄μŠ€ ν™•μž₯이 κ°€λŠ₯ν•΄μ„œ λ°©λŒ€ν•œ μ–‘μ˜ 데이터λ₯Ό μ €μž₯ν•˜λŠ” 데 μœ λ¦¬ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 쀑볡 데이터λ₯Ό ν—ˆμš©ν•˜λ―€λ‘œ 데이터λ₯Ό κ°±μ‹ ν•˜λŠ” 경우 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ³΄λ‹€ 처리 λΉ„μš©μ΄ 많이 λ“ λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

 

RDB(κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€)

정해진 μŠ€ν‚€λ§ˆμ— 따라 데이터λ₯Ό 'ν…Œμ΄λΈ”'에 μ €μž₯ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€

데이터 ꡬ쑰가 보μž₯λ˜μ–΄μžˆκ³ , 쀑볡을 ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

SQL을 μ‚¬μš©ν•΄ RDBMSμ—μ„œ 데이터λ₯Ό μ €μž₯, μˆ˜μ •, μ‚­μ œ 및 검색할 수 μžˆμŠ΅λ‹ˆλ‹€.

수직적 ν™•μž₯이 κ°€λŠ₯ν•©λ‹ˆλ‹€. (μ„œλ²„μ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” 것)

관계λ₯Ό λ§Ίκ³  μžˆλŠ” λ°μ΄ν„°μ˜ 변경이 μž¦μ€ 경우 / 변경될 여지가 μ—†κ³ , λͺ…ν™•ν•œ μŠ€ν‚€λ§ˆκ°€ μ‚¬μš©μžμ™€ λ°μ΄ν„°μ—κ²Œ μ€‘μš”ν•œ κ²½μš°μ— μ‚¬μš©ν•©λ‹ˆλ‹€.

 

NoSQL

μŠ€ν‚€λ§ˆκ°€ μ—†κ±°λ‚˜, λŠμŠ¨ν•œ μŠ€ν‚€λ§ˆλ‘œ 데이터 κ°„μ˜ 관계 없이 자유둜운 ν˜•νƒœλ‘œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ (λΉ„μ •ν˜•)

μœ μ—°ν•˜κΈ° λ•Œλ¬Έμ— 데이터 μ‘°μ •κ³Ό μƒˆλ‘œμš΄ ν•„λ“œ 생성이 μžμœ λ‘­μŠ΅λ‹ˆλ‹€.

쀑볡을 κ³„μ†ν•΄μ„œ μ—…λ°μ΄νŠΈ ν•΄μ€˜μ•Ό ν•˜λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

μˆ˜ν‰μ  ν™•μž₯으둜 νŠΈλž˜ν”½ λΆ„μ‚° 및 λŒ€μš©λŸ‰ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

읽기λ₯Ό μžμ£Όν•˜μ§€λ§Œ 데이터 변경은 자주 μ—†λŠ” 경우 / λΉ„μ •ν˜•μ˜ 데이터 ꡬ쑰λ₯Ό 가진 경우 / λ§‰λŒ€ν•œ μ–‘μ˜ 데이터에 μ˜ν•΄ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μˆ˜ν‰μ μœΌλ‘œ ν™•μž₯ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ— μ‚¬μš©

 

ν‘œλ‘œ κ°„λ‹¨νžˆ μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

ꡬ뢄 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ NoSQL λ°μ΄ν„°λ² μ΄μŠ€
데이터 μ €μž₯ 2차원 ν…Œμ΄λΈ” λΆ„μ‚°ν˜• ꡬ쑰둜, λ‹€μ–‘ν•œ ν˜•νƒœ
데이터 쀑볡 μ—†μŒ μžˆλ‹€. κ°±μ‹  μ‹œ 이λ₯Ό μ²˜λ¦¬ν•΄μ•Ό 함
μŠ€ν‚€λ§ˆ μŠ€ν‚€λ§ˆκ°€ μžˆμ–΄μ„œ λ°μ΄ν„°μ˜ 무결성을 보μž₯함 μŠ€ν‚€λ§ˆκ°€ μ—†κ³  μœ μ—°ν•œ 데이터 처리 κ°€λŠ₯
데이터 ν™•μž₯ 수직적 ν™•μž₯ 지원 (μ„œλ²„ 자체 μ„±λŠ₯ ν–₯상) μˆ˜ν‰μ  ν™•μž₯ 지원 (λΆ„μ‚°ν˜•μœΌλ‘œ μ„œλ²„ μΆ”κ°€)
DBMS Oracle, MySQL, SQLite MongoDB

πŸ—£οΈ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œμ˜ 'ν‚€' 에 λŒ€ν•΄ μ•„λŠ”λŒ€λ‘œ μ„€λͺ…ν•΄ μ£Όμ„Έμš”.

 

검색, μ •λ ¬ μ‹œ νŠœν”Œ(ν–‰, λ ˆμ½”λ“œ) 을 κ΅¬λΆ„ν•˜λŠ” 기쀀이 λ˜λŠ” 속성을 μ˜λ―Έν•©λ‹ˆλ‹€. 

ν‚€λŠ” μœ μΌμ„±κ³Ό μ΅œμ†Œμ„±μ΄λΌλŠ” 두 가지 νŠΉμ„±μ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

μœ μΌμ„± : ν•˜λ‚˜μ˜ ν‚€ κ°’μœΌλ‘œ νŠœν”Œμ„ 식별할 수 μžˆλ‹€. λͺ¨λ“  λ ˆμ½”λ“œμ—μ„œ ν•΄λ‹Ή ν•„λ“œμ— μ€‘λ³΅λœ 값이 λ‚˜νƒ€λ‚˜μ§€ μ•ŠλŠ”λ‹€λŠ” 속성
μ΅œμ†Œμ„± : νŠœν”Œμ„ μ‹λ³„ν•˜λŠ” 데 ν•„μš”ν•œ μ†μ„±λ§ŒμœΌλ‘œ 이루어져 μžˆλ‹€. μ΅œμ†Œν•œμ˜ ν•„λ“œλ‘œ λ ˆμ½”λ“œλ₯Ό μœ μΌν•˜κ²Œ ꡬ별할 수 μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 속성

 

πŸ”‘ μŠˆνΌν‚€ (Super Key)

ν…Œμ΄λΈ”μ— μ‘΄μž¬ν•˜λŠ” ν•„λ“œλ“€μ˜ λΆ€λΆ„μ§‘ν•©μœΌλ‘œμ¨, μœ μΌμ„±μ„ λ§Œμ‘±ν•΄μ•Ό ν•˜λŠ” ν‚€μž…λ‹ˆλ‹€.

λΆ€λΆ„ μ§‘ν•©μ΄λ―€λ‘œ ν•„λ“œ ν•˜λ‚˜λ„ μŠˆνΌν‚€κ°€ 될 수 있고, ν•„λ“œ μ—¬λŸ¬ κ°œκ°€ 묢인 킀도 μŠˆνΌν‚€κ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•„λ“œκ°€ μ—¬λŸ¬ κ°œκ°€ 묢인 ν‚€λ₯Ό '볡합킀'라고도 λΆ€λ¦…λ‹ˆλ‹€.

 

πŸ”‘ ν›„보킀 (Candidate Key)

ν›„λ³΄ν‚€λŠ” κΈ°λ³Έ ν‚€κ°€ 될 수 μžˆλŠ” 후보가 λ˜λŠ” 킀듀을 μ˜λ―Έν•©λ‹ˆλ‹€. μŠˆνΌν‚€ μ€‘μ—μ„œ μ΅œμ†Œμ„±μ„ λ§Œμ‘±ν•˜λŠ” ν‚€λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

λ”°λΌμ„œ ν›„λ³΄ν‚€λŠ”, μœ μΌμ„± + μ΅œμ†Œμ„±μ„ λ§Œμ‘±ν•˜λŠ” 킀듀을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

πŸ”‘ κΈ°λ³Έν‚€ (Primary Key)

κΈ°λ³Έ ν‚€λŠ” ν…Œμ΄λΈ”μ—μ„œ νŠΉμ • λ ˆμ½”λ“œλ₯Ό κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ 후보 ν‚€ μ€‘μ—μ„œ μ„ νƒλœ ν•˜λ‚˜μ˜ κ³ μœ ν•œ μ‹λ³„μžλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

μ€‘λ³΅λ˜λŠ” κ°’μ΄λ‚˜ NULL값은 κ°€μ§ˆ 수 μ—†μŠ΅λ‹ˆλ‹€.

후보킀 μ€‘μ—μ„œ 값이 자주 λ³€κ²½λ˜μ§€ μ•Šκ³ , 값이 λ‹¨μˆœν•œ 것을 μ„ νƒν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

 

πŸ”‘ λŒ€μ²΄ν‚€ (Alternate Key)

후보 ν‚€ μ€‘μ—μ„œ κΈ°λ³Έ ν‚€λ‘œ μ„ νƒλœ 것듀을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λͺ¨λ“  것을 λŒ€μ²΄ν‚€λΌκ³  λΆ€λ¦…λ‹ˆλ‹€.

 

πŸ”‘ μ™Έλž˜ν‚€ (Foreign Key)

ν•œ ν…Œμ΄λΈ”μ˜ ν‚€ μ€‘μ—μ„œ λ‹€λ₯Έ ν…Œμ΄λΈ”μ˜ λ ˆμ½”λ“œλ₯Ό μœ μΌν•˜κ²Œ 식별할 수 μžˆλŠ” ν‚€λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

ν•˜λ‚˜μ˜ ν•„λ“œ λ˜λŠ” 전체 ν•„λ“œμ˜ λΆ€λΆ„μ§‘ν•©μœΌλ‘œ κ΅¬μ„±λ˜κ³ , μ€‘λ³΅λœ κ°’κ³Ό NULL값을 κ°€μ§ˆ 수 있으며

λ°˜λ“œμ‹œ μ°Έμ‘°λ˜λŠ” ν…Œμ΄λΈ”μ—μ„œ μœ μΌν•œ 값을 κ°–λŠ” ν•„λ“œλ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•©λ‹ˆλ‹€. 

 

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλŠ” μ°Έμ‘° 무결성을 μœ„ν•΄ μ°Έμ‘° λŒ€μƒμ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ™Έλž˜ ν‚€λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 즉, μ–΄λ– ν•œ μ™Έλž˜ ν‚€ BBκ°€ AAλ₯Ό μ°Έμ‘°ν•œλ‹€λ©΄, AAλŠ” λ°˜λ“œμ‹œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ‘΄μž¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ™Έλž˜ ν‚€λŠ” μ°Έμ‘° 무결성을 지킀기 μœ„ν•΄ RESTRICTED와 CASCADE, SET NULLμ΄λΌλŠ” κ°œλ…μ„ μ™Έλž˜ 킀에 μ μš©ν•  수 μžˆλ„λ‘ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 

RESTRICTED : λ ˆμ½”λ“œλ₯Ό λ³€κ²½ λ˜λŠ” μ‚­μ œν•˜κ³ μž ν•  λ•Œ ν•΄λ‹Ή λ ˆμ½”λ“œλ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ” κ°œμ²΄κ°€ μžˆλ‹€λ©΄, λ³€κ²½ λ˜λŠ” μ‚­μ œ 연산을 μ·¨μ†Œν•œλ‹€.
CASCADE : λ ˆμ½”λ“œλ₯Ό λ³€κ²½ λ˜λŠ” μ‚­μ œν•˜λ©΄, ν•΄λ‹Ή λ ˆμ½”λ“œλ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ” κ°œμ²΄λ„ λ³€κ²½ λ˜λŠ” μ‚­μ œλœλ‹€.
SET NULL : λ ˆμ½”λ“œλ₯Ό λ³€κ²½ λ˜λŠ” μ‚­μ œν•˜λ©΄, ν•΄λ‹Ή λ ˆμ½”λ“œλ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ” 개체의 값을 NULL둜 μ„€μ •ν•œλ‹€.

πŸ—£οΈ 슈퍼 킀와 후보 ν‚€μ˜ 차이점을 μ„€λͺ…ν•΄ λ³΄μ„Έμš”.

 

슈퍼 킀와 후보 ν‚€ λͺ¨λ‘ νŠœν”Œμ„ 식별할 수 μžˆλŠ”, μœ μΌμ„±μ„ λ§Œμ‘±ν•˜λŠ” ν‚€μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 슈퍼 ν‚€λŠ” μ΅œμ†Œμ„±μ„ λ§Œμ‘±ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€. λ”°λΌμ„œ 슈퍼 ν‚€μ—λŠ” νŠœν”Œμ„ 식별할 수 μ—†λŠ” 속성이 포함될 수 μžˆμŠ΅λ‹ˆλ‹€. λ°˜λ©΄μ— 후보 ν‚€λŠ” μ΅œμ†Œμ„±μ„ λ§Œμ‘±ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ”°λΌμ„œ νŠœν”Œμ„ μ‹λ³„ν•˜λŠ” 데 ν•„μš”ν•œ μ†μ„±μœΌλ‘œλ§Œ κ΅¬μ„±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.


πŸ—£οΈ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 무결성에 κ΄€ν•΄ μ„€λͺ…ν•΄ λ³΄μ„Έμš”.

 

무결성은 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 데이터와 μ‹€μ œ 데이터가 μΌμΉ˜ν•˜λŠ”μ§€?에 λŒ€ν•œ μ •ν™•μ„±, μœ νš¨μ„± 그리고 λ°μ΄ν„°μ˜ 일관성을 μ˜λ―Έν•©λ‹ˆλ‹€. 이λ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ μ €μž₯, μ‚­μ œ, μˆ˜μ •μ„ μ œμ•½ν•˜κΈ° μœ„ν•œ 쑰건이 무결성 μ œμ•½ μ‘°κ±΄μž…λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ¬΄κ²°μ„±μœΌλ‘œλŠ” κΈ°λ³Έ ν‚€κ°€ κ³ μœ ν•œ 값을 κ°€μ Έμ•Ό ν•œλ‹€λŠ” 개체 무결성, 속성 값이 도메인에 속해야 ν•œλ‹€λŠ” 도메인 무결성, μ™Έλž˜ ν‚€ 값은 μ°Έμ‘°ν•˜λŠ” ν…Œμ΄λΈ”μ˜ κΈ°λ³Έ ν‚€ 값이어야 ν•œλ‹€λŠ” μ°Έμ‘° 무결성이 μžˆμŠ΅λ‹ˆλ‹€. 

 

개체 무결성 : λͺ¨λ“  ν…Œμ΄λΈ”μ΄ κΈ°λ³Έ ν‚€λ₯Ό κ°€μ Έμ•Ό ν•œλ‹€. κΈ°λ³Έ ν‚€λŠ” null, 쀑볡 κ°’ λΆˆκ°€λŠ₯ν•˜λ‹€.
도메인 무결성 : ν…Œμ΄λΈ”μ˜ 속성 값은 도메인에 속해야 ν•œλ‹€. 도메인은 속성이 κ°€μ§ˆ 수 μžˆλŠ” κ°’μ˜ 집합을 μ˜λ―Έν•œλ‹€.
μ°Έμ‘° 무결성 : μ™Έλž˜ ν‚€λŠ” nullμ΄κ±°λ‚˜ μ°Έμ‘° ν…Œμ΄λΈ”μ˜ κΈ°λ³Έ ν‚€ κ°’κ³Ό 동일해야 ν•œλ‹€.

πŸ—£οΈ Index κ°€ λ¬΄μ—‡μΈκ°€μš”?

 

Index (색인) 도 ν•˜λ‚˜μ˜ λ°μ΄ν„°λ² μ΄μŠ€ 객체이며, λ°μ΄ν„°λ² μ΄μŠ€ 크기의 μ•½ 10% μ •λ„μ˜ μ €μž₯곡간을 ν•„μš”λ‘œ ν•©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ νŠœν”Œ 검색 μ„±λŠ₯을 ν–₯μƒν•˜κΈ° μœ„ν•΄ 속성 κ°’κ³Ό νŠœν”Œμ΄ μ €μž₯된 μ£Όμ†Œλ₯Ό 인덱슀 ν…Œμ΄λΈ”μ— μ €μž₯ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

Key-Value ν˜•νƒœλ‘œ '속성 κ°’-νŠœν”Œ μ£Όμ†Œ'λ₯Ό 인덱슀 ν…Œμ΄λΈ”μ— μ €μž₯ν•©λ‹ˆλ‹€. 속성 값을 κΈ°μ€€μœΌλ‘œ μ •λ ¬ μƒνƒœλ₯Ό μœ μ§€ν•©λ‹ˆλ‹€.

 

IndexλŠ” ν…Œμ΄λΈ”μ„ μ²˜μŒλΆ€ν„° λκΉŒμ§€ κ²€μƒ‰ν•˜μ§€ μ•Šκ³ , 인덱슀λ₯Ό κ²€μƒ‰ν•΄μ„œ ν•΄λ‹Ή 자료의 ν…Œμ΄λΈ”μ„ μ ‘κ·Όν•˜λŠ” 방법을 μ˜λ―Έν•©λ‹ˆλ‹€.

IndexλŠ” 항상 μ •λ ¬λœ μƒνƒœλ₯Ό μœ μ§€ν•˜λ―€λ‘œ νŠœν”Œ 검색보닀 μ›ν•˜λŠ” 값을 κ²€μƒ‰ν•˜λŠ” 데 속도가 λΉ λ₯Έ μž₯점을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μƒˆλ‘œμš΄ 값을 μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œ, μˆ˜μ •ν•˜λŠ” κ²½μš°μ—λŠ” 인덱슀 λ³€κ²½ 및 μ •λ ¬ 과정이 ν•„μš”ν•΄μ„œ DML μ‹€ν–‰ 속도가 느린 단점이 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ Index μ €μž₯을 μœ„ν•œ μΆ”κ°€ 곡간이 ν•„μš”ν•˜λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

 

DML(Data Manipulation Language)
데이터λ₯Ό μ‘°μž‘ν•˜λŠ” λͺ…λ Ήμ–΄ ex) INSERT, DELETE, UPDATE

 

즉, IndexλŠ” λ°μ΄ν„°μ˜ μ €μž₯ μ„±λŠ₯을 ν¬μƒν•˜λŠ” λŒ€μ‹ , λ°μ΄ν„°μ˜ 검색 속도λ₯Ό λ†’μ΄λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

 

https://velog.io/@sweet_sumin/%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%93%9C-%EC%9D%B8%EB%8D%B1%EC%8A%A4-Clustered-Index-%EB%84%8C-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%93%9C-%EC%9D%B8%EB%8D%B1%EC%8A%A4-Non-Clustered-Index

 

참고둜 Primary KeyλŠ” Indexλ₯Ό 생성할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. (ν΄λŸ¬μŠ€ν„°λ“œ 인덱슀, λ…Όν΄λŸ¬μŠ€ν„°λ“œ 인덱슀 질문 μœ λ„) 


πŸ—£οΈ 인덱슀λ₯Ό μ‚¬μš© 쀑일 λ•Œ 데이터λ₯Ό μ‚­μ œν•˜λ©΄ λ°œμƒν•  수 μžˆλŠ” λ¬Έμ œλŠ” λ¬΄μ—‡μΌκΉŒμš”?

 

데이터 μ‚­μ œκ°€ μž¦μ„ 경우, μ €μž₯ 곡간을 λ‚­λΉ„ν•  수 μžˆλ‹€λŠ” 문제점이 μžˆμŠ΅λ‹ˆλ‹€. μΈλ±μŠ€λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ 검색 νš¨μœ¨μ„ 높이기 μœ„ν•΄ 인덱슀 ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. μ‚­μ œ 연산이 μΌμ–΄λ‚˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλŠ” ν•΄λ‹Ή νŠœν”Œμ΄ μ‚­μ œλ˜μ§€λ§Œ, 인덱슀 ν…Œμ΄λΈ”μ—μ„œλŠ” ν•΄λ‹Ή νŠœν”Œμ„ 'μ‚¬μš©ν•˜μ§€ μ•ŠμŒ' 으둜 μ²˜λ¦¬ν•˜κ³  μ‹€μ œλ‘œ λ°μ΄ν„°λŠ” μ‚­μ œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μž¦μ€ 데이터 μ‚­μ œκ°€ μΌμ–΄λ‚˜λ©΄ 인덱슀 ν…Œμ΄λΈ”μ— λΆˆν•„μš”ν•œ 데이터가 남아 μ €μž₯ 곡간을 λ‚­λΉ„ν•˜κ²Œ λ©λ‹ˆλ‹€.


πŸ—£οΈ ν΄λŸ¬μŠ€ν„°λ“œ 인덱슀, λ…Όν΄λŸ¬μŠ€ν„°λ“œ μΈλ±μŠ€μ— λŒ€ν•΄ μ„€λͺ…ν•΄ μ£Όμ‹œκ² μ–΄μš”?

 

책에 λΉ„μœ ν•˜μžλ©΄,

  • ν΄λŸ¬μŠ€ν„°λ“œ μΈλ±μŠ€λŠ” νŽ˜μ΄μ§€λ₯Ό μ•ŒκΈ° λ•Œλ¬Έμ— λ°”λ‘œ κ·Έ νŽ˜μ΄μ§€λ₯Ό νŽ΄λŠ” 것
  • λ„Œ ν΄λŸ¬μŠ€ν„°λ“œ μΈλ±μŠ€λŠ” 뒀에 λͺ©μ°¨μ—μ„œ 찾고자 ν•˜λŠ” λ‚΄μš©μ˜ νŽ˜μ΄μ§€λ₯Ό μ°Ύκ³  κ·Έ νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜λŠ” 것.
  • ν…Œμ΄λΈ” μŠ€μΊ”μ€ μ²˜μŒλΆ€ν„° ν•œ μž₯μ”© λ„˜κΈ°λ©΄μ„œ λ‚΄μš©μ„ μ°ΎλŠ” κ²ƒμž…λ‹ˆλ‹€.

ν΄λŸ¬μŠ€ν„°λ“œ μΈλ±μŠ€λŠ” 검색 속도λ₯Ό ν–₯μƒμ‹œμΌœμ£Όμ§€λ§Œ μƒˆλ‘œμš΄ 데이터λ₯Ό μ‚½μž…ν•  λ•ŒλŠ” λ§Žμ€ λΉ„μš©μ΄ μ†Œλͺ¨λ©λ‹ˆλ‹€.

 

λ…Ό ν΄λŸ¬μŠ€ν„°λ“œ μΈλ±μŠ€λŠ” 말 κ·ΈλŒ€λ‘œ ν΄λŸ¬μŠ€ν„° ν˜•μ˜ λ°˜λŒ€μΈ ꡰ집화 λ˜μ–΄μžˆμ§€ μ•Šμ€ 인덱슀 νƒ€μž…μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ ν…Œμ΄λΈ”μ— μ €μž₯된 물리적 μˆœμ„œμ— 따라 데이터λ₯Ό μ •λ ¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 즉, μˆœμ„œλŒ€λ‘œ μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

https://gwang920.github.io/database/clusterednonclustered/

좜처

https://gocoder.tistory.com/1826

https://gwang920.github.io/database/clusterednonclustered/


πŸ—£οΈ νŠΈλž™μž­μ…˜μ΄ 무엇인지 μ•„λŠ”λŒ€λ‘œ μ„€λͺ…ν•΄ μ£Όμ„Έμš”.

 

λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ³€ν™”μ‹œν‚€λŠ” ν•˜λ‚˜μ˜ 논리적인 μž‘μ—… λ‹¨μœ„λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 논리적인 μž‘μ—…μ˜ 쿼리 κ°œμˆ˜μ™€ 관계 없이 νŠΈλžœμž­μ…˜μœΌλ‘œ 묢어놓은 μž‘μ—… λ‹¨μœ„ 전체가 100% μ μš©λ˜κ±°λ‚˜ 아무것도 μ μš©λ˜μ§€ μ•Šμ•„μ•Ό 함을 보μž₯ν•©λ‹ˆλ‹€. (all or nothing)

 

νŠΈλžœμž­μ…˜μ˜ νŠΉμ§•μ€ μ•ž κΈ€μžλ₯Ό λ”°μ„œ ACID 라 λΆ€λ¦…λ‹ˆλ‹€.

Atomicity (μ›μžμ„±) : νŠΈλžœμž­μ…˜μ„ κ΅¬μ„±ν•˜λŠ” μ—°μ‚° 전체가 λͺ¨λ‘ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜κ±°λ‚˜ λͺ¨λ‘ μ·¨μ†Œλ˜μ–΄μ•Ό ν•œλ‹€.
Consistency (일관성) : νŠΈλžœμž­μ…˜μ΄ 싀행을 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œν•˜λ©΄ μ–Έμ œλ‚˜ 일관성 μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλ‘œ μœ μ§€ν•œλ‹€.
Isolation (고립성) : 두 개 μ΄μƒμ˜ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— λ°œμƒν•  λ•Œ, μ„œλ‘œμ˜ 연산에 영ν–₯을 μ£Όλ©΄ μ•ˆ λœλ‹€.
Durability (μ˜κ΅¬μ„±) : μ»€λ°‹λœ νŠΈλžœμž­μ…˜μ˜ λ‚΄μš©μ€ 영ꡬ히 λ°˜μ˜λœλ‹€.

 

νŠΈλžœμž­μ…˜μ˜ μƒνƒœλŠ” ν™œλ™, μž₯μ• , 철회, λΆ€λΆ„μ™„λ£Œ, μ™„λ£Œ κ°€ μžˆμŠ΅λ‹ˆλ‹€.

ν™œλ™ (Active) : νŠΈλžœμž­μ…˜μ΄ μ‹€ν–‰ 쀑인 μƒνƒœ
μž₯μ•  (Fail) : νŠΈλžœμž­μ…˜μ΄ 싀행에 였λ₯˜κ°€ λ°œμƒν•΄ μ€‘λ‹¨ν•œ μƒνƒœ
철회 (Aborted) : νŠΈλžœμž­μ…˜μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ–΄ Rollback (νŠΈλžœμž­μ…˜ μ—°μ‚° μ΄μ „μ˜ μƒνƒœλ‘œ λŒμ•„κ°) 을 μˆ˜ν–‰ν•˜λŠ” μƒνƒœ
λΆ€λΆ„ μ™„λ£Œ (Partitially Commit) : νŠΈλžœμž­μ…˜μ΄ λ§ˆμ§€λ§‰ μ—°μ‚°κΉŒμ§€ μ‹€ν–‰ν–ˆμ§€λ§Œ, Commit 연산이 μ‹€ν–‰λ˜κΈ° μ§μ „μ˜ μƒνƒœ
μ™„λ£Œ (Committed) : νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μ’…λ£Œλ˜μ–΄ commit 연산을 μ‹€ν–‰ν•œ ν›„μ˜ μƒνƒœ

 

νŠΈλžœμž­μ…˜μ„ μ²˜λ¦¬ν•˜λŠ” 쀑 이상 ν˜„μƒμ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 속성 κ°„ μ’…μ†μ΄λ‚˜ λ°μ΄ν„°μ˜ μ€‘λ³΅μœΌλ‘œ λ°œμƒν•©λ‹ˆλ‹€. 

μ‚½μž… 이상, κ°±μ‹  이상, μ‚­μ œ 이상이 있으며, 속성 κ°„ 쒅속을 ν•΄μ œν•˜κ³ 

λ°μ΄ν„°λ² μ΄μŠ€μ˜ 쀑볡을 μ œκ±°ν•˜κΈ° μœ„ν•΄ ν…Œμ΄λΈ”μ„ λΆ„ν•΄ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ •κ·œν™”λ₯Ό μ§„ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.


 

πŸ—£οΈ DBμ—μ„œ 락은 λ¬΄μ—‡μΈκ°€μš”?

 

락은 νŠΈλžœμž­μ…˜μ΄ μ²˜λ¦¬λ˜λŠ” μˆœμ„œλ₯Ό 보μž₯ν•΄ 무결성을 μœ μ§€ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. λ½μ—λŠ” 곡유 락과 베타 락이 μžˆμŠ΅λ‹ˆλ‹€. 곡유 락은 데이터λ₯Ό 읽기 μœ„ν•œ 락으둜, 데이터가 λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ νŠΉμ • νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ 쀑일 λ•Œ 곡유 락을 가진 λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ°˜λ©΄μ— 베타 락은 데이터λ₯Ό μˆ˜μ •ν•˜λŠ” 락으둜, ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ 쀑일 λ•Œ μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€. 이와 같이 락을 μ΄μš©ν•  λ•Œ νŠΈλžœμž­μ…˜μ΄ ꡐ착 μƒνƒœμ— 빠질 수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ—£οΈ 더 μžμ„Ένžˆ μ„€λͺ…ν•΄μ£Όμ„Έμš”!

 

DB Lock은 νŠΈλžœμž­μ…˜ 처리의 μˆœμ°¨μ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•œ λ°©λ²•μœΌλ‘œ, 데이터에 μ ‘κ·Όν•˜κΈ° 전에 Lock을 μš”μ²­ν•΄μ„œ Lock이 ν—ˆλ½λ˜λ©΄ ν•΄λ‹Ή 데이터에 μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.

 

DB Lock의 μ’…λ₯˜λŠ” 크게 두 κ°€μ§€λ‘œ, λΉ„관적 락과 낙관적 락이 μžˆμŠ΅λ‹ˆλ‹€.

비관적 락과 낙관적 락의 μ‚¬μš© 기쀀은 '읽기와 μˆ˜μ • λΉ„μœ¨μ΄ 어디에 κ°€κΉŒμš΄μ§€'μž…λ‹ˆλ‹€.

μˆ˜μ •μ˜ λΉ„μœ¨μ΄ λ†’λ‹€λ©΄ (좩돌이 λ°œμƒν•  κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜λ©΄) 비관적 락을,

읽기의 비쀑이 λ†’λ‹€λ©΄ (좩돌이 λ°œμƒν•˜μ§€ μ•Šμ„ 것이라 μ˜ˆμƒλ˜λ©΄) 낙관적 락을 μ‚¬μš©ν•©λ‹ˆλ‹€.

 

비관적 락 (Pessimistic Lock) : 데이터 κ°±μ‹  μ‹œ 좩돌이 λ°œμƒν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•΄ 락을 κ±°λŠ” 방식

  • 곡유락(Shared Lock) : μ‚¬μš© 쀑인 데이터λ₯Ό λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ 읽기 ν—ˆμš©, μ“°κΈ° λΉ„ν—ˆμš©
  • 베타락(Exclusive Lock) : μ‚¬μš© 쀑인 데이터λ₯Ό λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ 읽기, μ“°κΈ° λͺ¨λ‘ λΉ„ν—ˆμš©
  • 데이터 μˆ˜μ • μ¦‰μ‹œ νŠΈλžœμž­μ…˜ μΆ©λŒμ„ 감지할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 둀백을 κ°œλ°œμžκ°€ 일일히 ν•˜κΈ° νž˜λ“  경우, 좩돌이 일어났을 λ•Œ λ‘€λ°± λΉ„μš©μ΄ 많이 λ“œλŠ” 경우, μ£Όλ¬Έ μ‹œμ— 쿠폰 μ‚¬μš©, μ•Œλ¦Ό 제곡, μ£Όλ¬Έμ„œ μž‘μ„± λ“± μ—¬λŸ¬ κΈ°λŠ₯이 ν•œ νŠΈλžœμž­μ…˜μ— λ¬Άμ—¬μžˆλŠ” κ²½μš°μ— μ ν•©ν•©λ‹ˆλ‹€.

낙관적 락 (Optimistic Lock) : 데이터 κ°±μ‹  μ‹œ 좩돌이 λ°œμƒν•˜μ§€ μ•Šμ„ 것이라 κ°€μ •ν•΄ 락을 걸지 μ•Šκ³ , 버전 관리 κΈ°λŠ₯을 ν†΅ν•΄μ„œ νŠΈλžœμž­μ…˜ 격리성을 κ΄€λ¦¬ν•˜λŠ” 방식.

  • Version μ»¬λŸΌμ„ λ³„λ„λ‘œ μΆ”κ°€ν•΄μ„œ μΆ©λŒμ„ λ°©μ§€ν•©λ‹ˆλ‹€. Version 정보λ₯Ό μ‚¬μš©ν•˜λ©΄ 졜초 μ»€λ°‹λ§Œ 인정이 되고, Bulk InsertλŠ” 버전을 λ¬΄μ‹œν•˜κΈ° λ•Œλ¬Έμ— Bulk Insertμ—μ„œ 버전을 μ¦κ°€μ‹œν‚€λ €λ©΄ 버전 ν•„λ“œλ₯Ό κ°•μ œλ‘œ μ¦κ°€μ‹œμΌœμ•Ό ν•©λ‹ˆλ‹€.
  • DBκ°€ μ œκ³΅ν•˜λŠ” 락 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€ μ•Šκ³ , JPAκ°€ μ œκ³΅ν•˜λŠ” 버전 관리 κΈ°λŠ₯(Application Level의 Lock)을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • 컀밋 μ „κΉŒμ§€λŠ” μΆ©λŒμ„ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.
  • 좩돌이 λ‚˜λ©΄ λ‘€λ°± μ²˜λ¦¬λŠ” 개발자의 λͺ«μž…λ‹ˆλ‹€.

Why? 

데이터 μˆ˜μ • μ¦‰μ‹œ νŠΈλžœμž­μ…˜ μΆ©λŒμ„ κ°μ§€ν•˜κ³  둀백이 κ°€λŠ₯ν•˜λ―€λ‘œ μˆ˜μ •μ΄ λ§Žμ€ 경우 비관적 락을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

읽기 μž‘μ—…μ΄ λ§Žλ‹€λ©΄ JPA의 버전관리 κΈ°λŠ₯을 ν™œμš©ν•΄ κ°œλ°œν•˜λŠ” 것이 λ”μš± νŽΈλ¦¬ν•˜κΈ° λ•Œλ¬Έμ— 낙관적 락을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.


πŸ—£οΈ DB의 ꡐ착 μƒνƒœκ°€ λ¬΄μ—‡μž…λ‹ˆκΉŒ?

 

λ°μ΄ν„°λ² μ΄μŠ€μ˜ ꡐ착 μƒνƒœλŠ” ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ 처리 쀑인데 데이터에 λŒ€ν•΄ 락을 가지고 μžˆλŠ” μƒνƒœμ—μ„œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ 처리 쀑인 데이터에 λŒ€ν•΄ 락을 μš”μ²­ν•˜λ©΄μ„œ λ¬΄ν•œ λŒ€κΈ° μƒνƒœμ— λΉ μ§€λŠ” ν˜„μƒμž…λ‹ˆλ‹€. ꡐ착 μƒνƒœλ₯Ό ν•΄κ²°ν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ” 예방 기법과 νšŒν”Ό 기법이 μžˆμŠ΅λ‹ˆλ‹€. 예방 기법은 νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ν•˜κΈ° 전에 미리 락을 νšλ“ν•˜λŠ” 방식이고, νšŒν”Ό 기법은 νŠΈλžœμž­μ…˜μ΄ λ“€μ–΄μ˜¨ μˆœμ„œμ— 따라 락을 νšλ“ν•˜κ±°λ‚˜ νŠΈλžœμž­μ…˜μ„ μ’…λ£Œν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.


πŸ—£οΈ νŠΈλž™μž­μ…˜μ˜ 격리성을 μ•„μ‹œλ‚˜μš”?

 

λ™μ‹œμ— μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ 처리될 λ•Œ, νŠΈλžœμž­μ…˜λΌλ¦¬ μ–Όλ§ˆλ‚˜ μ„œλ‘œ κ³ λ¦½λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 것을 νŠΈλžœμž­μ…˜μ˜ 격리 μˆ˜μ€€μ΄λΌκ³  λ§ν•©λ‹ˆλ‹€.

κ°„λ‹¨νžˆ ν‘œν˜„ν•˜μžλ©΄, νŠΉμ • νŠΈλžœμž­μ…˜μ΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ— λ³€κ²½ν•œ 데이터λ₯Ό λ³Ό 수 μžˆλ„λ‘ ν—ˆμš©ν•  지 말지λ₯Ό κ²°μ •ν•˜λŠ” 것 μž…λ‹ˆλ‹€.

 

Read Uncommitted

  • λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μ»€λ°‹λ˜μ§€ μ•Šμ€ λ‚΄μš©μ— μ ‘κ·Ό κ°€λŠ₯ (Dirty Read)
  • 락 λ°œμƒ X

Read Committed

  • μ»€λ°‹λœ λ‚΄μš©λ§Œ μ ‘κ·Ό κ°€λŠ₯
  • ν•œ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ 검색 κ²°κ³Όκ°€ 비일관적인 ν˜„μƒ λ°œμƒ (Nonrepeatable read)
  • 락 λ°œμƒ X

Repeatable Read

  • 컀밋이 μ™„λ£Œλœ λ°μ΄ν„°λ§Œ 읽을 수 있으며, νŠΈλžœμž­μ…˜ λ²”μœ„ λ‚΄μ—μ„œ μ‘°νšŒν•œ λ‚΄μš©μ΄ 항상 동일함을 보μž₯
  • μΌμ •λ²”μœ„μ˜ λ ˆμ½”λ“œλ₯Ό λ‘λ²ˆ 이상 읽을 λ•Œ, 첫 번재 μΏΌλ¦¬μ—μ„œ μ—†λ˜ 유령 λ ˆμ½”λ“œκ°€ λ‘λ²ˆμ§Έ μΏΌλ¦¬μ—μ„œ λ‚˜νƒ€λ‚˜λŠ” ν˜„μƒμ„ Phantom read
  • 락 λ°œμƒ O

Serializable

  • ν•œ νŠΈλžœμž­μ…˜μ—μ„œ μ‚¬μš©ν•˜λŠ” λ°μ΄ν„°λŠ” λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ ‘κ·Ό λΆˆκ°€λŠ₯
  • 락 λ°œμƒ O

πŸ—£οΈ DB의 νŠΈλžœμž­μ…˜ μˆ˜ν–‰ 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ μ–΄λ–»κ²Œ μ²˜λ¦¬ν• κΉŒμš”?

 

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ νŠΈλžœμž­μ…˜ μˆ˜ν–‰ κ³Όμ • 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ ROLLBACK을 톡해 νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ν•˜κΈ° μ „ μƒνƒœλ‘œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 원볡해야 ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ²˜λ¦¬ν•˜λŠ” μ΄μœ λŠ” νŠΈλžœμž­μ…˜ μˆ˜ν–‰ κ²°κ³Όκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ— μ™„μ „νžˆ λ°˜μ˜λ˜κ±°λ‚˜ μ•„μ˜ˆ λ°˜μ˜λ˜μ§€ μ•Šμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

πŸ—£οΈ Commit, Rollback μ΄λž€ λ¬΄μ—‡μž…λ‹ˆκΉŒ?

 

Commit : νŠΈλžœμž­μ…˜μ΄ 성곡해 νŠΈλžœμž­μ…˜ κ²°κ³Όλ₯Ό 영ꡬ적으둜 λ°˜μ˜ν•˜λŠ” μ—°μ‚°μž…λ‹ˆλ‹€.

Rollback : νŠΈλžœμž­μ…˜μ˜ 싀행을 μ·¨μ†Œν–ˆμŒμ„ μ•Œλ¦¬λŠ” 연산이며, νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰ν•œ κ²°κ³Όλ₯Ό μ›λž˜μ˜ μƒνƒœ(νŠΈλžœμž­μ…˜ μ—°μ‚° μ΄μ „μ˜ μƒνƒœ)둜 원상 λ³΅κ·€μ‹œν‚€λŠ” 연산을 μ˜λ―Έν•©λ‹ˆλ‹€.


πŸ—£οΈ DBμ—μ„œ λ™μ‹œμ„± μ œμ–΄λž€ λ¬΄μ—‡μž…λ‹ˆκΉŒ?

 

DBMSλŠ” λ‹€μˆ˜μ˜ μ‚¬μš©μžλ₯Ό κ°€μ •ν•˜κΈ° λ•Œλ¬Έμ— 닀쀑 νŠΈλžœμž­μ…˜μ˜ μƒν˜Έ κ°„μ„­ μž‘μš© 쀑, DBλ₯Ό λ³΄ν˜Έν•΄μ•Ό ν•©λ‹ˆλ‹€. λ™μ‹œμ— μ—¬λŸ¬ 개의 νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰λ  λ•Œ, νŠΈλžœμž­μ…˜λ“€μ΄ DB의 일관성을 νŒŒκ΄΄ν•˜μ§€ μ•Šλ„λ‘ νŠΈλžœμž­μ…˜ κ°„μ˜ μƒν˜Έμž‘μš©μ„ μ œμ–΄ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

λ™μ‹œμ„± μ œμ–΄ κΈ°λ²•μ˜ μ’…λ₯˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

https://velog.io/@ha0kim/%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4


Reference

 

 https://junghn.tistory.com/entry/DB-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EC%99%80-%EB%84%8C%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EA%B0%9C%EB%85%90-%EC%B4%9D%EC%A0%95%EB%A6%AC

https://hoons-dev.tistory.com/93