본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 12. · 10 Views
Delta Lake 소개 및 환경 설정 완벽 가이드
Delta Lake의 개념부터 실제 환경 설정까지 단계별로 알아봅니다. 데이터 레이크와 데이터 웨어하우스의 장점을 결합한 레이크하우스 아키텍처를 이해하고, Apache Spark와 Delta Lake를 설치하여 첫 번째 Delta 테이블을 만들어봅니다.
목차
- Delta Lake란 무엇인가?
- 데이터 레이크 vs 데이터 웨어하우스 vs 레이크하우스
- Delta Lake의 핵심 특징과 장점
- Apache Spark 환경 설정
- Delta Lake 라이브러리 설치
- Delta 테이블을 다시 읽을 수 있는가?
- 첫 번째 Delta 테이블 생성하기
1. Delta Lake란 무엇인가?
어느 날 김데이터 씨는 회사의 데이터 레이크를 관리하다가 큰 문제에 직면했습니다. 파일을 업데이트하려고 했는데 기존 데이터가 깨져버린 것입니다.
"데이터베이스처럼 안전하게 관리할 수는 없을까요?"라고 선배에게 물었습니다.
Delta Lake는 데이터 레이크에 ACID 트랜잭션 기능을 추가한 오픈소스 저장소 레이어입니다. 마치 데이터베이스의 안정성과 데이터 레이크의 확장성을 결합한 것과 같습니다.
Databricks에서 개발했으며 Apache Spark와 완벽하게 통합되어 있습니다.
다음 코드를 살펴봅시다.
# Delta Lake 기본 사용 예제
from pyspark.sql import SparkSession
from delta import *
# Spark 세션 생성 (Delta Lake 지원)
spark = SparkSession.builder \
.appName("DeltaLakeIntro") \
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
.getOrCreate()
# 간단한 데이터프레임 생성
data = [("김철수", 28, "서울"), ("이영희", 32, "부산")]
df = spark.createDataFrame(data, ["name", "age", "city"])
# Delta 형식으로 저장 - 이것이 핵심입니다
df.write.format("delta").save("/tmp/delta-table")
김데이터 씨는 입사 6개월 차 데이터 엔지니어입니다. 회사의 데이터 레이크에는 수십 테라바이트의 로그 데이터가 쌓여 있습니다.
어제까지만 해도 잘 작동하던 데이터 파이프라인이 오늘 아침 갑자기 오류를 뱉어냈습니다. 누군가 데이터를 업데이트하는 도중에 다른 작업이 실행되면서 파일이 손상된 것입니다.
팀장 박시니어 씨가 다가와 말했습니다. "이제 Delta Lake를 도입할 때가 된 것 같네요." 데이터 레이크의 딜레마 데이터 레이크는 강력한 도구입니다.
수백 테라바이트의 데이터를 저렴한 비용으로 저장할 수 있고, 다양한 형식의 데이터를 그대로 보관할 수 있습니다. 하지만 큰 문제가 있습니다.
마치 거대한 창고에 물건을 아무렇게나 쌓아놓은 것과 같습니다. 물건은 많지만 정리되어 있지 않아서 찾기도 어렵고, 관리하기도 힘듭니다.
더 큰 문제는 두 명이 동시에 같은 물건을 옮기려 할 때 충돌이 발생한다는 것입니다. 전통적인 데이터 레이크에는 ACID 트랜잭션이 없습니다.
여러 작업이 동시에 같은 파일을 수정하면 데이터가 깨질 수 있습니다. 잘못 쓴 데이터를 되돌릴 방법도 없습니다.
데이터 품질을 보장하기도 어렵습니다. Delta Lake의 등장 바로 이런 문제를 해결하기 위해 Databricks에서 Delta Lake를 개발했습니다.
2019년에 오픈소스로 공개되었고, 현재는 Linux Foundation의 Delta Lake 프로젝트로 관리되고 있습니다. Delta Lake는 기존 데이터 레이크 위에 얇은 레이어를 추가합니다.
실제 데이터는 여전히 Parquet 파일로 저장됩니다. 하지만 추가로 트랜잭션 로그를 관리합니다.
이 로그 덕분에 데이터베이스처럼 안전하게 데이터를 다룰 수 있습니다. 핵심 동작 원리 Delta Lake의 비밀은 _delta_log 디렉토리에 있습니다.
데이터를 쓸 때마다 Delta Lake는 작은 JSON 파일을 트랜잭션 로그에 기록합니다. 이 파일에는 "어떤 Parquet 파일이 추가되었는지", "어떤 파일이 삭제되었는지" 같은 메타데이터가 담겨 있습니다.
마치 은행의 거래 내역 장부와 같습니다. 데이터를 읽을 때는 이 로그를 먼저 확인합니다.
현재 유효한 파일 목록을 파악한 다음, 해당 Parquet 파일들만 읽습니다. 이렇게 하면 여러 작업이 동시에 진행되어도 일관성 있는 데이터를 볼 수 있습니다.
ACID 트랜잭션의 마법 ACID는 데이터베이스의 핵심 개념입니다. Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(지속성)의 약자입니다.
Delta Lake는 데이터 레이크에 이 ACID 속성을 가져왔습니다. 데이터를 쓰는 도중에 실패하면 자동으로 롤백됩니다.
여러 작업이 동시에 실행되어도 서로 간섭하지 않습니다. 한번 커밋된 데이터는 안전하게 보존됩니다.
코드로 이해하기 위의 코드를 살펴보겠습니다. 먼저 Spark 세션을 만들 때 Delta Lake 확장을 활성화합니다.
spark.sql.extensions와 spark.sql.catalog 설정이 핵심입니다. 이 설정이 있어야 Delta Lake 기능을 사용할 수 있습니다.
데이터프레임을 만드는 과정은 일반 Spark와 동일합니다. 차이는 저장할 때 나타납니다.
.format("delta")를 지정하면 Delta 형식으로 저장됩니다. 내부적으로는 Parquet 파일과 트랜잭션 로그가 함께 만들어집니다.
실무에서의 활용 대형 전자상거래 회사를 생각해봅시다. 매일 수억 건의 클릭 로그가 쌓입니다.
데이터 분석팀은 이 데이터로 리포트를 만들고, 머신러닝팀은 추천 모델을 학습시킵니다. Delta Lake를 사용하면 데이터 팀이 리포트를 뽑는 동안 머신러닝 팀이 새로운 데이터를 추가할 수 있습니다.
서로 방해받지 않습니다. 만약 데이터를 잘못 입력했다면 이전 버전으로 되돌릴 수도 있습니다.
Netflix, Adobe, Comcast 같은 기업들이 프로덕션 환경에서 Delta Lake를 사용하고 있습니다. 왜 Delta Lake를 선택할까 김데이터 씨는 박시니어 씨에게 물었습니다.
"그냥 PostgreSQL 같은 데이터베이스를 쓰면 안 되나요?" 박시니어 씨가 답했습니다. "데이터베이스는 구조화된 데이터에 최적화되어 있어요.
하지만 우리는 비정형 로그 데이터도 많고, 수십 테라바이트 규모의 데이터를 다뤄야 합니다. Delta Lake는 데이터 레이크의 확장성과 유연성을 유지하면서도 데이터베이스의 안정성을 제공합니다." 시작하는 방법 Delta Lake를 시작하는 것은 어렵지 않습니다.
Apache Spark가 설치되어 있다면 Delta Lake 라이브러리만 추가하면 됩니다. 기존 Parquet 파일을 Delta 형식으로 변환하는 것도 간단합니다.
무엇보다 좋은 점은 Delta Lake가 오픈소스라는 것입니다. 특정 클라우드 벤더에 종속되지 않습니다.
AWS S3, Azure Blob Storage, Google Cloud Storage 어디서든 사용할 수 있습니다.
실전 팁
💡 - Delta Lake는 기존 Parquet 파일과 호환되므로 점진적 마이그레이션이 가능합니다
- 트랜잭션 로그는 자동으로 체크포인트를 만들어 성능을 최적화합니다
- Delta Lake를 사용하면 스키마 검증이 자동으로 이루어져 데이터 품질이 향상됩니다
2. 데이터 레이크 vs 데이터 웨어하우스 vs 레이크하우스
이영희 씨는 신규 데이터 플랫폼 구축 프로젝트를 맡았습니다. CTO가 물었습니다.
"데이터 레이크로 갈까요, 데이터 웨어하우스로 갈까요?" 두 가지 모두 장단점이 있어서 선택이 쉽지 않았습니다.
데이터 레이크는 모든 형식의 원본 데이터를 저장하는 저장소이고, 데이터 웨어하우스는 구조화된 데이터를 빠르게 분석하기 위한 시스템입니다. 레이크하우스는 이 둘의 장점을 결합한 새로운 아키텍처입니다.
Delta Lake가 바로 레이크하우스를 구현하는 대표적인 기술입니다.
다음 코드를 살펴봅시다.
# 데이터 레이크: 원본 데이터를 그대로 저장
raw_logs.write.parquet("s3://data-lake/raw/logs/")
# 데이터 웨어하우스: 구조화된 분석용 테이블
# (SQL 기반 쿼리 최적화)
CREATE TABLE sales_summary AS
SELECT date, product, SUM(amount) as total
FROM transactions GROUP BY date, product;
# 레이크하우스: Delta Lake로 두 가지 장점 결합
# ACID 트랜잭션 + 원본 데이터 보존 + SQL 분석
raw_logs.write.format("delta").mode("append").save("s3://lakehouse/logs/")
spark.sql("SELECT * FROM delta.`s3://lakehouse/logs/` WHERE date > '2025-01-01'")
이영희 씨는 고민에 빠졌습니다. 회사의 데이터는 다양합니다.
웹 로그, IoT 센서 데이터, 고객 거래 내역, 소셜 미디어 피드까지. 이 모든 것을 어떻게 효율적으로 관리할 수 있을까요?
시니어 아키텍트 최전문 씨를 찾아갔습니다. "두 가지 방식의 차이를 이해하면 답이 보일 거예요." 데이터 웨어하우스의 세계 전통적으로 기업들은 데이터 웨어하우스를 사용했습니다.
데이터 웨어하우스는 마치 잘 정리된 도서관과 같습니다. 모든 책이 주제별로 분류되어 있고, 색인이 완벽하게 만들어져 있습니다.
원하는 정보를 빠르게 찾을 수 있습니다. Oracle, Teradata, Amazon Redshift 같은 시스템이 대표적입니다.
이들은 구조화된 데이터를 저장하고 SQL 쿼리를 빠르게 실행하는 데 최적화되어 있습니다. BI 리포트나 대시보드를 만들기에 완벽합니다.
하지만 문제가 있습니다. 비정형 데이터를 다루기 어렵습니다.
이미지, 동영상, 자유 형식의 텍스트를 저장하려면 복잡한 변환 과정이 필요합니다. 게다가 비용이 많이 듭니다.
저장 용량과 컴퓨팅 자원이 함께 묶여 있어서 확장하기도 어렵습니다. 데이터 레이크의 등장 2010년대에 데이터 레이크 개념이 등장했습니다.
데이터 레이크는 거대한 창고입니다. 어떤 형식의 데이터든 원본 그대로 저장할 수 있습니다.
CSV, JSON, Parquet, 이미지, 동영상 모두 환영합니다. Amazon S3나 Azure Blob Storage 같은 저렴한 오브젝트 스토리지를 활용합니다.
Apache Hadoop과 Spark 같은 빅데이터 도구들과 궁합이 좋습니다. 페타바이트 규모의 데이터도 효율적으로 처리할 수 있습니다.
머신러닝 학습 데이터를 저장하기에도 적합합니다. 하지만 데이터 레이크에도 문제가 있습니다.
데이터 늪이 되기 쉽습니다. 데이터 품질을 보장하기 어렵고, ACID 트랜잭션이 없어서 동시성 문제가 발생합니다.
쿼리 성능도 데이터 웨어하우스만큼 빠르지 않습니다. 레이크하우스의 탄생 최전문 씨가 화이트보드에 그림을 그렸습니다.
"두 가지의 장점만 모을 수는 없을까요? 그래서 나온 것이 레이크하우스입니다." 레이크하우스는 데이터 레이크의 유연성과 저비용, 데이터 웨어하우스의 성능과 안정성을 결합한 아키텍처입니다.
핵심 아이디어는 간단합니다. 데이터 레이크 위에 메타데이터 레이어를 추가하는 것입니다.
이 레이어가 트랜잭션 관리, 스키마 검증, 쿼리 최적화를 담당합니다. Delta Lake, Apache Iceberg, Apache Hudi가 대표적인 구현체입니다.
Delta Lake의 레이크하우스 구현 Delta Lake는 레이크하우스 아키텍처를 구현한 가장 성숙한 기술입니다. 저장소는 여전히 S3 같은 저렴한 오브젝트 스토리지를 사용합니다.
데이터 파일은 Parquet 형식으로 저장되어 효율적입니다. 하지만 트랜잭션 로그 덕분에 데이터베이스처럼 ACID 속성을 보장합니다.
쿼리 성능도 뛰어납니다. 데이터 스키핑, Z-Ordering 같은 최적화 기법을 지원합니다.
파티션과 인덱스를 활용하면 데이터 웨어하우스 수준의 성능을 얻을 수 있습니다. 코드로 보는 차이점 위의 코드를 비교해보겠습니다.
첫 번째는 순수 데이터 레이크 방식입니다. Parquet 파일을 그냥 저장합니다.
간단하지만 동시 쓰기를 안전하게 처리할 수 없습니다. 두 번째는 데이터 웨어하우스 방식입니다.
테이블을 만들고 집계 쿼리를 실행합니다. 빠르지만 원본 데이터의 유연성은 잃어버립니다.
세 번째가 레이크하우스 방식입니다. Delta 형식으로 저장하면 안전하게 append할 수 있고, SQL로 바로 쿼리할 수도 있습니다.
두 가지 장점을 모두 얻는 것입니다. 실무 적용 사례 대형 금융 회사를 예로 들어보겠습니다.
거래 내역은 데이터 웨어하우스에 저장하고, 고객 상담 녹취 파일은 데이터 레이크에 저장하는 이원화 구조를 운영했습니다. 두 시스템을 동기화하는 ETL 파이프라인이 복잡했고, 비용도 두 배로 들었습니다.
레이크하우스로 전환하면서 모든 데이터를 Delta Lake에 통합했습니다. 거래 내역도, 녹취 파일도, 로그 데이터도 모두 같은 곳에 저장됩니다.
하지만 각각의 용도에 맞게 최적화된 방식으로 접근할 수 있습니다. 선택의 기준 이영희 씨가 물었습니다.
"그럼 무조건 레이크하우스가 답인가요?" 최전문 씨가 답했습니다. "대부분의 경우 그렇습니다.
하지만 조직의 상황에 따라 다릅니다." 이미 Redshift나 Snowflake에 많은 투자를 했고 잘 작동한다면 굳이 바꿀 필요는 없습니다. 하지만 새로운 데이터 플랫폼을 구축한다면 레이크하우스 아키텍처를 심각하게 고려해야 합니다.
미래의 방향 데이터 업계는 레이크하우스로 빠르게 이동하고 있습니다. Databricks는 Delta Lake를 기반으로 한 통합 플랫폼을 제공합니다.
AWS는 Lake Formation과 Athena를 통합하고 있습니다. Snowflake도 외부 테이블 기능을 강화하고 있습니다.
결국 데이터 레이크와 데이터 웨어하우스의 경계는 점점 흐려지고 있습니다. 레이크하우스가 새로운 표준이 되어가고 있습니다.
실전 팁
💡 - 레이크하우스로 마이그레이션할 때는 점진적 접근이 좋습니다. 새로운 데이터부터 Delta 형식으로 저장하세요
- 데이터 웨어하우스의 집계 테이블은 Delta Lake의 머티리얼라이즈드 뷰로 대체할 수 있습니다
- 레이크하우스는 스토리지와 컴퓨팅이 분리되어 있어 비용 최적화가 쉽습니다
3. Delta Lake의 핵심 특징과 장점
박개발 씨는 Delta Lake 도입을 검토하고 있습니다. 팀 미팅에서 상사가 물었습니다.
"Delta Lake를 쓰면 정확히 뭐가 좋아지나요?" 명확한 답변을 준비해야 했습니다.
Delta Lake의 핵심 특징은 ACID 트랜잭션, 타임 트래블, 스키마 진화, 성능 최적화입니다. 이 기능들이 결합되어 안전하고 빠르며 유연한 데이터 관리를 가능하게 합니다.
일반 데이터 레이크의 문제점들을 근본적으로 해결합니다.
다음 코드를 살펴봅시다.
from delta.tables import DeltaTable
# 1. ACID 트랜잭션: 안전한 업데이트
delta_table = DeltaTable.forPath(spark, "/tmp/users")
delta_table.update(
condition = "age < 18",
set = {"status": "'minor'"} # 원자적으로 실행됩니다
)
# 2. 타임 트래블: 과거 데이터 조회
df_yesterday = spark.read.format("delta").option("versionAsOf", 0).load("/tmp/users")
df_one_hour_ago = spark.read.format("delta").option("timestampAsOf", "2025-01-15 10:00:00").load("/tmp/users")
# 3. 스키마 진화: 새로운 컬럼 추가
df_with_new_col.write.format("delta").mode("append").option("mergeSchema", "true").save("/tmp/users")
# 4. 최적화: 작은 파일 합치기
delta_table.optimize().executeCompaction()
박개발 씨는 지난주에 큰 실수를 했습니다. 데이터 업데이트 스크립트를 실행했는데 중간에 에러가 났습니다.
결과적으로 데이터 일부만 업데이트되고 일부는 그대로 남아 있었습니다. 데이터 정합성이 깨진 것입니다.
데이터 리드 정시니어 씨가 말했습니다. "Delta Lake를 썼다면 이런 일은 없었을 거예요.
자동으로 롤백되거든요." 첫 번째 특징: ACID 트랜잭션 ACID 트랜잭션은 Delta Lake의 가장 중요한 특징입니다. 마치 은행 계좌 이체와 같습니다.
내 계좌에서 돈이 빠져나가고 상대방 계좌에 입금되는 과정은 하나의 트랜잭션입니다. 중간에 실패하면 전체가 취소되어야 합니다.
절대로 내 계좌에서만 돈이 빠져나가고 상대방은 못 받는 일이 있어서는 안 됩니다. Delta Lake도 마찬가지입니다.
데이터를 쓰는 작업이 실패하면 자동으로 롤백됩니다. 부분적으로 쓴 데이터는 보이지 않습니다.
다른 작업은 항상 일관성 있는 데이터만 봅니다. Atomicity(원자성)은 작업이 전부 성공하거나 전부 실패함을 보장합니다.
Consistency(일관성)는 데이터가 항상 유효한 상태를 유지함을 의미합니다. Isolation(격리성)은 동시에 실행되는 작업들이 서로 간섭하지 않음을 뜻합니다.
Durability(지속성)는 커밋된 데이터가 영구적으로 보존됨을 의미합니다. 두 번째 특징: 타임 트래블 타임 트래블은 Delta Lake의 마법 같은 기능입니다.
과거의 어떤 시점으로든 되돌아갈 수 있습니다. "어제 오후 3시에 이 테이블은 어떤 상태였을까?"라는 질문에 즉시 답할 수 있습니다.
Delta Lake는 모든 변경 사항을 트랜잭션 로그에 기록합니다. 파일을 물리적으로 삭제하지 않고 메타데이터만 업데이트합니다.
따라서 이전 버전의 데이터를 언제든지 다시 읽을 수 있습니다. 실무에서 엄청나게 유용합니다.
잘못된 배치 작업을 실행했다면 이전 버전으로 롤백할 수 있습니다. 버그를 재현하기 위해 특정 시점의 데이터가 필요하다면 타임 트래블로 가져올 수 있습니다.
감사(audit) 요구사항도 쉽게 충족할 수 있습니다. 세 번째 특징: 스키마 진화 스키마 진화는 데이터 구조가 변할 때 빛을 발합니다.
비즈니스 요구사항은 계속 바뀝니다. 처음에는 고객의 이름과 이메일만 저장했는데, 나중에 전화번호와 주소도 필요해졌습니다.
컬럼을 추가해야 합니다. 일반 Parquet 파일은 스키마가 고정되어 있습니다.
새로운 컬럼을 추가하려면 기존 데이터를 모두 다시 써야 합니다. 페타바이트 규모의 데이터라면 며칠이 걸릴 수 있습니다.
Delta Lake는 mergeSchema 옵션으로 스키마를 유연하게 진화시킬 수 있습니다. 새로운 컬럼이 있는 데이터를 append하면 자동으로 스키마가 업데이트됩니다.
기존 데이터는 건드리지 않습니다. 새로운 컬럼은 기존 레코드에서 null로 처리됩니다.
네 번째 특징: 성능 최적화 성능 최적화 기능도 강력합니다. 데이터 레이크는 시간이 지나면서 작은 파일이 많이 쌓입니다.
스트리밍 데이터를 매 초마다 쓰면 수천 개의 작은 파일이 생깁니다. 작은 파일이 많으면 쿼리 성능이 떨어집니다.
Delta Lake의 OPTIMIZE 명령은 작은 파일들을 큰 파일로 합칩니다. 컴팩션(compaction)이라고 부릅니다.
쿼리 성능이 극적으로 향상됩니다. Z-Ordering은 더 고급 기술입니다.
특정 컬럼의 값이 비슷한 데이터를 물리적으로 가까이 배치합니다. 해당 컬럼으로 필터링하는 쿼리가 훨씬 빠르게 실행됩니다.
코드 분석 위의 코드를 하나씩 살펴보겠습니다. 첫 번째 예제는 조건부 업데이트입니다.
age < 18인 모든 레코드의 상태를 변경합니다. 이 작업은 원자적입니다.
중간에 실패하면 아무것도 변경되지 않습니다. 두 번째 예제는 타임 트래블입니다.
versionAsOf는 특정 버전 번호를 지정하고, timestampAsOf는 특정 시각을 지정합니다. 과거의 어떤 상태도 쉽게 조회할 수 있습니다.
세 번째 예제는 스키마 병합입니다. mergeSchema 옵션을 켜면 새로운 컬럼이 자동으로 추가됩니다.
데이터 구조가 진화할 수 있습니다. 네 번째 예제는 최적화입니다.
executeCompaction()은 작은 파일들을 합쳐서 쿼리 성능을 개선합니다. 추가 기능들 Delta Lake에는 더 많은 기능이 있습니다.
DML 명령(DELETE, UPDATE, MERGE)을 지원합니다. SQL이나 DataFrame API로 데이터를 수정할 수 있습니다.
Upsert(insert or update) 패턴도 MERGE 명령으로 쉽게 구현할 수 있습니다. 스키마 검증도 자동으로 이루어집니다.
잘못된 타입의 데이터를 쓰려고 하면 에러가 발생합니다. 데이터 품질이 보장됩니다.
동시성 제어도 뛰어납니다. 낙관적 동시성 제어(optimistic concurrency control)를 사용합니다.
여러 작업이 동시에 실행되어도 충돌을 자동으로 감지하고 해결합니다. 실무 사례 글로벌 스트리밍 서비스 기업의 사례입니다.
매일 수십억 건의 시청 로그가 쌓입니다. 실시간 대시보드도 있고, 배치 분석 작업도 있습니다.
예전에는 동시성 문제로 데이터가 가끔 깨졌습니다. Delta Lake를 도입한 후 이런 문제가 사라졌습니다.
스트리밍 작업과 배치 작업이 동시에 실행되어도 문제없습니다. 잘못된 데이터가 들어가면 타임 트래블로 되돌립니다.
파일 최적화로 쿼리 성능도 2배 이상 개선되었습니다. 정리 박개발 씨는 이제 자신 있게 답할 수 있습니다.
"Delta Lake를 쓰면 데이터 정합성이 보장되고, 과거 버전을 쉽게 조회할 수 있으며, 스키마 변경이 유연하고, 성능도 좋아집니다. 운영 부담이 줄어들고 데이터 신뢰성이 높아집니다."
실전 팁
💡 - 타임 트래블은 retention 기간(기본 30일) 내에서만 가능하므로 VACUUM 명령 실행 시 주의하세요
- Z-Ordering은 자주 필터링하는 컬럼(날짜, 지역 등) 2-3개에만 적용하는 것이 효과적입니다
- OPTIMIZE는 주기적으로 실행하되, 쓰기가 많은 시간대는 피하세요
4. Apache Spark 환경 설정
최신입 씨는 Delta Lake를 사용하기 위해 환경을 구축해야 합니다. "먼저 Spark부터 설치해야 한다는데, 어디서부터 시작해야 할까요?" 선배에게 물었지만 설명이 너무 복잡했습니다.
Delta Lake는 Apache Spark 위에서 작동합니다. Spark는 대용량 데이터를 빠르게 처리하는 분산 컴퓨팅 엔진입니다.
Python을 사용한다면 PySpark를 설치하면 되고, Java나 Scala로도 사용할 수 있습니다. 로컬 환경에서도 쉽게 시작할 수 있습니다.
다음 코드를 살펴봅시다.
# 1. PySpark 설치 (pip 사용)
# 터미널에서 실행: pip install pyspark
# 2. Spark 세션 생성 (기본 설정)
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("MyFirstSparkApp") \
.master("local[*]") \
.config("spark.driver.memory", "4g") \
.config("spark.executor.memory", "4g") \
.getOrCreate()
# 3. 설치 확인
print(f"Spark version: {spark.version}")
# 4. 간단한 테스트
data = [("Alice", 25), ("Bob", 30), ("Charlie", 35)]
df = spark.createDataFrame(data, ["name", "age"])
df.show()
최신입 씨는 개발자 커리어를 막 시작했습니다. 빅데이터라는 단어는 들어봤지만 직접 다뤄본 적은 없습니다.
"Spark가 뭔지는 알겠는데, 설치가 복잡하다던데요?" 멘토 강선배 씨가 웃으며 답했습니다. "예전에는 복잡했어요.
하지만 지금은 pip 명령 하나면 됩니다." Apache Spark란 무엇인가 Apache Spark는 대용량 데이터를 빠르게 처리하는 오픈소스 엔진입니다. 2014년에 처음 릴리스되었고, 현재는 빅데이터 처리의 사실상 표준이 되었습니다.
Hadoop MapReduce보다 최대 100배 빠르다고 알려져 있습니다. 메모리 기반 처리를 활용하기 때문입니다.
Spark는 여러 언어를 지원합니다. Scala로 작성되었지만, Python(PySpark), Java, R API도 제공합니다.
대부분의 데이터 과학자와 엔지니어는 Python을 사용합니다. 왜 Spark가 필요한가 Delta Lake는 Spark 위에서 작동합니다.
마치 자동차 엔진과 변속기의 관계와 같습니다. Delta Lake는 데이터를 안전하게 저장하고 관리하는 레이어입니다.
하지만 실제 데이터 처리는 Spark 엔진이 담당합니다. 따라서 Delta Lake를 사용하려면 먼저 Spark를 설치해야 합니다.
Spark가 없어도 Delta Lake 파일을 읽을 수는 있습니다. 다른 도구들(Trino, Presto 등)도 Delta Lake를 지원하기 시작했습니다.
하지만 가장 완벽한 통합은 역시 Spark에서 이루어집니다. 설치 방법: pip로 간단하게 예전에는 Spark 설치가 복잡했습니다.
JDK를 설치하고, Spark 바이너리를 다운로드하고, 환경 변수를 설정해야 했습니다. 지금은 훨씬 간단합니다.
Python이 설치되어 있다면 pip install pyspark 명령 하나로 끝입니다. pip가 자동으로 필요한 모든 것을 다운로드하고 설정합니다.
Windows, macOS, Linux 모두 같은 방식으로 설치할 수 있습니다. 특별한 권한도 필요 없습니다.
가상 환경(virtualenv나 conda)에 설치하는 것을 추천합니다. Java 요구사항 한 가지 주의할 점은 Java가 필요하다는 것입니다.
Spark는 JVM(Java Virtual Machine) 위에서 실행됩니다. 따라서 Java 8 이상이 설치되어 있어야 합니다.
Java 11이나 Java 17을 권장합니다. Java가 설치되어 있지 않다면 먼저 설치해야 합니다.
OpenJDK를 무료로 다운로드할 수 있습니다. 설치 후 java -version 명령으로 확인할 수 있습니다.
Spark 세션 생성 Spark를 사용하려면 SparkSession 객체를 만들어야 합니다. SparkSession은 Spark의 진입점입니다.
모든 Spark 기능에 접근할 수 있는 중앙 허브입니다. 데이터프레임을 만들고, SQL을 실행하고, 파일을 읽고 쓰는 모든 작업이 여기서 시작됩니다.
위의 코드에서 .master("local[*]")는 로컬 모드로 실행한다는 의미입니다. 대괄호 안의 별표는 모든 CPU 코어를 사용하라는 뜻입니다.
local[2]라고 쓰면 2개 코어만 사용합니다. 메모리 설정도 중요합니다.
spark.driver.memory는 드라이버 프로세스의 메모리이고, spark.executor.memory는 작업을 실행하는 익스큐터의 메모리입니다. 로컬 모드에서는 둘이 같은 프로세스입니다.
코드 상세 분석 위의 코드를 단계별로 살펴보겠습니다. 먼저 PySpark를 import합니다.
SparkSession이 핵심 클래스입니다. .builder는 빌더 패턴을 시작합니다.
.appName()으로 애플리케이션 이름을 지정합니다. Spark UI에서 이 이름으로 표시됩니다.
.master("local[*]")는 실행 모드를 지정합니다. 실제 클러스터에서는 "spark://host:port" 같은 주소를 사용합니다.
.config()로 다양한 설정을 추가할 수 있습니다. 메모리, 파티션 수, 셔플 동작 등 수백 가지 설정이 있습니다.
마지막으로 .getOrCreate()를 호출합니다. 이미 세션이 있으면 그것을 반환하고, 없으면 새로 만듭니다.
설치 확인하기 설치가 제대로 되었는지 확인해봅시다. spark.version을 출력하면 Spark 버전이 나옵니다.
3.5.0이나 그 이상이면 좋습니다. Delta Lake는 Spark 3.0 이상을 요구합니다.
간단한 데이터프레임을 만들어봅니다. Python 리스트를 데이터프레임으로 변환하고, .show()로 출력합니다.
테이블 형식으로 예쁘게 표시됩니다. 에러 없이 실행되면 성공입니다.
Spark가 정상적으로 작동하고 있습니다. 로컬 모드 vs 클러스터 모드 로컬 모드는 개발과 테스트에 적합합니다.
한 대의 컴퓨터에서 모든 것이 실행됩니다. 설정이 간단하고 디버깅도 쉽습니다.
작은 데이터셋으로 실험하기에 완벽합니다. 실제 프로덕션에서는 클러스터 모드를 사용합니다.
여러 대의 서버에 작업을 분산시킵니다. YARN, Kubernetes, Standalone Cluster Manager 등을 사용할 수 있습니다.
하지만 처음 배울 때는 로컬 모드로 충분합니다. Spark UI Spark를 실행하면 자동으로 웹 UI가 시작됩니다.
브라우저에서 http://localhost:4040에 접속하면 Spark UI를 볼 수 있습니다. 실행 중인 작업, 완료된 작업, 메모리 사용량, 실행 계획 등 모든 정보가 표시됩니다.
디버깅할 때 엄청나게 유용합니다. 왜 쿼리가 느린지, 어떤 단계에서 시간이 오래 걸리는지 한눈에 볼 수 있습니다.
정리 최신입 씨는 생각보다 쉽게 Spark를 설치했습니다. "생각했던 것보다 훨씬 간단하네요!" 강선배 씨가 말했습니다.
"이제 Delta Lake를 추가할 준비가 되었어요."
실전 팁
💡 - 개발 환경에서는 가상 환경(venv, conda)을 사용하여 Spark를 설치하세요
- 메모리 설정은 시스템 전체 메모리의 70-80%를 넘지 않도록 하세요
- Spark UI(localhost:4040)를 활용하면 성능 문제를 쉽게 진단할 수 있습니다
5. Delta Lake 라이브러리 설치
정개발 씨는 Spark 설치를 마쳤습니다. 이제 Delta Lake를 추가해야 합니다.
"라이브러리만 추가하면 되나요, 아니면 다른 설정도 필요한가요?" 문서를 읽어봐도 헷갈렸습니다.
Delta Lake는 pip로 설치할 수 있는 Python 패키지입니다. 하지만 Spark와 버전 호환성을 맞춰야 합니다.
delta-spark 패키지를 설치하고, SparkSession 설정에 Delta 확장을 추가하면 됩니다. 올바른 버전을 선택하는 것이 핵심입니다.
다음 코드를 살펴봅시다.
# 1. Delta Lake 패키지 설치
# 터미널에서 실행: pip install delta-spark
# 2. Delta Lake가 활성화된 Spark 세션 생성
from pyspark.sql import SparkSession
from delta import *
spark = SparkSession.builder \
.appName("DeltaLakeApp") \
.master("local[*]") \
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
.getOrCreate()
# 3. 설치 확인
print(f"Delta Lake version: {delta.__version__}")
# 4. Delta 테이블 읽기/쓰기 테스트
data = [("test", 1)]
df = spark.createDataFrame(data, ["col1", "col2"])
df.write.format("delta").save("/tmp/delta-test")
print("Delta Lake is ready!")
정개발 씨는 pip install 명령을 실행했습니다. 몇 초 후 설치가 완료되었습니다.
"이제 끝인가요?" 동료 윤개발 씨가 말했습니다. "아직 한 가지 더 있어요.
Spark 설정을 수정해야 합니다." Delta Lake 패키지의 이해 delta-spark는 Delta Lake의 공식 Python 패키지입니다. PyPI(Python Package Index)에서 다운로드할 수 있습니다.
pip 명령으로 간단히 설치됩니다. 내부적으로는 Java/Scala로 작성된 Delta Lake 코어 라이브러리와 Python 바인딩이 함께 포함되어 있습니다.
중요한 점은 버전 호환성입니다. Spark 버전과 Delta Lake 버전이 맞아야 합니다.
버전 매칭 가이드 각 Delta Lake 버전은 특정 Spark 버전을 요구합니다. 예를 들어 Delta Lake 3.0은 Spark 3.5를 지원합니다.
Delta Lake 2.4는 Spark 3.4를 지원합니다. 잘못된 조합을 사용하면 런타임 에러가 발생합니다.
공식 문서에 호환성 매트릭스가 있습니다. 하지만 간단한 규칙이 있습니다.
최신 버전을 사용하면 됩니다. pip install delta-spark는 자동으로 적절한 Spark 버전을 찾아줍니다.
특정 버전을 원한다면 pip install delta-spark==3.0.0 같은 식으로 버전을 명시할 수 있습니다. 필수 Spark 설정 Delta Lake를 사용하려면 Spark 설정 두 가지를 추가해야 합니다.
첫 번째는 spark.sql.extensions입니다. 이것은 Delta Lake의 SQL 확장을 활성화합니다.
Delta 전용 SQL 명령들(MERGE, VACUUM 등)을 사용할 수 있게 해줍니다. 두 번째는 spark.sql.catalog.spark_catalog입니다.
이것은 Spark의 기본 카탈로그를 Delta 카탈로그로 교체합니다. 테이블 메타데이터를 Delta Lake 방식으로 관리하게 됩니다.
이 두 설정이 없으면 Delta Lake를 사용할 수 없습니다. 에러 메시지를 보게 될 것입니다.
코드 분석 위의 코드를 자세히 살펴보겠습니다. 먼저 delta 모듈을 import합니다.
별표 import(from delta import *)를 사용하는 것이 일반적입니다. 여러 Delta 관련 함수와 클래스를 가져옵니다.
SparkSession을 만들 때 .config() 메서드로 두 가지 설정을 추가합니다. 이 부분이 핵심입니다.
설정 이름을 정확히 입력해야 합니다. 오타가 있으면 작동하지 않습니다.
delta.__version__으로 설치된 Delta Lake 버전을 확인할 수 있습니다. 예상한 버전이 맞는지 체크하는 것이 좋습니다.
마지막으로 실제 Delta 테이블을 쓰고 읽어봅니다. .format("delta")를 지정하는 것을 잊지 마세요.
에러 없이 실행되면 설치가 완료된 것입니다. 패키지 의존성 delta-spark 패키지는 다른 패키지들에 의존합니다.
자동으로 필요한 의존성이 함께 설치됩니다. pyspark, importlib-metadata 등이 포함됩니다.
대부분의 경우 신경 쓸 필요가 없습니다. 하지만 가끔 충돌이 발생할 수 있습니다.
특히 이미 다른 버전의 PySpark가 설치되어 있을 때입니다. 이럴 때는 가상 환경을 새로 만들어서 깨끗하게 설치하는 것이 좋습니다.
Databricks Runtime vs 오픈소스 Databricks를 사용한다면 이미 Delta Lake가 설치되어 있습니다. Databricks Runtime에는 Delta Lake가 기본 탑재되어 있습니다.
별도 설치나 설정이 필요 없습니다. 그냥 바로 사용하면 됩니다.
하지만 로컬 환경이나 다른 클라우드 플랫폼에서는 직접 설치해야 합니다. AWS EMR, Google Cloud Dataproc, Azure HDInsight 모두 Delta Lake를 수동으로 추가해야 합니다.
Maven 좌표 (고급) Scala나 Java를 사용한다면 Maven 좌표를 알아야 합니다. io.delta:delta-core_2.12:3.0.0 같은 형식입니다.
Spark 제출 시 --packages 옵션으로 지정할 수 있습니다. Python 사용자는 pip만으로 충분하므로 Maven 좌표는 몰라도 됩니다.
하지만 클러스터 환경에서 작업할 때는 알아두면 유용합니다. 설치 확인 체크리스트 설치가 제대로 되었는지 확인하는 방법입니다.
4. Delta 테이블을 다시 읽을 수 있는가?
실전 팁
💡 - 버전 충돌을 피하려면 requirements.txt에 정확한 버전을 명시하세요 (예: delta-spark==3.0.0)
- 클러스터 환경에서는 모든 노드에 동일한 버전이 설치되어야 합니다
- Jupyter Notebook을 사용한다면 커널을 재시작해야 설정이 적용됩니다
6. 첫 번째 Delta 테이블 생성하기
한개발 씨는 드디어 모든 준비를 마쳤습니다. "이제 실제 Delta 테이블을 만들어볼까요?" 손이 떨렸습니다.
첫 번째 Delta 테이블을 만드는 순간이 다가왔습니다.
Delta 테이블을 만드는 방법은 일반 Parquet 파일과 비슷합니다. 데이터프레임을 만들고 .format("delta")로 저장하면 됩니다.
CREATE TABLE SQL 명령을 사용할 수도 있습니다. 한번 만들면 읽기, 쓰기, 업데이트, 삭제 모든 작업이 ACID 트랜잭션으로 보장됩니다.
다음 코드를 살펴봅시다.
from pyspark.sql import SparkSession
from delta import *
from pyspark.sql.types import StructType, StructField, StringType, IntegerType
# Delta가 활성화된 Spark 세션
spark = SparkSession.builder \
.appName("FirstDeltaTable") \
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
.getOrCreate()
# 1. 스키마 정의
schema = StructType([
StructField("user_id", IntegerType(), False),
StructField("name", StringType(), True),
StructField("age", IntegerType(), True),
StructField("city", StringType(), True)
])
# 2. 샘플 데이터 생성
data = [
(1, "김철수", 28, "서울"),
(2, "이영희", 32, "부산"),
(3, "박민수", 25, "대구"),
(4, "정수진", 29, "인천")
]
# 3. 데이터프레임 생성
df = spark.createDataFrame(data, schema)
# 4. Delta 형식으로 저장 - 테이블 생성!
delta_path = "/tmp/users_delta"
df.write.format("delta").mode("overwrite").save(delta_path)
# 5. 테이블 읽기
users_df = spark.read.format("delta").load(delta_path)
users_df.show()
# 6. SQL로 테이블 등록 및 쿼리
spark.sql(f"CREATE TABLE IF NOT EXISTS users USING DELTA LOCATION '{delta_path}'")
spark.sql("SELECT * FROM users WHERE age > 28").show()
print("첫 번째 Delta 테이블이 성공적으로 생성되었습니다!")
한개발 씨는 코드를 작성하기 시작했습니다. 손에 땀이 났습니다.
"과연 제대로 작동할까?" 옆자리 선배 송시니어 씨가 격려했습니다. "걱정 마세요.
생각보다 간단합니다. 하나씩 천천히 해봅시다." 데이터프레임으로 시작하기 모든 것은 데이터프레임에서 시작됩니다.
Spark의 데이터프레임은 표 형식의 데이터 구조입니다. 마치 엑셀 시트나 데이터베이스 테이블과 비슷합니다.
행과 열로 구성되어 있고, 각 열은 타입을 가집니다. 먼저 스키마를 정의합니다.
어떤 컬럼이 있고, 각 컬럼의 타입은 무엇인지 명시합니다. StructType과 StructField를 사용합니다.
user_id는 정수형이고 null이 될 수 없습니다(False). 다른 컬럼들은 null이 허용됩니다(True).
스키마를 미리 정의하는 것이 좋습니다. 타입 안전성이 보장되고, 나중에 스키마를 쉽게 변경할 수 있습니다.
샘플 데이터 만들기 실제 프로젝트에서는 데이터베이스나 API에서 데이터를 가져올 것입니다. 하지만 지금은 학습 단계이므로 Python 리스트로 샘플 데이터를 만듭니다.
튜플의 리스트 형태입니다. 각 튜플은 하나의 행을 나타냅니다.
사용자 정보를 담은 간단한 데이터입니다. ID, 이름, 나이, 도시 정보를 포함합니다.
네 명의 사용자 데이터를 준비했습니다. createDataFrame() 메서드로 데이터프레임을 만듭니다.
첫 번째 인자는 데이터이고, 두 번째 인자는 스키마입니다. Delta 테이블로 저장하기 여기가 핵심입니다.
.write.format("delta")가 마법의 주문입니다. 이것이 일반 Parquet 파일과 Delta 테이블의 차이입니다.
format 매개변수를 "delta"로 지정하면 Delta Lake가 활성화됩니다. .mode("overwrite")는 기존 데이터를 덮어쓴다는 의미입니다.
처음 테이블을 만들 때는 상관없지만, 나중에 데이터를 추가하려면 "append"를 사용합니다. .save(delta_path)로 저장 위치를 지정합니다.
로컬 파일시스템 경로(/tmp/users_delta)를 사용했지만, S3 경로(s3://my-bucket/delta/users)나 HDFS 경로도 가능합니다. 저장된 파일 구조 Delta 테이블이 저장되면 어떤 파일들이 만들어질까요?
지정한 경로를 살펴보면 두 가지가 보입니다. 하나는 _delta_log 디렉토리입니다.
트랜잭션 로그가 여기에 저장됩니다. JSON 형식의 작은 파일들이 들어 있습니다.
다른 하나는 Parquet 파일들입니다. 실제 데이터가 여기에 저장됩니다.
파일 이름은 UUID 형식의 긴 문자열입니다. 여러 파일로 분할될 수도 있습니다.
이 두 가지가 결합되어 Delta 테이블을 구성합니다. 트랜잭션 로그가 어떤 Parquet 파일이 유효한지 추적합니다.
테이블 읽기 저장한 테이블을 다시 읽어봅시다. .read.format("delta").load(delta_path)를 사용합니다.
저장할 때와 반대 순서입니다. 경로를 지정하면 자동으로 최신 버전의 데이터를 읽습니다.
.show() 메서드는 데이터를 화면에 출력합니다. 기본적으로 20개 행을 보여줍니다.
우리는 4개 행밖에 없으므로 전부 표시됩니다. 테이블 형식으로 예쁘게 출력됩니다.
컬럼 이름이 헤더에 나오고, 각 행의 데이터가 정렬되어 표시됩니다. SQL로 쿼리하기 DataFrame API 대신 SQL을 선호하는 사람도 많습니다.
Delta 테이블을 Spark SQL 카탈로그에 등록할 수 있습니다. CREATE TABLE 명령에 USING DELTA와 LOCATION을 지정합니다.
이제 테이블 이름(users)으로 직접 쿼리할 수 있습니다. 일반 SQL 문법을 그대로 사용할 수 있습니다.
SELECT, WHERE, JOIN, GROUP BY 모두 작동합니다. SQL에 익숙한 분석가들이 바로 사용할 수 있습니다.
WHERE age > 28로 필터링하면 조건에 맞는 행만 반환됩니다. 이영희(32세)와 정수진(29세)이 결과에 나타납니다.
코드 실행 결과 코드를 실행하면 어떻게 될까요? 먼저 Spark가 초기화되면서 몇 줄의 로그가 출력됩니다.
"Using Spark's default log4j profile" 같은 메시지는 무시해도 됩니다. 데이터프레임을 만들 때는 즉시 실행되지 않습니다.
Spark는 지연 평가(lazy evaluation)를 사용합니다. 실제로 데이터가 필요한 시점(.show()나 .save() 호출)에만 계산합니다.
.save() 메서드가 호출될 때 실제 파일이 생성됩니다. 몇 초 안에 완료됩니다.
작은 데이터이므로 빠릅니다. .show() 메서드는 데이터를 읽어서 화면에 표시합니다.
4개 행이 표 형식으로 출력됩니다. 첫 Delta 테이블의 의미 한개발 씨의 화면에 메시지가 떴습니다.
"첫 번째 Delta 테이블이 성공적으로 생성되었습니다!" 작은 화면이지만 큰 의미가 있습니다. 이제 ACID 트랜잭션이 보장되는 데이터 레이크를 사용할 수 있게 되었습니다.
데이터를 안전하게 업데이트할 수 있고, 과거 버전으로 되돌릴 수도 있습니다. 다음 단계 송시니어 씨가 말했습니다.
"축하합니다! 이제 더 재미있는 것들을 해볼 수 있어요." 데이터를 추가하고, 수정하고, 삭제할 수 있습니다.
UPDATE, DELETE, MERGE 명령을 사용할 수 있습니다. 타임 트래블로 과거 버전을 조회할 수도 있습니다.
파일을 최적화하여 성능을 개선할 수도 있습니다. 하지만 가장 중요한 첫 단계를 완료했습니다.
Delta 테이블을 만드는 방법을 배웠습니다. 실무에서의 확장 실제 프로젝트에서는 어떻게 사용할까요?
데이터베이스에서 데이터를 읽어와서 Delta 테이블로 저장할 수 있습니다. Kafka 같은 스트리밍 소스에서 실시간 데이터를 받아 Delta 테이블에 append할 수도 있습니다.
여러 소스의 데이터를 Delta 테이블에 통합하여 데이터 웨어하우스를 구축할 수도 있습니다. Delta Lake는 확장성이 뛰어납니다.
기가바이트에서 페타바이트까지 같은 방식으로 작동합니다. 지금 배운 기본 패턴이 모든 규모에 적용됩니다.
실전 팁
💡 - 프로덕션에서는 파티션 컬럼을 지정하세요 (.partitionBy("date"))
- 테이블 속성(table properties)으로 Delta Lake 동작을 세밀하게 제어할 수 있습니다
- 초기 데이터 로드 후 OPTIMIZE와 VACUUM을 실행하여 파일 구조를 최적화하세요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.