기본 콘텐츠로 건너뛰기

추천 가젯

리액트 + 비트(Vite)로 모바일 청첩장 만들기 — 1편

모바일 청첩장 시리즈 1편 · 기획/스택/배포 리액트 + 비트(Vite)로 모바일 청첩장 만들기 — 1편 안녕하세요, 이번에 결혼 준비를 하면서 여자친구와 같이 모바일 청첩장 을 만들고 있어요. 여자친구가 디자인을 해서 전달해주면 제가 개발을 진행하고 있어요. 이 글은 구현기 1편 으로, 전체 흐름과 스택, 배포 구성까지 “부담 없이” 훑어봅니다. (코드는 여러 버전 테스트 중!) 이 글에서 보는 것 왜 SPA 모바일 청첩장인가? 기본 스택 & 폴더 구조 라우팅 선택: HashRouter가 편한 이유 Cloudflare Pages로 자동 배포 현재 진행 중인 UI 버전들(테스트 기록) 1) 왜 SPA 모바일 청첩장인가? 모바일 청첩장은 핵심이 명확해요. 가볍고 빠르고 끊김이 없어야 하고, 사진/지도/일정이 터치에 친화적 이어야 합니다. 그래서 React + Vite 로 싱글 페이지 앱(SPA)을 구성했고, 정적 호스팅(CDN)인 Cloudflare Pages 에 올려 GitHub 푸시 → 자동 배포 까지 한 번에 묶었습니다. UX 팁 · 이미지 WebP, loading="lazy" 기본 · 큰 터치 타깃 · BGM은 “사용자 탭 후” 재생(모바일 정책) 2) 기본 스택 & 폴더 구조 서버는 따로 두지 않았고, 정적 빌드 결과물( dist/ )만 올립니다. 현재 의존성은 아래와 같아요. package.json(요약) { "name": ...

🧩 contextlib으로 안전한 리소스 관리 마스터하기

Contextlib icon

🧩 contextlib으로 안전한 리소스 관리 마스터하기

contextlib는 `with` 문과 함께 리소스 정리, 예외 무시, 출력 리디렉션 등을 간편하게 처리할 수 있는 유용한 표준 라이브러리입니다. 이번 포스트에서는 고급 활용 사례를 중심으로 자세히 살펴봅니다.

✅ 1. `@contextmanager`로 간편하게 컨텍스트 정의

from contextlib import contextmanager

@contextmanager
def open_file(path, mode):
    f = open(path, mode, encoding='utf-8')
    try:
        yield f
    finally:
        f.close()

with open_file('test.txt', 'w') as f:
    f.write('Hello Contextlib!')
  • ✨ `try/finally` 구조를 명확하게 하나의 함수로 구현.
  • 📌 리소스 누수 방지에 유용하고, 코드 재사용이 편리.

✅ 2. `closing()`: close() 메서드 있는 객체 안전하게 사용

from contextlib import closing
from urllib.request import urlopen

with closing(urlopen('https://www.example.com')) as page:
    print(page.status, len(page.read()))  # HTTP 응답 상태 코드와 바이트 수 출력
  • HTTP 응답, DB 커넥션, 파일 등 닫는 메서드를 가진 객체 안전하게 종료 가능.

✅ 3. `suppress()`: 특정 예외 무시하기

from contextlib import suppress
import os

with suppress(FileNotFoundError):
    os.remove('non_exist.tmp')
print("에러 없이 종료되었습니다.")
  • 예외 처리 코드가 필요 없을 때 간단하게 사용 가능.
  • 단, 모든 예외를 무시하지 않도록 패턴 적절히 선택하세요.

✅ 4. `redirect_stdout()`: 출력 리디렉션

from contextlib import redirect_stdout

import io

buffer = io.StringIO()
with redirect_stdout(buffer):
    print("이 문장은 buffer에 기록됩니다.")
print("Buffer 내용:", buffer.getvalue().strip())
  • 테스트 코드, 로깅, 스트림 캡처 등에 유용하게 활용.

✅ 5. 커스텀 컨텍스트: 실행 시간 측정기

from contextlib import contextmanager
import time

@contextmanager
def timer(msg):
    start = time.perf_counter()
    try:
        yield
    finally:
        elapsed = time.perf_counter() - start
        print(f"[TIMER] {msg} 소요 시간: {elapsed:.3f}s")

with timer("무겁게 계산"):
    sum(range(10000000))
  • 성능 측정, 로그 출력, 실행 시간 보고 등 실제 프로젝트에 유용.

✅ 6. 예제 비교: without vs with contextlib

# 일반 방식
import time
start = time.time()
# 파일 open/write
elapsed = time.time() - start
print("걸린 시간:", elapsed)

# with 방식
with timer("파일 쓰기"):
    open('a.txt','w').write('123')
  • 코드의 가독성, 일관성, 재사용성 모두 `with + contextlib` 방식이 우수.

✨ 요약 & 활용 팁

  • @contextmanager로 리소스 관리를 단순화
  • closing()으로 close() 지원 객체 안전 종료
  • suppress()로 특정 예외 간결하게 처리
  • redirect_stdout()로 출력 캡처/주입 가능
  • 컨텍스트 조합으로 커스텀 로깅, 타이밍 제어도 쉽게 구현
  • 가독성, 유지보수, 성능 로깅 모두 향상!

댓글

가장 많이 본 글

Icons by Flaticon