github-blog.png


✍️ Today I Learned


1. DataBase & SQL




1-1. DataBase


λ°μ΄ν„°λ² μ΄μŠ€λŠ” IN-MEMORY, FILE I/O λ°©μ‹μ˜ ν•œκ³„μ™€ κ΄€λ¦¬ν•˜λŠ” λ°μ΄ν„°μ˜ 양이 λ°©λŒ€ν•΄μ§μ—λ”°λΌ 효율적이고 λ°μ΄ν„°μ˜ 무결성을 μ§€ν‚€κΈ° μœ„ν•΄ κ³ μ•ˆλœ 데이터에 νŠΉν™”λœ μ„œλ²„μ΄λ‹€.

μŠ€ν¬λ¦°μƒ·, 2021-10-13 16-50-13

이 λ°μ΄ν„°λ² μ΄μŠ€κ°€ ν™œμš©λ˜λŠ” κ΅¬μ‘°λŠ” μ΄μ „μ˜ β€œ2-TIER 아킀텍쳐”인 ν΄λΌμ΄μ–ΈνŠΈ/μ„œλ²„μ˜ κ΅¬μ‘°μ—μ„œ 더 λ‚˜μ•„κ°€, μ›Ή&μ•±μ—μ„œ μ·¨κΈ‰ν•˜λŠ” 데이터λ₯Ό λ”°λ‘œ 뢄리 ν•˜λŠ” β€œ3-TIER 아킀텍쳐”라 뢈리우며 λ³΄μ•ˆμ„±, λŒ€μš©λŸ‰ μ„œλΉ„μŠ€μ—μ„œμ˜ 강점을 μ§€λ‹μˆ˜ 있게 λ˜μ—ˆλ‹€.



1-2. SQL


  • ν•˜λ‚˜μ˜ 언어인 Structured Query Language (SQL) 은 λ°μ΄ν„°λ² μ΄μŠ€ μ–Έμ–΄λ‘œ, 주둜 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‚¬μš©ν•œλ‹€.

    예λ₯Ό λ“€μ–΄ MySQL, Oracle, SQLite, PostgreSQL λ“± λ‹€μ–‘ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ SQL ꡬ문을 μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ— 쿼리(Query) λ₯Ό 보내 μ›ν•˜λŠ” 데이터λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ μ‚½μž…ν•  수 μžˆλ‹€.

    sql

    SQL을 μ‚¬μš©ν•  수 μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ™€ 달리, λ°μ΄ν„°μ˜ ꡬ쑰가 κ³ μ •λ˜μ–΄ μžˆμ§€ μ•Šμ€ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό NoSQL이라고 ν•œλ‹€.

    κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ™€λŠ” 달리, ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  데이터λ₯Ό λ‹€λ₯Έ ν˜•νƒœλ‘œ μ €μž₯을 ν•œλ‹€. NoSQL의 λŒ€ν‘œμ μΈ μ˜ˆμ‹œλŠ” MongoDB 와 같은 λ¬Έμ„œ μ§€ν–₯ λ°μ΄ν„°λ² μ΄μŠ€κ°€ μžˆλ‹€.

  • SQL 문법은 링크λ₯Ό ν†΅ν•˜μ—¬ ν•™μŠ΅ν•˜μ˜€λ‹€.



1-3. ACID


ACID(μ›μžμ„±, 일관성, 고립성, 지속성) λŠ” λ°μ΄ν„°λ² μ΄μŠ€ νŠΈλžœμž­μ…˜ 이 μ•ˆμ „ν•˜κ²Œ μˆ˜ν–‰λœλ‹€λŠ” 것을 보μž₯ν•˜κΈ° μœ„ν•œ μ„±μ§ˆμ„ κ°€λ¦¬ν‚€λŠ” 약어이닀.

μ—¬κΈ°μ„œ νŠΈλžœμž­μ…˜μ΄λž€? λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ³€ν™˜μ‹œν‚€λŠ” 논리적 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ ν–‰ν•΄μ§€λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 쿼리λ₯Ό λͺ¨μ•„ 놓은 μž‘μ—…μ˜ λ‹¨μœ„ 이닀.

  1. μ›μžμ„±(Atomicity) 은 νŠΈλžœμž­μ…˜κ³Ό κ΄€λ ¨λœ μž‘μ—…λ“€μ΄ λΆ€λΆ„μ μœΌλ‘œ μ‹€ν–‰λ˜λ‹€κ°€ μ€‘λ‹¨λ˜μ§€ μ•ŠλŠ” 것을 보μž₯ν•˜λŠ” λŠ₯λ ₯이닀. 예λ₯Ό λ“€μ–΄, 자금 μ΄μ²΄λŠ” 성곡할 μˆ˜λ„ μ‹€νŒ¨ν•  μˆ˜λ„ μžˆμ§€λ§Œ λ³΄λ‚΄λŠ” μͺ½μ—μ„œ λˆμ„ λΉΌ μ˜€λŠ” μž‘μ—…λ§Œ μ„±κ³΅ν•˜κ³  λ°›λŠ” μͺ½μ— λˆμ„ λ„£λŠ” μž‘μ—…μ„ μ‹€νŒ¨ν•΄μ„œλŠ” μ•ˆλœλ‹€. μ›μžμ„±μ€ 이와 같이 쀑간 λ‹¨κ³„κΉŒμ§€ μ‹€ν–‰λ˜κ³  μ‹€νŒ¨ν•˜λŠ” 일이 없도둝 ν•˜λŠ” 것이닀.

  2. 일관성(Consistency) 은 νŠΈλžœμž­μ…˜μ΄ 싀행을 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œν•˜λ©΄ μ–Έμ œλ‚˜ 일관성 μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλ‘œ μœ μ§€ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 무결성 μ œμ•½μ΄ λͺ¨λ“  κ³„μ’ŒλŠ” μž”κ³ κ°€ μžˆμ–΄μ•Ό ν•œλ‹€λ©΄ 이λ₯Ό μœ„λ°˜ν•˜λŠ” νŠΈλžœμž­μ…˜μ€ μ€‘λ‹¨λœλ‹€.

  3. 독립성(Isolation) 은 νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ μ‹œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ μ—°μ‚° μž‘μ—…μ΄ 끼어듀지 λͺ»ν•˜λ„둝 보μž₯ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 이것은 νŠΈλžœμž­μ…˜ 밖에 μžˆλŠ” μ–΄λ–€ 연산도 쀑간 λ‹¨κ³„μ˜ 데이터λ₯Ό λ³Ό 수 μ—†μŒμ„ μ˜λ―Έν•œλ‹€. 은행 κ΄€λ¦¬μžλŠ” 이체 μž‘μ—…μ„ ν•˜λŠ” 도쀑에 쿼리λ₯Ό μ‹€ν–‰ν•˜λ”λΌλ„ νŠΉμ • κ³„μ’Œκ°„ μ΄μ²΄ν•˜λŠ” μ–‘ μͺ½μ„ λ³Ό 수 μ—†λ‹€. κ³΅μ‹μ μœΌλ‘œ 고립성은 νŠΈλžœμž­μ…˜ 싀행내역은 연속적이어야 함을 μ˜λ―Έν•œλ‹€. μ„±λŠ₯κ΄€λ ¨ 이유둜 인해 이 νŠΉμ„±μ€ κ°€μž₯ μœ μ—°μ„± μžˆλŠ” μ œμ•½ 쑰건이닀. μžμ„Έν•œ λ‚΄μš©μ€ κ΄€λ ¨ λ¬Έμ„œλ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•œλ‹€.

  4. 지속성(Durability) 은 μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λœ νŠΈλžœμž­μ…˜μ€ μ˜μ›νžˆ λ°˜μ˜λ˜μ–΄μ•Ό 함을 μ˜λ―Έν•œλ‹€. μ‹œμŠ€ν…œ 문제, DB 일관성 체크 등을 ν•˜λ”λΌλ„ μœ μ§€λ˜μ–΄μ•Ό 함을 μ˜λ―Έν•œλ‹€. μ „ν˜•μ μœΌλ‘œ λͺ¨λ“  νŠΈλžœμž­μ…˜μ€ 둜그둜 남고 μ‹œμŠ€ν…œ μž₯μ•  λ°œμƒ μ „ μƒνƒœλ‘œ 되돌릴 수 μžˆλ‹€. νŠΈλžœμž­μ…˜μ€ λ‘œκ·Έμ— λͺ¨λ“  것이 μ €μž₯된 ν›„μ—λ§Œ commit μƒνƒœλ‘œ 간주될 수 μžˆλ‹€.



2. Schema design




2-1. μŠ€ν‚€λ§ˆ(Schema)


  • μŠ€ν‚€λ§ˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ ꡬ쑰와 μ œμ•½ 쑰건에 κ΄€ν•œ μ „λ°˜μ μΈ λͺ…μ„Έλ₯Ό κΈ°μˆ ν•œ λ©”νƒ€λ°μ΄ν„°μ˜ 집합이닀.

  • μŠ€ν‚€λ§ˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό κ΅¬μ„±ν•˜λŠ” 데이터 개체(Entity), 속성(Attribute), 관계(Relationship) 및 데이터 μ‘°μž‘ μ‹œ 데이터 값듀이 κ°–λŠ” μ œμ•½ 쑰건 등에 κ΄€ν•΄ μ „λ°˜μ μœΌλ‘œ μ •μ˜ν•œλ‹€.

  • μŠ€ν‚€λ§ˆλŠ” μ‚¬μš©μžμ˜ 관점에 따라 μ™ΈλΆ€ μŠ€ν‚€λ§ˆ, κ°œλ… μŠ€ν‚€λ§ˆ, λ‚΄λΆ€ μŠ€ν‚€λ§ˆλ‘œ λ‚˜λˆ μ§„λ‹€.



2-2. Schema design (μΈμŠ€νƒ€κ·Έλž¨ 예제)


instagram

  1. κ²Œμ‹œλ¬Ό(Post) μž‘μ„± κΈ°λŠ₯ : μΈμŠ€νƒ€κ·Έλž¨μ—μ„œλŠ” μ—¬λŸ¬ 개의 사진(A)을 올릴 수 μžˆλ‹€. 사진을 μ—…λ‘œλ“œν•  λ•Œ, 사진을 μ„€λͺ…ν•˜λŠ” κ°„λ‹¨ν•œ κΈ€(C)이 μ˜¬λΌκ°„λ‹€.

  2. κ²Œμ‹œλ¬Όμ— λŒ“κΈ€ 달기 및 μ’‹μ•„μš” κΈ°λŠ₯ : κ²Œμ‹œλ¬Όμ΄ μ—…λ‘œλ“œλ˜λ©΄ λ‹€λ₯Έ μ‚¬μš©μžλŠ” 이 κ²Œμ‹œλ¬Όμ— λŒ“κΈ€(E)을 달 수 있고, μ’‹μ•„μš”(B) λ₯Ό 눌러 관심을 ν‘œν•  수 μžˆλ‹€.

  3. ν•΄μ‹œνƒœκ·Έ κΈ°λŠ₯ : κ²Œμ‹œλ¬Όμ— #감성 #λ§›μ§‘ λ“±μ˜ ν•΄μ‹œνƒœκ·Έ(D)λ₯Ό 남길 수 있으며, 이 ν•΄μ‹œνƒœκ·Έλ₯Ό λˆ„λ₯΄λ©΄ 이 ν•΄μ‹œνƒœκ·Έκ°€ μ‚¬μš©λœ λͺ¨λ“  κ²Œμ‹œλ¬Όμ„ ν•œ 데 λͺ¨μ•„ λ³Ό 수 μžˆλ‹€.

  4. follow κΈ°λŠ₯ : μΈμŠ€νƒ€κ·Έλž¨μ—μ„œ 친ꡬ κ΄€κ³„λŠ” νŒ”λ‘œμ›Œ(follower)와 νŒ”λ‘œμž‰(following)으둜 λ‚˜λ‰œλ‹€. 김코딩이 μ΅œν•΄μ»€λ₯Ό following ν•˜λ©΄, μ΅œν•΄μ»€μ˜ ν”Όλ“œκ°€ κΉ€μ½”λ”©μ˜ ν™ˆ 화면에 λ‚˜νƒ€λ‚œλ‹€. μ΅œν•΄μ»€μ˜ μž…μž₯μ—μ„œλŠ” 김코딩이 follower둜 μΆ”κ°€λœλ‹€.

  • ν•΄λ‹Ή λ‚΄μš©μ„ DB diagramμ—μ„œ μŠ€ν‚€λ§ˆ λ””μžμΈμ„ 해보면 λ‹€μŒ κ·Έλ¦Όκ³Ό κ°™λ‹€.

    μŠ€ν¬λ¦°μƒ·, 2021-10-13 22-21-03



3. κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€


  • κ΅¬μ‘°ν™”λœ λ°μ΄ν„°λŠ” ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”λ‘œ ν‘œν˜„ν•  수 μžˆλ‹€. 사전에 μ •μ˜λœ ν…Œμ΄λΈ”μ„ relation 이라고도 λΆ€λ₯΄κΈ° λ•Œλ¬Έμ—, ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(Relational database)라고 ν•œλ‹€.

  • κ΄€κ³„μ˜ μ’…λ₯˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

    • 1:1 관계 : ν•˜λ‚˜μ˜ λ ˆμ½”λ“œκ°€ λ‹€λ₯Έ ν…Œμ΄λΈ”μ˜ λ ˆμ½”λ“œ ν•œ κ°œμ™€ μ—°κ²°λœ 경우, κ·ΈλŸ¬λ‚˜ 1:1 κ΄€κ³„λŠ” 자주 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. 1:1둜 λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 관계라면 관계λ₯Ό 맺기보닀 직접 μ €μž₯ν•˜λŠ” 게 λ‚˜μ„ 수 μžˆλ‹€.

    • 1:N 관계 : ν•˜λ‚˜μ˜ λ ˆμ½”λ“œκ°€ μ„œλ‘œ λ‹€λ₯Έ μ—¬λŸ¬ 개의 λ ˆμ½”λ“œμ™€ μ—°κ²°λœ κ²½μš°μ΄λ‹€. 1:N(μΌλŒ€λ‹€) κ΄€κ³„λŠ” κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©ν•œλ‹€.

    • N:N 관계 : μ—¬λŸ¬ 개의 λ ˆμ½”λ“œκ°€ λ‹€λ₯Έ ν…Œμ΄λΈ”μ˜ μ—¬λŸ¬ 개의 λ ˆμ½”λ“œμ™€ 관계가 μžˆλŠ” κ²½μš°μ΄λ‹€. N:N(λ‹€λŒ€λ‹€) 관계λ₯Ό μœ„ν•΄ μŠ€ν‚€λ§ˆλ₯Ό λ””μžμΈν•  λ•Œμ—λŠ”, Join ν…Œμ΄λΈ”μ„ λ§Œλ“€μ–΄ κ΄€λ¦¬ν•΄μ•Όν•œλ‹€. 1:N(μΌλŒ€λ‹€) 관계와 λΉ„μŠ·ν•˜μ§€λ§Œ, μ–‘λ°©ν–₯μ—μ„œ λ‹€μˆ˜μ˜ λ ˆμ½”λ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

    • Self Referencing 관계 : λ•Œλ‘œλŠ” ν…Œμ΄λΈ” λ‚΄μ—μ„œλ„ 관계가 ν•„μš”ν•˜λ‹€. 예λ₯Ό λ“€μ–΄ μΆ”μ²œμΈμ΄ λˆ„κ΅¬μΈμ§€ νŒŒμ•…ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  수 μžˆλ‹€. 이 κ΄€κ³„λŠ” 1:N(μΌλŒ€λ‹€) 관계와 μœ μ‚¬ν•˜λ‹€κ³  생각할 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ 일반적으둜 1:N κ΄€κ³„λŠ” μ„œλ‘œ λ‹€λ₯Έ ν…Œμ΄λΈ”μ˜ 관계λ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ ν‘œν˜„ν•˜λŠ” 방법이닀.



4. Node.jsμ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©


  • .env ν™˜κ²½λ³€μˆ˜ νŒŒμΌμ„ ν†΅ν•˜μ—¬ dotenv νŒ¨ν‚€μ§€λ‘œ ν™˜κ²½λ³€μˆ˜λ₯Ό λ³€μˆ˜μ²˜λŸΌ 가져와 μ‚¬μš© ν•  수 μžˆμŒμ„ 이미 μš°λ¦¬λŠ” ν•™μŠ΅ν•˜μ˜€λ‹€.

    이λ₯Ό ν†΅ν•˜μ—¬Node.js ν™˜κ²½μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ—°κ²°ν•˜λŠ” 뢀뢄은 이미 μž‘μ„±λœ 예제λ₯Ό ν†΅ν•˜μ—¬ SQL μ‹€μŠ΅μ„ μ§„ν–‰ν•˜μ˜€λ‹€.

    μžμ„Έν•œ λ‚΄μš©μ€ 링크 μ°Έμ‘°.



πŸ€” Understanding

SQL μƒˆλ‘œμš΄ μ–Έμ–΄λ₯Ό λ°°μ› λ‹€. μš°μ„  첫 λŠλ‚Œμ€ 뭐지 μ‹Άμ—ˆλŠ”λ° 정말 μ—‘μ…€κ³Ό μœ μ‚¬ν•˜λ‹€β€¦? λŠλ‚Œμ΄λ‹€. μ—¬λŸ¬ 정보듀을 μ‹œνŠΈ(λ°μ΄ν„°λ² μ΄μŠ€)에 λ‹΄κ³  ν•„μš”ν•œ ν–‰κ³Ό 열에 μ €μž₯된 데이터 정보λ₯Ό ν•„ν„°λ‘œ μ›ν•˜λŠ”κ°’μ„ 좜λ ₯ν•˜λŠ” λŠλ‚Œμ„ λ°›μ•˜λ‹€.

μ‹€μ œλ‘œλ„ SQL Server에 λ‹΄κΈ΄ 정보λ₯Ό Excel 파일둜 내보낼 수 μžˆλŠ” κΈ°λŠ₯도 μžˆλ‹€λŠ” κ±Έ κ²€μƒ‰μœΌλ‘œ μ•Œκ²Œλ˜μ—ˆλ‹€. (μ•ˆμ¨λ΄€μ§€λ§Œ λͺΉμ‹œ μœ μš©ν•΄ 보인닀..)

μ—‘μ…€-SQL-Server-03

일단 문법도 μ‚¬λžŒμ΄ 읽기 쒋은 ν˜•νƒœμ˜ λ¬Έλ²•μ΄κΈ°λ•Œλ¬Έμ— 보고 쓰기에 μ–΄λ ΅μ§„ μ•Šμ§€λ§Œ, ν•™μŠ΅ν•  λ‚΄μš©μ΄ 쑰금 λ°©λŒ€ν•΄λ³΄μΈλ‹€.. μ‹€λ¬΄μ—μ„œλŠ” λ°μ΄ν„°λ² μ΄μŠ€λ§Œ λ”°λ‘œ κ΄€λ¦¬ν•˜λŠ” DB κ΄€λ¦¬μžκ°€ μžˆλ‹€λŠ” μ–˜κΈ°λ„ 얼핏 λ“€μ—ˆλ‹€.

아직 λ‹¨μˆœν•˜κ²Œ SQL을 μ¨μ„œ μ›ν•˜λŠ” 값을 μΆ”λ €λ‚΄λŠ” 정도뿐이닀. μ•žμœΌλ‘œ μ‹€μ œ 예제λ₯Ό ν†΅ν•΄μ„œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό ν™œμš©ν•˜λŠ” κ²½ν—˜μ΄ ν•„μš”ν•˜λ‹€.