본문으로 바로가기
TaeyoungKim.dev

S3 폴더는 실제 디렉터리일까? 객체 키 prefix와 빈 폴더의 정체

클라우드작성 약 3분 읽기TaeyoungKim
LinkedInX

S3 콘솔에서 logs 폴더를 만들었다. 그런데 객체 목록을 코드로 읽으니 logs/라는 0바이트 객체가 나온다. '폴더를 만들었는데 파일이 생겼다고?' 파일 탐색기와 같은 모습이라 더 헷갈린다. 여기서는 콘솔의 폴더 표시와 S3에 저장된 객체 키를 같은 예제로 구분해 보자.

S3 폴더는 왜 실제 디렉터리가 아닐까?

일반 목적 S3 버킷의 기본 저장 단위는 객체다. 각 객체에는 버킷 안에서 이름 역할을 하는 키(key)가 있다. 예를 들어 logs/app.log는 logs 디렉터리 안의 파일이라기보다, 슬래시(/)가 들어 있는 하나의 객체 키다. 콘솔은 공통으로 시작하는 logs/ 부분을 모아 폴더처럼 보여 준다.

그림의 왼쪽은 저장된 키 이름, 오른쪽은 그 이름을 콘솔에서 묶어 보여 준 화면 구조다. logs-old/app.log처럼 비슷해 보이지만 접두사가 다른 키는 logs 폴더에 들어가지 않는다. 오른쪽에 계층이 그려졌다고 객체가 실제 하위 디렉터리로 이동한 것도 아니다.

빈 폴더를 만들었는데 왜 0바이트 객체가 보일까?

다음은 한 버킷에 있다고 가정한 객체 키 세 개다.

  • logs/: 콘솔에서 빈 logs 폴더를 만들 때 생성된 0바이트 표시 객체
  • logs/app.log: 콘솔의 logs 안에 보이는 실제 로그 객체
  • logs-old/app.log: logs-old 안에 보이는 별개의 객체

콘솔에서 ‘폴더 만들기’로 빈 logs를 생성하면 키가 logs/인 0바이트 객체를 만든다. AWS의 S3 폴더 설명도 일반 목적 버킷의 평평한 구조와 이 표시 객체를 구분한다. 반면 logs/app.log를 바로 업로드했다면 logs/ 객체를 따로 만들지 않아도 콘솔에는 logs 폴더가 보일 수 있다. 폴더를 보여 주는 근거가 공통 접두사이기 때문이다.

따라서 logs/ 표시 객체만 지워도 logs/app.log가 남아 있다면 폴더처럼 보이는 묶음은 남는다. 둘 다 없다면 그 이름의 빈 폴더를 유지할 실제 객체도 없다. 폴더 모양과 0바이트 객체를 같은 것으로 취급하지 않는 것이 핵심이다.

prefix로 조회할 때 logs와 logs/는 무엇이 다를까?

접두사 검색은 글자 그대로 ‘이 문자열로 시작하는 키’를 찾는다. 위 세 키에서 logs로 찾으면 logs-old/app.log까지 걸린다. logs/로 좁히면 logs/ 표시 객체와 logs/app.log만 남는다. 슬래시 하나가 다른 작업의 로그를 섞지 않게 한다.

python
keys = ["logs/", "logs/app.log", "logs-old/app.log"]

print([key for key in keys if key.startswith("logs")])
print([key for key in keys if key.startswith("logs/")])
print([key for key in keys if key.startswith("logs/") and key != "logs/"])
text
['logs/', 'logs/app.log', 'logs-old/app.log']
['logs/', 'logs/app.log']
['logs/app.log']

이 짧은 코드는 S3에 접속하는 대신 객체 키의 문자열 조건만 검산한다. 실제 목록 API에서도 Prefix로 logs/를 지정할 때는 표시 객체 logs/가 결과에 포함될 수 있으므로, 파일만 처리할 때는 그 키를 한 번 더 구분해야 한다. 폴더를 정리하거나 경로별 파일 수를 셀 때 특히 유용한 차이다.

핵심 요약

일반 목적 S3 버킷의 ‘폴더’는 객체 키의 공통 접두사를 콘솔이 묶어 보여 준 것이다. 콘솔에서 빈 폴더를 직접 만들면 logs/ 같은 0바이트 객체가 생길 수 있지만, 하위 객체가 있으면 그 표시 객체 없이도 폴더가 보인다. 목록을 logs로 검색하면 logs-old까지 섞일 수 있으니, 의도한 경계가 폴더라면 logs/로 조회하고 표시 객체와 실제 파일을 구분하자.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#Amazon S3#S3 폴더#객체 키#prefix#객체 스토리지

함께 읽으면 좋은 글