Skip to main content
SonamuλŠ” 파일 μ—…λ‘œλ“œμ™€ μ €μž₯을 μœ„ν•œ 톡합 μŠ€ν† λ¦¬μ§€ μ‹œμŠ€ν…œμ„ μ œκ³΅ν•©λ‹ˆλ‹€. 둜컬 파일 μ‹œμŠ€ν…œ(fs)κ³Ό AWS S3λ₯Ό μ§€μ›ν•˜λ©°, ν™˜κ²½μ— 따라 μ‰½κ²Œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

기본 ꡬ쑰

drivers

μ‚¬μš©ν•  μŠ€ν† λ¦¬μ§€ λ“œλΌμ΄λ²„λ“€μ„ μ •μ˜ν•©λ‹ˆλ‹€. "fs"(둜컬 파일 μ‹œμŠ€ν…œ)와 "s3"(AWS S3) 두 μ’…λ₯˜λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. νƒ€μž…: Record<DriverKey, () => DriverContract> (DriverKey = "fs" | "s3")
파일 μ €μž₯ μ‹œ saveToDisk(diskName, key) ν˜ΈμΆœμ—μ„œ μ‚¬μš©ν•  λ“œλΌμ΄λ²„λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€. ν™˜κ²½λ³„λ‘œ λ‹€λ₯Έ λ“œλΌμ΄λ²„λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ ν™˜κ²½ λ³€μˆ˜λ₯Ό ν™œμš©ν•˜μ—¬ μ½”λ“œ λ ˆλ²¨μ—μ„œ λΆ„κΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

fs λ“œλΌμ΄λ²„

둜컬 파일 μ‹œμŠ€ν…œμ— νŒŒμΌμ„ μ €μž₯ν•©λ‹ˆλ‹€. 개발 ν™˜κ²½μ— μ ν•©ν•©λ‹ˆλ‹€.

location

파일이 μ €μž₯될 디렉토리 κ²½λ‘œμž…λ‹ˆλ‹€. νƒ€μž…: string (ν•„μˆ˜)
경둜 μ˜ˆμ‹œ:

visibility

파일의 μ ‘κ·Ό κΆŒν•œμ„ μ„€μ •ν•©λ‹ˆλ‹€. νƒ€μž…: "public" | "private"
  • "public": λˆ„κ΅¬λ‚˜ URL둜 μ ‘κ·Ό κ°€λŠ₯
  • "private": 인증된 μ‚¬μš©μžλ§Œ μ ‘κ·Ό κ°€λŠ₯

urlBuilder

파일 URL을 μƒμ„±ν•˜λŠ” ν•¨μˆ˜λ“€μ„ μ •μ˜ν•©λ‹ˆλ‹€.
generateURL: 파일의 곡개 URL을 μƒμ„±ν•©λ‹ˆλ‹€.
  • key: 파일의 고유 ν‚€ (예: "profile-images/user-123.jpg")
  • λ°˜ν™˜: μ ‘κ·Ό κ°€λŠ₯ν•œ URL
generateSignedURL: μž„μ‹œλ‘œ μ ‘κ·Ό κ°€λŠ₯ν•œ μ„œλͺ…λœ URL을 μƒμ„±ν•©λ‹ˆλ‹€.
  • key: 파일의 고유 ν‚€
  • expiresIn: 만료 μ‹œκ°„ (초, 선택적)
  • λ°˜ν™˜: μž„μ‹œ URL

s3 λ“œλΌμ΄λ²„

AWS S3에 νŒŒμΌμ„ μ €μž₯ν•©λ‹ˆλ‹€. ν”„λ‘œλ•μ…˜ ν™˜κ²½μ— μ ν•©ν•©λ‹ˆλ‹€.

credentials

AWS 인증 정보λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. νƒ€μž…: (ν•„μˆ˜)
AWS 인증 μ •λ³΄λŠ” λ°˜λ“œμ‹œ ν™˜κ²½ λ³€μˆ˜λ‘œ κ΄€λ¦¬ν•˜μ„Έμš”. μ½”λ“œμ— 직접 μž‘μ„±ν•˜μ§€ λ§ˆμ„Έμš”!
.env:

region

S3 버킷이 μœ„μΉ˜ν•œ AWS λ¦¬μ „μž…λ‹ˆλ‹€. νƒ€μž…: string (ν•„μˆ˜)
μ£Όμš” 리전:
  • ap-northeast-2 - μ„œμšΈ
  • us-east-1 - λ²„μ§€λ‹ˆμ•„ 뢁뢀
  • us-west-2 - 였레곀
  • eu-west-1 - μ•„μΌλžœλ“œ
  • ap-southeast-1 - 싱가포λ₯΄

bucket

νŒŒμΌμ„ μ €μž₯ν•  S3 버킷 μ΄λ¦„μž…λ‹ˆλ‹€. νƒ€μž…: string (ν•„μˆ˜)
ν™˜κ²½λ³„λ‘œ λ‹€λ₯Έ 버킷 μ‚¬μš©:

visibility

S3 객체의 ACL(Access Control List)을 μ„€μ •ν•©λ‹ˆλ‹€. νƒ€μž…: "public" | "private"
  • "public": 퍼블릭 읽기 ν—ˆμš© (public-read ACL)
  • "private": 프라이빗 (private ACL, κΈ°λ³Έκ°’)

μ‹€μ „ μ˜ˆμ‹œ

개발 ν™˜κ²½: fs만 μ‚¬μš©

fs + S3 (ν™˜κ²½λ³„ μ „ν™˜)

두 λ“œλΌμ΄λ²„λ₯Ό λͺ¨λ‘ λ“±λ‘ν•˜κ³ , μ½”λ“œμ—μ„œ ν™˜κ²½ λ³€μˆ˜λ₯Ό 기반으둜 μ‚¬μš©ν•  λ“œλΌμ΄λ²„λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.
.env.development:
.env.production:
ν˜„μž¬ DriverKeyλŠ” "fs"와 "s3" 두 κ°€μ§€λ§Œ μ§€μ›ν•©λ‹ˆλ‹€. 곡개/λΉ„κ³΅κ°œ νŒŒμΌμ„ 별도 버킷에 λ‚˜λˆ„μ–΄ μ €μž₯ν•˜λŠ” 닀쀑 버킷 ꡬ성은 ν˜„μž¬ μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

파일 μ—…λ‘œλ“œ μ‚¬μš©

μŠ€ν† λ¦¬μ§€ μ„€μ • ν›„ @upload λ°μ½”λ ˆμ΄ν„°μ™€ BufferedFile.saveToDisk()λ₯Ό μ‚¬μš©ν•˜μ—¬ νŒŒμΌμ„ μ—…λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β†’ 파일 μ—…λ‘œλ“œ κ°€μ΄λ“œ

S3 버킷 μ„€μ •

S3λ₯Ό μ‚¬μš©ν•˜κΈ° 전에 AWS μ½˜μ†”μ—μ„œ 버킷을 μƒμ„±ν•˜κ³  μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

1. 버킷 생성

2. CORS μ„€μ •

ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ 직접 μ—…λ‘œλ“œν•˜λ €λ©΄ CORSλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. S3 μ½˜μ†” β†’ 버킷 β†’ κΆŒν•œ β†’ CORS ꡬ성:

3. IAM κΆŒν•œ

Sonamuκ°€ S3에 μ ‘κ·Όν•˜λ €λ©΄ μ μ ˆν•œ IAM κΆŒν•œμ΄ ν•„μš”ν•©λ‹ˆλ‹€. μ΅œμ†Œ κΆŒν•œ μ •μ±…:

μ£Όμ˜μ‚¬ν•­

1. ν™˜κ²½ λ³€μˆ˜ λ³΄μ•ˆ

2. visibility 선택

3. 파일 경둜 섀계

λ‹€μŒ 단계

μŠ€ν† λ¦¬μ§€ 섀정을 μ™„λ£Œν–ˆλ‹€λ©΄: