기본 콘텐츠로 건너뛰기

추천 가젯

배민·쿠팡이츠 과징금 6319억 원 잠정, 주문할 때 달라지는 건?

공정거래위원회가 11월 9일 배달의민족과 쿠팡이츠 운영사에 시정명령을 내리고 잠정 과징금 총 6319억 원을 부과하기로 한 결정을 공개했습니다. 주문하는 사람에게 직접 닿는 쟁점은 같은 음식점의 메뉴 가격과 최소주문금액을 앱마다 다르게 정할 수 있는지, 화면에 뜨는 예상 시간이 배달 방식별로 어떻게 계산됐는지입니다. 2024년 3월 쿠팡이츠 무료배달 도입 당시 자료. 쿠팡 뉴스룸 제공 공정위가 문제 삼은 메뉴 가격과 최소주문금액 공정위는 10월 29일 배민 운영사 우아한형제들에 3311억 원, 쿠팡에 3008억 원의 잠정 과징금을 부과하기로 결정했습니다. 공정위에 따르면 두 업체는 음식점에 메뉴 가격이나 최소주문금액을 경쟁 앱보다 불리하지 않게 맞추라고 요구했습니다. 예를 들어 한 음식점이 수수료가 더 낮은 앱에서 메뉴를 더 싸게 팔려 해도, 다른 앱이 같은 가격을 요구하면 앱별 가격 경쟁이 어려워집니다. 공정위는 이런 요구가 배달앱 간 경쟁을 약화시켰다고 판단했습니다. 배민의 배달 예상 시간과 쿠팡이츠의 수수료 배민의 가게배달은 음식점이 배달을 맡고, 배민의 자체배달은 플랫폼이 배달까지 맡습니다. 공정위는 배민이 두 방식의 예상 시간을 서로 다른 기준으로 계산하면서 그 차이를 충분히 알리지 않았다고 봤습니다. 또 가게배달의 화면 노출 축소 등을 문제 삼아 가게배달 중개수수료율을 다시 정하도록 했습니다. 쿠팡이츠에는 음식점이 부담한 할인액까지 포함해 중개·결제 수수료를 계산하는 약관 조항을 고치도록 했습니다. 무료배달 혜택과 메뉴 가격은 언제 달라질까 이번 발표에서 메뉴 가격 인하나 무료배달 혜택 변경 날짜는 확인되지 않았습니다. 쿠팡 와우 멤버십과 쿠팡이츠 서비스 결합에 관한 별도 쟁점은 공정위가 다시 심사하기로 했습니다. 보도에 따르면 우아한형제들은 위법성이 없다는 설명이 받아들여지지 않은 데 아쉬움을 표했고, 쿠팡은 와우매장 정책의 취지와 과징금 산정 방식에 대한 입장을 밝혔습니다. 두 회사 모두 의결서를 검토하겠다고 했습니다. 주문할 때는...

파이썬 pathlib 완전 정복 🧭 — 파일·디렉터리 경로를 우아하게 다루기

파이썬 pathlib 완전 정복 🧭 — 파일·디렉터리 경로를 우아하게 다루기 pathlib 아이콘

파이썬 pathlib 완전 정복 🧭

더 이상 os.path.join에 문자열 난무는 그만! pathlib.Path는 객체지향 경로 API로 읽기/쓰기, 탐색, 이동/삭제를 깔끔하고 안전하게 처리합니다.

1) Path 생성과 결합

from pathlib import Path

p = Path("data") / "images" / "cat.png"  # '/' 연산자로 결합
print(p)         # OS별 구분자로 출력
print(p.exists(), p.is_file(), p.is_dir())

home = Path.home()
cwd  = Path.cwd()
print(home, cwd)

2) 파일 읽기/쓰기

from pathlib import Path

txt = Path("notes.txt")
txt.write_text("안녕하세요\npathlib 예제입니다.", encoding="utf-8")  # 생성+쓰기
print(txt.read_text(encoding="utf-8"))                                 # 읽기

binf = Path("logo.png")
data = binf.read_bytes()  # 바이너리 읽기
Path("copy.png").write_bytes(data)  # 바이너리 쓰기
대용량 파일은 open()으로 스트리밍하며 처리하세요.

3) 탐색: iterdir, glob, rglob

from pathlib import Path

root = Path("src")

# 1) 1단계 하위만
for child in root.iterdir():
    print(child)

# 2) 패턴 매칭
for py in root.glob("*.py"):       # 바로 아래에서만
    print(py)

# 3) 재귀 탐색
for py in root.rglob("*.py"):      # 하위 전체
    print(py)

4) 경로 속성과 변형

from pathlib import Path

p = Path("archive/2025/report.csv")
print(p.name)        # 'report.csv'
print(p.stem)        # 'report'
print(p.suffix)      # '.csv'
print(p.suffixes)    # ['.csv']
print(p.parent)      # 'archive/2025'
print(p.parts)       # ('archive','2025','report.csv')

# 이름/확장자 교체
print(p.with_name("summary.csv"))
print(p.with_suffix(".parquet"))

# 절대/해결
print(p.resolve())   # 심볼릭 링크·상대경로 해소
# print(p.relative_to("archive"))  # '2025/report.csv'

5) 파일·디렉터리 조작

from pathlib import Path

# 디렉터리 만들기
out = Path("output/reports")
out.mkdir(parents=True, exist_ok=True)

# 이동/이름변경
src = Path("temp/data.csv")
dst = Path("output/data.csv")
src.replace(dst)  # 같은 디스크면 거의 'mv'

# 안전 삭제
trash = Path("output/old.csv")
if trash.exists():
    trash.unlink()   # 파일만 삭제 (디렉터리는 rmdir)
# 디렉터리 전체 삭제는 shutil.rmtree(out) 사용
주의: unlink()는 파일만 삭제합니다. 디렉터리는 rmdir() 또는 shutil.rmtree()를 사용하세요.

6) 실전 레시피

6-1. 다운로드 폴더를 확장자별로 정리

from pathlib import Path

dl = Path.home() / "Downloads"
for f in dl.iterdir():
    if f.is_file():
        target = dl / f.suffix.lstrip(".").lower()
        target.mkdir(exist_ok=True)
        f.replace(target / f.name)

6-2. 프로젝트 전체 파이썬 파일 수와 총 크기

from pathlib import Path

root = Path(".")
files = list(root.rglob("*.py"))
total_size = sum(f.stat().st_size for f in files)
print(len(files), "files,", total_size, "bytes")

6-3. 날짜 prefix로 일괄 리네임

from pathlib import Path
from datetime import date

albums = Path("photos/album1")
prefix = date.today().strftime("%Y%m%d") + "_"

for f in albums.glob("*.jpg"):
    f.replace(f.with_name(prefix + f.name))

7) 크로스플랫폼 팁

  • 경로 결합은 항상 / 연산자로: Path("a") / "b"
  • 문자열로 출력이 필요하면 str(p) 또는 p.as_posix()
  • Windows 예약 이름/NFC 정규화 등 특수 케이스는 OS별 차이가 있으니 테스트 권장
  • PurePath 계열은 파일 시스템 접근 없이 경로 계산만 할 때 사용

요약

  • pathlib.Path 하나로 경로 조작·입출력·탐색을 객체지향적으로 처리
  • glob/rglob으로 쉽고 빠른 패턴 탐색
  • with_suffix/with_name/replace로 안전한 이름 변경·이동
  • 크로스플랫폼 이식성과 가독성 ↑

자주 묻는 질문(FAQ)

Q1. 문자열만 쓰던 코드와 함께 쓸 수 있나요?
A. 대부분의 표준 라이브러리가 Path를 직접 받거나 자동 변환합니다. 필요하면 str(Path(...))를 넘기세요.

Q2. 디렉터리 비우기/재귀 삭제는 어떻게 하나요?
A. pathlib 자체는 제공하지 않으므로 shutil.rmtree(Path(...))를 사용하세요.

Q3. 파일 잠금/동시성 제어가 필요한데요?
A. 플랫폼별 잠금은 별도 라이브러리를 사용하세요(filelock 등). pathlib는 경로 API에 집중합니다.

댓글

가장 많이 본 글

Icons by Flaticon