[CLOUD-007][중급] 관리형 데이터베이스와 캐시 역할 나누기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[CLOUD-007][중급] 관리형 데이터베이스와 캐시 역할 나누기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 145회 작성일 26-09-02 18:39

본문

[이번 수업]
관리형 데이터베이스와 캐시의 책임·조회 흐름을 로컬 예제로 확인합니다.

[선수지식]
CLOUD-003의 최소 권한, CLOUD-004의 네트워크 경계, DB-006의 트랜잭션과 DB-007의 운영 기초를 알고 Python을 실행할 수 있어야 합니다.

[학습목표]
1. 관리형 데이터베이스와 직접 운영의 책임 차이를 설명한다.
2. 데이터베이스와 캐시의 역할을 구분한다.
3. 캐시 미스와 무효화 흐름을 구현한다.

[핵심개념]
관리형 데이터베이스는 기반 장비, 데이터베이스 설치·일부 패치, 백업·복제·모니터링 기능을 서비스와 선택 옵션에 따라 제공합니다. 하지만 스키마, 쿼리, 인덱스, 계정 권한, 네트워크 공개 범위, 비용, 보존 기간과 복구 시험까지 자동으로 결정해 주지는 않습니다. `관리형`은 운영 업무가 없어지는 뜻이 아니라 책임 경계가 바뀐다는 뜻입니다.

데이터베이스는 주문·회원처럼 잃으면 안 되는 원본 기록의 기준입니다. 캐시는 자주 읽는 결과의 복사본을 빠른 저장공간에 잠시 두어 반복 조회를 줄입니다. 캐시 데이터는 만료되거나 메모리 정책에 따라 제거될 수 있으므로 원본으로 간주하면 안 됩니다.

캐시 어사이드(cache-aside)는 애플리케이션이 캐시를 먼저 조회하고, 없으면 데이터베이스에서 읽어 캐시에 넣는 방식입니다. 원본을 바꾼 뒤에는 관련 캐시를 지우거나 갱신해야 오래된 값이 남지 않습니다. 만료 시간(TTL)은 값이 유지될 최대 시간을 정하지만 즉시 일관성을 보장하지는 않습니다.

[따라하기]
아래 코드를 `managed_cache_demo.py`로 저장합니다. 외부 패키지나 클라우드 계정은 필요 없습니다. SQLite는 로컬 원본, `lru_cache`는 작은 캐시 역할입니다.

```python
from functools import lru_cache
import sqlite3

db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE product (id INTEGER PRIMARY KEY, name TEXT)")
db.execute("INSERT INTO product VALUES (?, ?)", (1, "키보드"))
db.commit()

@lru_cache(maxsize=2)
def find_name(product_id):
    print("database read")
    row = db.execute(
        "SELECT name FROM product WHERE id = ?", (product_id,)
    ).fetchone()
    return row[0] if row else None

print(find_name(1))
print(find_name(1))
db.execute("UPDATE product SET name = ? WHERE id = ?", ("마우스", 1))
db.commit()
find_name.cache_clear()
print(find_name(1))
```

Windows는 PowerShell에서 `py managed_cache_demo.py`, macOS·Linux는 터미널에서 `python3 managed_cache_demo.py`를 실행합니다. 두 번째 조회에는 `database read`가 없고, 원본 변경 뒤 캐시를 지워 새 값이 나옵니다.

```text
database read
키보드
키보드
database read
마우스
```

실무 캐시는 여러 프로세스가 공유하고 키별 만료 시간을 둘 수 있습니다. 이 예제의 `cache_clear()`는 모든 항목을 지우는 학습용 단순화입니다.

[흔한 실수]
- 관리형 서비스가 스키마·권한·복구까지 책임진다고 생각한다.
- 캐시를 유일한 원본 저장소로 사용한다.
- 데이터베이스를 수정한 뒤 캐시를 무효화하지 않는다.
- 만료 시간이 너무 길어 오래된 값을 계속 보여준다.
- 같은 캐시 미스가 몰릴 때 데이터베이스 부하를 제한하지 않는다.

[보안 주의]
실습은 로컬 메모리 데이터베이스에서만 실행합니다. 실제 연결 문자열과 암호는 코드에 넣지 말고 비밀 저장소나 안전한 환경 설정으로 주입합니다. 관리형 데이터베이스와 캐시는 사설 네트워크, 암호화 연결, 최소 권한 계정으로 제한하고 공개 인터넷에 바로 노출하지 않습니다. 캐시에 비밀번호·토큰·민감정보를 불필요하게 저장하거나 로그로 남기지 않습니다. 자동 백업이 켜져 있어도 목표 시점까지 복구되는지 별도로 시험합니다.

[직접 해볼 과제]
상품 2를 추가하고 `maxsize=2` 캐시에 세 상품을 차례로 조회해 보세요. 어떤 항목이 다시 데이터베이스에서 읽히는지 기록하고, 상품 수정 후 캐시를 지우지 않았을 때 오래된 값이 남는지도 확인합니다.

[확인문제]
1. 관리형 데이터베이스를 써도 사용자가 결정해야 하는 것은 무엇인가요?
2. 캐시 데이터를 원본으로 사용하면 안 되는 이유는 무엇인가요?
3. 원본을 수정한 뒤 관련 캐시에 필요한 조치는 무엇인가요?

[다음 학습]
다음 DEVOPS-007에서는 설정, 비밀정보와 배포 아티팩트를 안전하게 나누어 관리합니다.

[공식 참고 자료]
- 관리형 관계형 데이터베이스 문서: https://docs.aws.amazon.com/rds/
- 관리형 데이터베이스 백업 문서: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html
- 캐시 키 제거 정책: https://redis.io/docs/latest/develop/reference/eviction/
- 캐시 변경 추적과 무효화: https://redis.io/docs/latest/develop/clients/client-side-caching/
- Python sqlite3: https://docs.python.org/3/library/sqlite3.html
- Python lru_cache: https://docs.python.org/3/library/functools.html#functools.lru_cache

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
892
어제
5,103
최대
16,772
전체
771,946
Copyright © 소유하신 도메인. All rights reserved.