λ°μ΄ν° 무결μ±μ μ΄μ μ λ§μΆ λ°μ΄ν°λ² μ΄μ€ ν μ€ν μ’ ν© κ°μ΄λ. λ°μ΄ν°λ² μ΄μ€ μμ€ν μ λ°μ΄ν° μ νμ±κ³Ό μΌκ΄μ±μ 보μ₯νκΈ° μν λ€μν μ νμ λ¬΄κ²°μ± μ μ½ μ‘°κ±΄, ν μ€ν κΈ°λ², λͺ¨λ² μ¬λ‘λ₯Ό λ€λ£Ήλλ€.
λ°μ΄ν°λ² μ΄μ€ ν μ€ν : μ λ’°μ± μλ μμ€ν μ μν λ°μ΄ν° λ¬΄κ²°μ± λ³΄μ₯
μ€λλ μ λ°μ΄ν° μ€μ¬ μΈκ³μμ λ°μ΄ν°λ² μ΄μ€λ μλ§μ μ ν리μΌμ΄μ κ³Ό μλΉμ€μ μ€μΆμ λλ€. κΈμ΅ κ±°λλΆν° μλ£ κΈ°λ‘, μ μ μκ±°λ νλ«νΌ, μμ λ―Έλμ΄ λ€νΈμν¬μ μ΄λ₯΄κΈ°κΉμ§ μ ννκ³ μΌκ΄λ λ°μ΄ν°λ λΉμ¦λμ€ μ΄μ, μμ¬ κ²°μ , κ·μ μ€μμ λ§€μ° μ€μν©λλ€. λ°λΌμ μ격ν λ°μ΄ν°λ² μ΄μ€ ν μ€ν μ λ°μ΄ν° 무결μ±, μ λ’°μ±, μ±λ₯μ 보μ₯νλ λ° κ°μ₯ μ€μν©λλ€.
λ°μ΄ν° 무결μ±μ΄λ 무μμΈκ°?
λ°μ΄ν° 무결μ±μ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λ λ°μ΄ν°μ μ νμ±, μΌκ΄μ±, μ ν¨μ±μ μλ―Έν©λλ€. μ΄λ λ°μ΄ν°κ° μ μ₯, μ²λ¦¬, κ²μ κ³Όμ μμ λ³κ²½λμ§ μκ³ λ―Έλ¦¬ μ μλ κ·μΉκ³Ό μ μ½ μ‘°κ±΄μ μ€μνλλ‘ λ³΄μ₯ν©λλ€. λ°μ΄ν° 무결μ±μ μ μ§νλ κ²μ μ λ’°ν μ μκ³ μμ‘΄ν μ μλ μμ€ν μ ꡬμΆνλ λ° νμμ μ λλ€. μ΄κ²μ΄ μλ€λ©΄ μ‘°μ§μ λΆμ νν μ 보μ κΈ°λ°ν μλͺ»λ κ²°μ μ λ΄λ¦¬κ³ , κ·μ λ²κΈμ λΆκ³Όλ°κ³ , κ³ κ° μ λ’°λ₯Ό μμ μνμ μ²νκ² λ©λλ€. μνμ΄ λ°μ΄ν° λ¬΄κ²°μ± κ²μ¬ λΆμ‘±μΌλ‘ μ¬κΈ° κ±°λλ₯Ό μ²λ¦¬νκ±°λ, λ³μμ΄ λΆμ νν νμ κΈ°λ‘ λλ¬Έμ μλͺ»λ μ½μ ν¬μ¬νλ μν©μ μμν΄ λ³΄μμμ€. κ·Έ κ²°κ³Όλ μ¬κ°ν μ μμ΅λλ€.
λ°μ΄ν° λ¬΄κ²°μ± ν μ€ν μ΄ μ€μν μ΄μ
λ°μ΄ν° 무결μ±μ μ΄μ μ λ§μΆ λ°μ΄ν°λ² μ΄μ€ ν μ€ν μ μ¬λ¬ κ°μ§ μ΄μ λ‘ λ§€μ° μ€μν©λλ€:
- μ νμ±: λ°μ΄ν°λ² μ΄μ€μ μ λ ₯λ λ°μ΄ν°κ° μ ννκ³ μ€λ₯κ° μλμ§ λ³΄μ₯ν©λλ€. μλ₯Ό λ€μ΄, κ³ κ°μ μ£Όμκ° μ°νΈλ²νΈμ μΌμΉνλμ§ λλ μ ν κ°κ²©μ΄ ν©λ¦¬μ μΈ λ²μ λ΄μ μλμ§ νμΈνλ κ²μ λλ€.
- μΌκ΄μ±: λ°μ΄ν°κ° μ¬λ¬ λ€λ₯Έ ν μ΄λΈκ³Ό λ°μ΄ν°λ² μ΄μ€ κ°μ μΌκ΄λκ² μ μ§λ¨μ 보μ₯ν©λλ€. CRM μμ€ν κ³Ό μ£Όλ¬Έ μ²λ¦¬ μμ€ν κ°μ κ³ κ° μ 보λ₯Ό λκΈ°νν΄μΌ νλ μλ리μ€λ₯Ό μκ°ν΄ 보μμμ€. ν μ€ν μ μ΄λ¬ν μμ€ν κ°μ μΌκ΄μ±μ 보μ₯ν©λλ€.
- μ ν¨μ±: λ°μ΄ν°κ° 미리 μ μλ κ·μΉκ³Ό μ μ½ μ‘°κ±΄μ μ€μνλμ§ νμΈν©λλ€. μ¬κΈ°μλ λ°μ΄ν° μ ν, νμ, λ²μκ° ν¬ν¨λ©λλ€. μλ₯Ό λ€μ΄, μ μνμΌλ‘ μ μλ νλμ ν μ€νΈκ° ν¬ν¨λμ΄μλ μ λλ©°, λ μ§ νλλ νΉμ λ μ§ νμ(YYYY-MM-DD)μ λ°λΌμΌ ν©λλ€.
- μ λ’°μ±: λ°μ΄ν°μ λν μ λ’°λ₯Ό ꡬμΆνμ¬ μ 보μ μ κ°ν μμ¬ κ²°μ μ κ°λ₯νκ² ν©λλ€. μ΄ν΄κ΄κ³μλ€μ΄ λ°μ΄ν°λ₯Ό μ λ’°ν λ, κ·Έλ€μ μ λ΅μ κ³ν λ° μ΄μ κ°μ μ μν΄ λ°μ΄ν°λ₯Ό μ¬μ©ν κ°λ₯μ±μ΄ λ λμ΅λλ€.
- κ·μ μ€μ: μ‘°μ§μ΄ λ―Όκ°ν λ°μ΄ν° 보νΈλ₯Ό μ무ννλ GDPR, HIPAA, PCI DSSμ κ°μ κ·μ μ건μ μΆ©μ‘±νλλ‘ λμ΅λλ€. μ΄λ¬ν κ·μ μ μ€μνμ§ μμΌλ©΄ λ§λν λ²κΈκ³Ό λ²μ μ²λ²μ λ°μ μ μμ΅λλ€.
λ°μ΄ν° λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ μ’ λ₯
λ°μ΄ν° 무결μ±μ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ κ·μΉμΈ λ€μν λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ ν΅ν΄ μνλ©λλ€. μ£Όμ μ νμ λ€μκ³Ό κ°μ΅λλ€:
- κ°μ²΄ 무결μ±: κ° ν
μ΄λΈμ κΈ°λ³Έ ν€κ° μκ³ , κΈ°λ³Έ ν€κ° κ³ μ νλ©° nullμ΄ μλμ 보μ₯ν©λλ€. μ΄λ μ€λ³΅λκ±°λ μλ³λμ§ μλ λ μ½λλ₯Ό λ°©μ§ν©λλ€. μλ₯Ό λ€μ΄,
customersν μ΄λΈμλcustomer_idλ₯Ό κΈ°λ³Έ ν€λ‘ κ°μ ΈμΌ νλ©°, κ° κ³ κ°μ κ³ μ νκ³ nullμ΄ μλ IDλ₯Ό κ°μ ΈμΌ ν©λλ€. - λλ©μΈ 무결μ±: ν
μ΄λΈμ κ° μ΄μ λν μ ν¨ν κ°μ λ²μλ₯Ό μ μν©λλ€. μ¬κΈ°μλ λ°μ΄ν° μ ν, νμ λ° νμ©λλ κ°μ΄ ν¬ν¨λ©λλ€. μλ₯Ό λ€μ΄,
genderμ΄μ('Male', 'Female', 'Other')μ λλ©μΈμ κ°μ§ μ μμΌλ©°, κ°λ₯ν κ°μ μ΄λ¬ν μ΅μ μΌλ‘ μ νν©λλ€. μ νλ²νΈ μ΄μ νΉμ νμ(μ: +[κ΅κ° μ½λ] [μ§μ λ²νΈ]-[λ²νΈ])μ κ°μ§ μ μμ΅λλ€. - μ°Έμ‘° 무결μ±: μΈλ ν€λ₯Ό μ¬μ©νμ¬ κ΄λ ¨ ν
μ΄λΈ κ°μ μΌκ΄μ±μ μ μ§ν©λλ€. ν ν
μ΄λΈμ μΈλ ν€λ λ€λ₯Έ ν
μ΄λΈμ κΈ°λ³Έ ν€λ₯Ό μ°Έμ‘°νμ¬ ν
μ΄λΈ κ°μ κ΄κ³κ° μ ν¨νλλ‘ λ³΄μ₯ν©λλ€. μλ₯Ό λ€μ΄,
ordersν μ΄λΈμλcustomersν μ΄λΈμcustomer_idλ₯Ό μ°Έμ‘°νλ μΈλ ν€κ° μμ μ μμΌλ©°, λͺ¨λ μ£Όλ¬Έμ΄ μ ν¨ν κ³ κ°κ³Ό μ°κ²°λλλ‘ ν©λλ€. μ°Έμ‘° λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ κ΄λ ¨ ν μ΄λΈμ μ λ°μ΄νΈ λ° μμ λ₯Ό μ²λ¦¬νλ λ°μλ μ€μνλ©°, μ’ μ’ CASCADE λλ RESTRICT κ·μΉμ ν¬ν¨ν©λλ€. - μ¬μ©μ μ μ 무결μ±: νΉμ μ ν리μΌμ΄μ μ΄λ λΉμ¦λμ€ μꡬ μ¬νμ νΉνλ μ¬μ©μ μ§μ κ·μΉμ μ μ©ν©λλ€. μ΄λ¬ν κ·μΉμ μ μ₯ νλ‘μμ , νΈλ¦¬κ±° λλ μ ν리μΌμ΄μ λ΄μ μ ν¨μ± κ²μ¬ κ·μΉμ μ¬μ©νμ¬ κ΅¬νν μ μμ΅λλ€. μλ₯Ό λ€μ΄, ν μΈμ¨μ΄ 50%λ₯Ό μ΄κ³Όν μ μκ±°λ, μ§μμ κΈμ¬κ° μ§μμ κ²½λ ₯μ λ°λΌ νΉμ λ²μ λ΄μ μμ΄μΌ νλ€λ κ·μΉμ΄ μμ μ μμ΅λλ€.
λ°μ΄ν° 무결μ±μ μν λ°μ΄ν°λ² μ΄μ€ ν μ€ν κΈ°λ²
λ°μ΄ν° 무결μ±μ 보μ₯νκΈ° μν΄ μ¬λ¬ ν μ€ν κΈ°λ²μ μ¬μ©ν μ μμ΅λλ€. μ΄λ¬ν κΈ°λ²μ λ°μ΄ν°μ λ€μν μΈ‘λ©΄μ κ²μ¦νκ³ λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ΄ μ¬λ°λ₯΄κ² μνλλμ§ νμΈνλ λ° μ€μ μ λ‘λλ€. μ΄ κΈ°λ²λ€μ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€(PostgreSQL, MySQL, Oracle λ±)λ₯Ό μ¬μ©νλ NoSQL λ°μ΄ν°λ² μ΄μ€(MongoDB, Cassandra λ±)λ₯Ό μ¬μ©νλ λμΌνκ² μ μ©λμ§λ§, ꡬ체μ μΈ κ΅¬ν λ°©μμ λ€λ₯Ό μ μμ΅λλ€.
1. λ°μ΄ν° μ ν λ° νμ κ²μ¦
μ΄ κΈ°λ²μ κ° μ΄μ΄ μ¬λ°λ₯Έ λ°μ΄ν° μ νκ³Ό νμμ ν¬ν¨νκ³ μλμ§ νμΈνλ κ²μ ν¬ν¨ν©λλ€. λ°μ΄ν°κ° μ μλ λλ©μΈ λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ μ€μνλμ§ λ³΄μ₯ν©λλ€. μΌλ°μ μΈ ν μ€νΈλ λ€μκ³Ό κ°μ΅λλ€:
- λ°μ΄ν° μ ν κ²μ¬: μ΄μ΄ μμ λ°μ΄ν° μ ν(μ: μ μ, λ¬Έμμ΄, λ μ§)μ ν¬ν¨νλμ§ νμΈν©λλ€.
- νμ κ²μ¬: λ°μ΄ν°κ° νΉμ νμ(μ: λ μ§ νμ, μ΄λ©μΌ νμ, μ νλ²νΈ νμ)μ μ€μνλμ§ νμΈν©λλ€.
- λ²μ κ²μ¬: κ°μ΄ νμ© κ°λ₯ν λ²μ λ΄μ μλμ§ νμΈν©λλ€(μ: λμ΄λ 18μΈμμ 65μΈ μ¬μ΄, κ°κ²©μ 0λ³΄λ€ νΌ).
- κΈΈμ΄ κ²μ¬: λ¬Έμμ΄μ΄ νμ©λ μ΅λ κΈΈμ΄λ₯Ό μ΄κ³Όνμ§ μλμ§ νμΈν©λλ€.
μμ: products ν
μ΄λΈμ price μ΄μ΄ μμ§μλ‘ μ μλμ΄ μλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. λ°μ΄ν° μ ν κ²μ¦ ν
μ€νΈλ μ΄ μ΄μ μμ§μ κ°λ§ μ μ₯λλλ‘ λ³΄μ₯ν©λλ€. λ²μ κ²μ¬λ κ°κ²©μ΄ νμ 0λ³΄λ€ ν°μ§ νμΈν©λλ€. νμ κ²μ¬λ μ ν μ½λκ° νΉμ ν¨ν΄(μ: PRD-XXXX, μ¬κΈ°μ XXXXλ λ€ μ리 μ«μ)μ λ°λ₯΄λμ§ κ²μ¦νλ λ° μ¬μ©λ μ μμ΅λλ€.
μ½λ μμ (SQL):
-- price μ΄μμ μ ν¨νμ§ μμ λ°μ΄ν° μ ν νμΈ
SELECT * FROM products WHERE price NOT LIKE '%.%' AND price NOT LIKE '%[0-9]%';
-- νμ© λ²μλ₯Ό λ²μ΄λ κ°κ²© νμΈ
SELECT * FROM products WHERE price <= 0;
-- μ ν¨νμ§ μμ μ ν μ½λ νμ νμΈ
SELECT * FROM products WHERE product_code NOT LIKE 'PRD-[0-9][0-9][0-9][0-9]';
2. Null κ° κ²μ¬
μ΄ κΈ°λ²μ nullμ΄ νμ©λμ§ μλ μ΄μ null κ°μ΄ ν¬ν¨λμ§ μμλμ§ νμΈν©λλ€. κ°μ²΄ λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ΄ μνλλλ‘ λ³΄μ₯ν©λλ€. Null κ° κ²μ¬λ κΈ°λ³Έ ν€μ μΈλ ν€μ λ§€μ° μ€μν©λλ€. λλ½λ κΈ°λ³Έ ν€λ κ°μ²΄ 무결μ±μ μλ°νλ©°, λλ½λ μΈλ ν€λ μ°Έμ‘° 무결μ±μ κΉ¨λ¨λ¦΄ μ μμ΅λλ€.
μμ: customers ν
μ΄λΈμμ customer_id(κΈ°λ³Έ ν€)λ μ λ nullμ΄μ΄μλ μ λ©λλ€. Null κ° κ²μ¬λ customer_idκ° λλ½λ λͺ¨λ λ μ½λλ₯Ό μλ³ν©λλ€.
μ½λ μμ (SQL):
-- customer_id μ΄μ null κ° νμΈ
SELECT * FROM customers WHERE customer_id IS NULL;
3. κ³ μ μ± κ²μ¬
μ΄ κΈ°λ²μ κ³ μ νκ² μ μλ μ΄μ μ€λ³΅λ κ°μ΄ ν¬ν¨λμ§ μλλ‘ λ³΄μ₯ν©λλ€. κ°μ²΄ 무결μ±μ μννκ³ λ°μ΄ν° μ€λ³΅μ λ°©μ§ν©λλ€. κ³ μ μ± κ²μ¬λ κΈ°λ³Έ ν€, μ΄λ©μΌ μ£Όμ, μ¬μ©μ μ΄λ¦μ νΉν μ€μν©λλ€.
μμ: users ν
μ΄λΈμμ username μ΄μ κ³ μ ν΄μΌ ν©λλ€. κ³ μ μ± κ²μ¬λ μ€λ³΅λ μ¬μ©μ μ΄λ¦μ κ°μ§ λͺ¨λ λ μ½λλ₯Ό μλ³ν©λλ€.
μ½λ μμ (SQL):
-- μ€λ³΅λ μ¬μ©μ μ΄λ¦ νμΈ
SELECT username, COUNT(*) FROM users GROUP BY username HAVING COUNT(*) > 1;
4. μ°Έμ‘° λ¬΄κ²°μ± κ²μ¬
μ΄ κΈ°λ²μ ν ν μ΄λΈμ μΈλ ν€κ° λ€λ₯Έ ν μ΄λΈμ κΈ°λ³Έ ν€λ₯Ό μ¬λ°λ₯΄κ² μ°Έμ‘°νλμ§ κ²μ¦ν©λλ€. ν μ΄λΈ κ°μ κ΄κ³κ° μ ν¨νκ³ μΌκ΄μ±μ΄ μλλ‘ λ³΄μ₯ν©λλ€. μ°Έμ‘° λ¬΄κ²°μ± κ²μ¬λ λ€μμ νμΈνλ κ²μ ν¬ν¨ν©λλ€:
- μΈλ ν€κ° μ°Έμ‘°λ ν μ΄λΈμ μ‘΄μ¬ν©λλ€.
- μΈλ ν€κ° κ³ μκ° μλλλ€(μ¦, μ‘΄μ¬νμ§ μλ κΈ°λ³Έ ν€λ₯Ό μ°Έμ‘°νμ§ μμ΅λλ€).
- λΆλͺ¨ ν μ΄λΈμ μ λ°μ΄νΈ λ° μμ κ° μμ ν μ΄λΈμ μ¬λ°λ₯΄κ² μ νλ©λλ€(CASCADE, SET NULL λλ RESTRICTμ κ°μ΄ μ μλ μ°Έμ‘° λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ λ°λΌ).
μμ: orders ν
μ΄λΈμλ customers ν
μ΄λΈμ μ°Έμ‘°νλ customer_id μΈλ ν€κ° μμ΅λλ€. μ°Έμ‘° λ¬΄κ²°μ± κ²μ¬λ orders ν
μ΄λΈμ λͺ¨λ customer_idκ° customers ν
μ΄λΈμ μ‘΄μ¬νλμ§ νμΈν©λλ€. λν customers ν
μ΄λΈμμ κ³ κ°μ΄ μμ λμμ λμ λμ(μ: μ μλ μ μ½ μ‘°κ±΄μ λ°λΌ κ΄λ ¨ μ£Όλ¬Έμ΄ μμ λκ±°λ nullλ‘ μ€μ λλμ§ μ¬λΆ)μ ν
μ€νΈν©λλ€.
μ½λ μμ (SQL):
-- orders ν
μ΄λΈμ κ³ μ μΈλ ν€ νμΈ
SELECT * FROM orders WHERE customer_id NOT IN (SELECT customer_id FROM customers);
-- CASCADE μμ ν
μ€νΈ μμ:
-- 1. κ³ κ°κ³Ό ν΄λΉ κ³ κ°κ³Ό κ΄λ ¨λ μ£Όλ¬Έμ μ½μ
-- 2. κ³ κ°μ μμ
-- 3. μ£Όλ¬Έλ μμ λμλμ§ νμΈ
-- SET NULL ν
μ€νΈ μμ:
-- 1. κ³ κ°κ³Ό ν΄λΉ κ³ κ°κ³Ό κ΄λ ¨λ μ£Όλ¬Έμ μ½μ
-- 2. κ³ κ°μ μμ
-- 3. μ£Όλ¬Έμ customer_idκ° NULLλ‘ μ€μ λμλμ§ νμΈ
5. λΉμ¦λμ€ κ·μΉ κ²μ¦
μ΄ κΈ°λ²μ λ°μ΄ν°λ² μ΄μ€κ° νΉμ λΉμ¦λμ€ κ·μΉμ μ€μνλμ§ νμΈν©λλ€. μ΄λ¬ν κ·μΉμ 볡μ‘ν μ μμΌλ©° κ²μ¦μ μν΄ μ¬μ©μ μ§μ λ‘μ§μ΄ νμν μ μμ΅λλ€. λΉμ¦λμ€ κ·μΉ κ²μ¦μ μ’ μ’ μ μ₯ νλ‘μμ , νΈλ¦¬κ±° λλ μ ν리μΌμ΄μ μμ€μ μ ν¨μ± κ²μ¬λ₯Ό μ¬μ©ν©λλ€. μ΄λ¬ν ν μ€νΈλ λ°μ΄ν°λ² μ΄μ€κ° μ‘°μ§μ λΉμ¦λμ€ λ‘μ§κ³Ό μ μ± μ μ ννκ² λ°μνλλ‘ λ³΄μ₯νλ λ° μ€μν©λλ€. λΉμ¦λμ€ κ·μΉμ ν μΈ κ³μ°, μ¬κ³ κ΄λ¦¬, μ μ© νλ μν λ± κ΄λ²μν μλ리μ€λ₯Ό λ€λ£° μ μμ΅λλ€.
μμ: κ³ κ°μ μ μ© νλκ° μνκ· μ§μΆμ 10λ°°λ₯Ό μ΄κ³Όν μ μλ€λ λΉμ¦λμ€ κ·μΉμ΄ μμ μ μμ΅λλ€. λΉμ¦λμ€ κ·μΉ κ²μ¦ ν μ€νΈλ κ³ κ°μ μ μ© νλλ₯Ό μ λ°μ΄νΈν λ μ΄ κ·μΉμ΄ μνλλμ§ νμΈν©λλ€.
μ½λ μμ (SQL - μ μ₯ νλ‘μμ ):
CREATE PROCEDURE ValidateCreditLimit
@CustomerID INT,
@NewCreditLimit DECIMAL
AS
BEGIN
-- κ³ κ°μ μνκ· μ§μΆμ‘ κ°μ Έμ€κΈ°
DECLARE @AvgMonthlySpending DECIMAL;
SELECT @AvgMonthlySpending = AVG(OrderTotal)
FROM Orders
WHERE CustomerID = @CustomerID
AND OrderDate >= DATEADD(month, -12, GETDATE()); -- μ§λ 12κ°μ
-- μ μ μ© νλκ° μνκ· μ§μΆμ‘μ 10λ°°λ₯Ό μ΄κ³Όνλμ§ νμΈ
IF @NewCreditLimit > (@AvgMonthlySpending * 10)
BEGIN
-- κ·μΉμ΄ μλ°λλ©΄ μ€λ₯ λ°μ
RAISERROR('μ μ© νλκ° νμ© νλλ₯Ό μ΄κ³Όν©λλ€.', 16, 1);
RETURN;
END
-- κ·μΉμ΄ μΆ©μ‘±λλ©΄ μ μ© νλ μ
λ°μ΄νΈ
UPDATE Customers SET CreditLimit = @NewCreditLimit WHERE CustomerID = @CustomerID;
END;
6. λ°μ΄ν° λ³ν ν μ€ν
μ΄ κΈ°λ²μ ETL(μΆμΆ, λ³ν, μ μ¬) νλ‘μΈμ€μ κ°μ λ°μ΄ν° λ³ν ν μ€ν μ μ€μ μ λ‘λλ€. ETL νλ‘μΈμ€λ νλ μ΄μμ μμ€ μμ€ν μμ λ°μ΄ν° μ¨μ΄νμ°μ€ λλ λ€λ₯Έ λμ μμ€ν μΌλ‘ λ°μ΄ν°λ₯Ό μ΄λμν΅λλ€. λ°μ΄ν° λ³ν ν μ€ν μ λ°μ΄ν°κ° μ¬λ°λ₯΄κ² μΆμΆ, λ³ν, λ‘λλκ³ νλ‘μΈμ€ μ λ°μ κ±Έμ³ λ°μ΄ν° 무결μ±μ΄ μ μ§λλμ§ νμΈν©λλ€. λ°μ΄ν° λ³ν ν μ€ν μ μ£Όμ μΈ‘λ©΄μ λ€μκ³Ό κ°μ΅λλ€:
- λ°μ΄ν° μμ μ±: μμ€ μμ€ν μ λͺ¨λ λ°μ΄ν°κ° μΆμΆλμ΄ λμ μμ€ν μ λ‘λλμλμ§ νμΈν©λλ€.
- λ°μ΄ν° μ νμ±: μ μλ λ³ν κ·μΉμ λ°λΌ λ°μ΄ν°κ° μ¬λ°λ₯΄κ² λ³νλμλμ§ νμΈν©λλ€.
- λ°μ΄ν° μΌκ΄μ±: μμ€μ λμ μμ€ν κ°μ μΌκ΄μ±μ μ μ§ν©λλ€. νΉν λ°μ΄ν°κ° μ§κ³λκ±°λ μμ½λ λ μ€μν©λλ€.
- λ°μ΄ν° νμ§: λμ μμ€ν μ λ°μ΄ν°κ° λ°μ΄ν° μ ν, νμ λ° λ²μμ κ°μ νμ νμ§ νμ€μ μΆ©μ‘±νλμ§ νμΈν©λλ€.
μμ: ETL νλ‘μΈμ€λ μ¬λ¬ μ§μ λ°μ΄ν°λ² μ΄μ€μμ νλ§€ λ°μ΄ν°λ₯Ό μΆμΆνκ³ , λ°μ΄ν°λ₯Ό κ³΅ν΅ νμμΌλ‘ λ³νν λ€μ μ€μ λ°μ΄ν° μ¨μ΄νμ°μ€μ λ‘λν μ μμ΅λλ€. λ°μ΄ν° λ³ν ν μ€ν μ λͺ¨λ νλ§€ λ°μ΄ν°κ° μΆμΆλμλμ§, λ°μ΄ν°κ° μ¬λ°λ₯΄κ² λ³νλμλμ§(μ: ν΅ν λ³ν, λ¨μ λ³ν), κ·Έλ¦¬κ³ λ°μ΄ν°κ° μ€λ₯λ λ°μ΄ν° μμ€ μμ΄ λ°μ΄ν° μ¨μ΄νμ°μ€μ λ‘λλμλμ§ νμΈν©λλ€.
7. λ°μ΄ν° λ§μ€νΉ λ° μ΅λͺ ν ν μ€ν
μ΄ κΈ°λ²μ λ―Όκ°ν λ°μ΄ν°κ° κ°μΈ μ 보 보νΈλ₯Ό μν΄ κ·Έλ¦¬κ³ GDPRκ³Ό κ°μ λ°μ΄ν° λ³΄νΈ κ·μ μ μ€μνκΈ° μν΄ μ μ νκ² λ§μ€νΉλκ±°λ μ΅λͺ νλμλμ§ νμΈν©λλ€. λ°μ΄ν° λ§μ€νΉ λ° μ΅λͺ ν ν μ€ν μ λ€μμ νμΈνλ κ²μ ν¬ν¨ν©λλ€:
- λ―Όκ°ν λ°μ΄ν°κ° λ―Όκ°νμ§ μμ λ°μ΄ν°λ‘ λ체λμλμ§(μ: μ€λͺ μ κ°λͺ μΌλ‘ λ°κΎΈκΈ°, μ μ© μΉ΄λ λ²νΈ κ°λ¦¬κΈ°).
- λ§μ€νΉ λ° μ΅λͺ ν κΈ°λ²μ΄ κ°μΈμ νλΌμ΄λ²μλ₯Ό 보νΈνλ λ° ν¨κ³Όμ μΈμ§.
- λ§μ€νΉλκ³ μ΅λͺ νλ λ°μ΄ν°κ° κ°μΈ μ 보λ₯Ό μΉ¨ν΄νμ§ μμΌλ©΄μ μλλ λͺ©μ (μ: λΆμ, λ³΄κ³ )μ μ¬μ ν μ¬μ©λ μ μλμ§.
μμ: μλ£ μ ν리μΌμ΄μ μμ νμ μ΄λ¦κ³Ό μ£Όμλ μ°κ΅¬ λͺ©μ μΌλ‘ μ¬μ©λκΈ° μ μ λ§μ€νΉλκ±°λ μ΅λͺ νλ μ μμ΅λλ€. λ°μ΄ν° λ§μ€νΉ λ° μ΅λͺ ν ν μ€ν μ λ§μ€νΉ κΈ°λ²μ΄ νμ νλΌμ΄λ²μλ₯Ό 보νΈνλ λ° ν¨κ³Όμ μΈμ§, κ·Έλ¦¬κ³ μ΅λͺ νλ λ°μ΄ν°κ° κ°μΈμ μ μμ λλ¬λ΄μ§ μκ³ ν΅κ³ λΆμμ μ¬μ©λ μ μλμ§ νμΈν©λλ€.
λ°μ΄ν° λ¬΄κ²°μ± ν μ€ν μ μν λͺ¨λ² μ¬λ‘
λ°μ΄ν° 무결μ±μ ν¨κ³Όμ μΌλ‘ 보μ₯νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμμμ€:
- λͺ νν λ°μ΄ν° λ¬΄κ²°μ± μꡬ μ¬ν μ μ: λ°μ΄ν°λ² μ΄μ€μ κ° ν μ΄λΈκ³Ό μ΄μ λν λ°μ΄ν° λ¬΄κ²°μ± μꡬ μ¬νμ λͺ ννκ² μ μνμμμ€. μ¬κΈ°μλ λ°μ΄ν° μ ν, νμ, λ²μ, κ³ μ μ± μ μ½ μ‘°κ±΄ λ° μ°Έμ‘° λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ μ μνλ κ²μ΄ ν¬ν¨λ©λλ€. μ΄λ¬ν μꡬ μ¬νμ λ¬Έμννλ©΄ ν μ€ν°κ° λ°μ΄ν°λ² μ΄μ€μ μμ λμμ μ΄ν΄νκ³ μ μ ν ν μ€νΈ μΌμ΄μ€λ₯Ό μ€κ³νλ λ° λμμ΄ λ©λλ€.
- ν μ€νΈ λ°μ΄ν° κ΄λ¦¬ μ λ΅ μ¬μ©: ν μ€νΈ λ°μ΄ν°κ° νμ€μ μ΄κ³ μΌκ΄λλ©° νλ‘λμ λ°μ΄ν°λ₯Ό λννλλ‘ λ³΄μ₯νκΈ° μν ν μ€νΈ λ°μ΄ν° κ΄λ¦¬ μ λ΅μ κ°λ°νμμμ€. μ¬κΈ°μλ κΈμ μ λ° λΆμ μ ν μ€νΈ μΌμ΄μ€λ₯Ό ν¬ν¨ν κ΄λ²μν μλ리μ€λ₯Ό ν¬κ΄νλ ν μ€νΈ λ°μ΄ν°λ₯Ό μμ±νλ κ²μ΄ ν¬ν¨λ©λλ€. ν μ€νΈ νκ²½μμ λ―Όκ°ν λ°μ΄ν°λ₯Ό 보νΈνκΈ° μν΄ λ°μ΄ν° λ§μ€νΉ κΈ°λ²μ μ¬μ©νλ κ²μ κ³ λ €νμμμ€.
- λ°μ΄ν° λ¬΄κ²°μ± ν μ€νΈ μλν: λ°μ΄ν° λ¬΄κ²°μ± ν μ€νΈλ₯Ό μλννμ¬ μΌκ΄λκ³ ν¨μ¨μ μΌλ‘ μ€νλλλ‘ νμμμ€. ν μ€νΈ νλ μμν¬μ λꡬλ₯Ό μ¬μ©νμ¬ SQL 쿼리, μ μ₯ νλ‘μμ λ° κΈ°ν λ°μ΄ν°λ² μ΄μ€ μμ μ μ€νμ μλννμμμ€. μλνλ μΈμ μ€λ₯μ μνμ μ€μ΄κ³ λ°μ΄ν° 무결μ±μ΄ μ§μμ μΌλ‘ λͺ¨λν°λ§λλλ‘ λ³΄μ₯ν©λλ€.
- μ κΈ°μ μΈ λ°μ΄ν° κ°μ¬ μν: μ κΈ°μ μΈ λ°μ΄ν° κ°μ¬λ₯Ό μ€μνμ¬ λ°μ΄ν° λ¬΄κ²°μ± λ¬Έμ λ₯Ό μλ³νκ³ μμ νμμμ€. λ°μ΄ν° κ°μ¬μλ λ°μ΄ν° νμ§ μ§ν κ²ν , λ°μ΄ν° μ΄μ μ§ν μλ³, λ°μ΄ν° λ¬΄κ²°μ± λ¬Έμ μ κ·Όλ³Έ μμΈ μ‘°μ¬κ° ν¬ν¨λ©λλ€. μ κΈ°μ μΈ λ°μ΄ν° κ°μ¬λ λ°μ΄ν°λ² μ΄μ€μ μ λ°μ μΈ μνμ μ λ’°μ±μ μ μ§νλ λ° λμμ΄ λ©λλ€.
- λ°μ΄ν° κ±°λ²λμ€ μ μ± κ΅¬ν: λ°μ΄ν° νμ§ λ° λ°μ΄ν° λ¬΄κ²°μ± κ΄λ¦¬λ₯Ό μν μν , μ± μ λ° νλ‘μΈμ€λ₯Ό μ μνλ λ°μ΄ν° κ±°λ²λμ€ μ μ± μ μ립νμμμ€. λ°μ΄ν° κ±°λ²λμ€ μ μ± μ λ°μ΄ν° μ λ ₯ μ ν¨μ± κ²μ¬, λ°μ΄ν° λ³ν, λ°μ΄ν° μ μ₯ λ° λ°μ΄ν° μ‘μΈμ€μ κ°μ μΈ‘λ©΄μ λ€λ£¨μ΄μΌ ν©λλ€. κ°λ ₯ν λ°μ΄ν° κ±°λ²λμ€ μ μ± μ ꡬννλ©΄ λ°μ΄ν°κ° μΌκ΄λκ² κ΄λ¦¬λκ³ λ°μ΄ν° μλͺ μ£ΌκΈ° μ λ°μ κ±Έμ³ λ°μ΄ν° 무결μ±μ΄ μ μ§λλλ‘ λ³΄μ₯ν μ μμ΅λλ€.
- λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§μ λ²μ κ΄λ¦¬ μ¬μ©: λ²μ κ΄λ¦¬ μμ€ν μ μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ λ³κ²½μ κ΄λ¦¬νλ κ²μ μΌκ΄μ±κ³Ό μΆμ κ°λ₯μ±μ μ μ§νλ λ° μ€μν©λλ€. Liquibase λλ Flywayμ κ°μ λꡬλ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ λ§μ΄κ·Έλ μ΄μ μ μλννκ³ λ³κ²½ μ¬νμ΄ ν΅μ λ λ°©μμΌλ‘ μ μ©λλλ‘ λ³΄μ₯νλ λ° λμμ΄ λ μ μμ΅λλ€. μ€ν€λ§ λ³κ²½μ μΆμ ν¨μΌλ‘μ¨ μ€ν€λ§ μμ μΌλ‘ μΈν΄ λ°μν μ μλ λ°μ΄ν° λ¬΄κ²°μ± λ¬Έμ λ₯Ό λ μ½κ² μλ³νκ³ ν΄κ²°ν μ μμ΅λλ€.
- λ°μ΄ν°λ² μ΄μ€ λ‘κ·Έ λͺ¨λν°λ§: λ°μ΄ν°λ² μ΄μ€ λ‘κ·Έμμ λ°μ΄ν° 무결μ±κ³Ό κ΄λ ¨λ μ€λ₯λ κ²½κ³ κ° μλμ§ μ§μμ μΌλ‘ λͺ¨λν°λ§νμμμ€. λ°μ΄ν°λ² μ΄μ€ λ‘κ·Έλ μ μ½ μ‘°κ±΄ μλ°, λ°μ΄ν° μ ν λ³ν μ€λ₯, μ°Έμ‘° λ¬΄κ²°μ± μ€ν¨μ κ°μ λ°μ΄ν° λ¬΄κ²°μ± λ¬Έμ μ λν κ·μ€ν ν΅μ°°λ ₯μ μ 곡ν μ μμ΅λλ€. λ°μ΄ν°λ² μ΄μ€ λ‘κ·Έλ₯Ό λͺ¨λν°λ§ν¨μΌλ‘μ¨ λΉμ¦λμ€ μ΄μμ μν₯μ λ―ΈμΉκΈ° μ μ λ°μ΄ν° λ¬΄κ²°μ± λ¬Έμ λ₯Ό μ¬μ μ μλ³νκ³ ν΄κ²°ν μ μμ΅λλ€.
- CI/CD νμ΄νλΌμΈμ ν μ€ν ν΅ν©: λ°μ΄ν° λ¬΄κ²°μ± ν μ€ν μ μ§μμ μΈ ν΅ν© λ° μ§μμ μΈ μ λ¬(CI/CD) νμ΄νλΌμΈμ ν΅ν©νμμμ€. μ΄λ κ² νλ©΄ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§λ μ ν리μΌμ΄μ μ½λμ λ³κ²½μ΄ μμ λλ§λ€ λ°μ΄ν° λ¬΄κ²°μ± ν μ€νΈκ° μλμΌλ‘ μ€νλ©λλ€. CI/CD νμ΄νλΌμΈμ ν μ€ν μ ν΅ν©ν¨μΌλ‘μ¨ κ°λ° μλͺ μ£ΌκΈ° μ΄κΈ°μ λ°μ΄ν° λ¬΄κ²°μ± λ¬Έμ λ₯Ό λ°κ²¬νκ³ νλ‘λμ μΌλ‘ μ νλλ κ²μ λ°©μ§ν μ μμ΅λλ€.
- μ μ₯ νλ‘μμ μμ μ΄μ€μ μ¬μ©: μ μ₯ νλ‘μμ λ΄μμ μ΄μ€μ μ μ¬μ©νμ¬ λ°νμμ λ°μ΄ν° 무결μ±μ κ²μ¦νμμμ€. μ΄μ€μ μ null κ°, κ³ μ μ μ½ μ‘°κ±΄ λ° μ°Έμ‘° λ¬΄κ²°μ± μλ°κ³Ό κ°μ 쑰건μ νμΈνλ λ° μ¬μ©ν μ μμ΅λλ€. μ΄μ€μ μ΄ μ€ν¨νλ©΄ ν΄κ²°ν΄μΌ ν λ°μ΄ν° λ¬΄κ²°μ± λ¬Έμ κ° μμμ λνλ λλ€.
λ°μ΄ν°λ² μ΄μ€ ν μ€ν λꡬ
μ¬λ¬ λκ΅¬κ° λ°μ΄ν°λ² μ΄μ€ ν μ€ν λ° λ°μ΄ν° λ¬΄κ²°μ± κ²μ¦μ λμμ μ€ μ μμ΅λλ€:
- SQL Developer/SQLcl (Oracle): SQL 쿼리 μ€ν, ν μ€νΈ μ€ν¬λ¦½νΈ μμ± λ° μ€ν, λ°μ΄ν° κ²μ¦ κΈ°λ₯μ μ 곡ν©λλ€.
- MySQL Workbench: λ°μ΄ν° κ²μ¦ λ° ν μ€ν κΈ°λ₯μ ν¬ν¨νμ¬ MySQL λ°μ΄ν°λ² μ΄μ€λ₯Ό μ€κ³, κ°λ° λ° κ΄λ¦¬νκΈ° μν λꡬλ₯Ό μ 곡ν©λλ€.
- pgAdmin (PostgreSQL): SQL 쿼리 μ€ν λ° λ°μ΄ν° λ¬΄κ²°μ± κ²μ¦ κΈ°λ₯μ κ°μΆ PostgreSQLμ© μΈκΈ° μλ μ€ν μμ€ κ΄λ¦¬ λ° κ°λ° νλ«νΌμ λλ€.
- DbFit: κ°λ¨νκ³ μ½κΈ° μ¬μ΄ νμμΌλ‘ λ°μ΄ν°λ² μ΄μ€ ν μ€νΈλ₯Ό μμ±ν μ μλ μ€ν μμ€ ν μ€ν νλ μμν¬μ λλ€.
- tSQLt (SQL Server): λ°μ΄ν°λ² μ΄μ€ κ°μ²΄μ λν μλνλ ν μ€νΈλ₯Ό μμ±νκ³ μ€νν μ μλ SQL Serverμ© μ λ ν μ€ν νλ μμν¬μ λλ€.
- DataGrip (JetBrains): λ°μ΄ν° νμ, μ€ν€λ§ κ΄λ¦¬ λ° μΏΌλ¦¬ μ€νμ μν κ³ κΈ κΈ°λ₯μ μ 곡νλ ν¬λ‘μ€ νλ«νΌ λ°μ΄ν°λ² μ΄μ€ IDEμ λλ€.
- QuerySurge: λ°μ΄ν° μ¨μ΄νμ°μ€ λ° ETL νλ‘μΈμ€ ν μ€ν μλνλ₯Ό μν΄ νΉλ³ν μ€κ³λ λ°μ΄ν° ν μ€ν μ루μ μ λλ€.
- Selenium/Cypress: μ£Όλ‘ μΉ μ ν리μΌμ΄μ ν μ€ν μ μ¬μ©λμ§λ§, μ΄λ¬ν λꡬλ μ ν리μΌμ΄μ κ³μΈ΅μ ν΅ν΄ λ°μ΄ν°λ² μ΄μ€ μνΈ μμ©μ ν μ€νΈνλ λ°μλ μ¬μ©λ μ μμ΅λλ€.
κ²°λ‘
λ°μ΄ν° 무결μ±μ λ°μ΄ν°λ² μ΄μ€ κ΄λ¦¬ λ° μ ν리μΌμ΄μ κ°λ°μ μ€μν μΈ‘λ©΄μ λλ€. κ°λ ₯ν λ°μ΄ν°λ² μ΄μ€ ν μ€ν κΈ°λ²μ ꡬνν¨μΌλ‘μ¨ μ‘°μ§μ λ°μ΄ν°κ° μ ννκ³ μΌκ΄λλ©° μ λ’°ν μ μμμ 보μ₯ν μ μμ΅λλ€. μ΄λ κ²°κ΅ λ λμ μμ¬ κ²°μ , κ°μ λ λΉμ¦λμ€ μ΄μ λ° ν₯μλ κ·μ μ€μλ‘ μ΄μ΄μ§λλ€. λ°μ΄ν° λ¬΄κ²°μ± ν μ€ν μ λν ν¬μλ λ°μ΄ν°μ μ λ°μ μΈ νμ§κ³Ό μ λ’°μ±μ λν ν¬μμ΄λ©°, λ°λΌμ μ‘°μ§μ μ±κ³΅μ λν ν¬μμ λλ€.
λ°μ΄ν° 무결μ±μ μΌνμ± μμ μ΄ μλλΌ μ§μμ μΈ νλ‘μΈμ€μμ κΈ°μ΅νμμμ€. μ§μμ μΈ λͺ¨λν°λ§, μ κΈ°μ μΈ κ°μ¬ λ° μ¬μ μλ°©μ μ μ§ κ΄λ¦¬λ λ°μ΄ν°λ₯Ό κΉ¨λνκ³ μ λ’°ν μ μκ² μ μ§νλ λ° νμμ μ λλ€. μ΄λ¬ν κ΄νμ μμ©ν¨μΌλ‘μ¨ μ‘°μ§μ λ°μ΄ν° κΈ°λ° νμ κ³Ό μ±μ₯μ μν κ²¬κ³ ν κΈ°λ°μ ꡬμΆν μ μμ΅λλ€.