Skip to main content
@upload λ°μ½”λ ˆμ΄ν„°λŠ” 파일 μ—…λ‘œλ“œλ₯Ό μ²˜λ¦¬ν•˜λŠ” APIλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. Multipart form-data μš”μ²­μ„ μžλ™μœΌλ‘œ νŒŒμ‹±ν•˜κ³ , 파일 객체λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. @api λ°μ½”λ ˆμ΄ν„° 없이도 λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•  수 있으며, μžλ™μœΌλ‘œ POST λ©”μ„œλ“œμ™€ multipart ν΄λΌμ΄μ–ΈνŠΈ(axios-multipart, tanstack-mutation-multipart)λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

μ—…λ‘œλ“œ λͺ¨λ“œ

SonamuλŠ” 두 κ°€μ§€ 파일 μ—…λ‘œλ“œ λͺ¨λ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

Buffer λͺ¨λ“œ (κΈ°λ³Έ)

Buffer λͺ¨λ“œλŠ” νŒŒμΌμ„ λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•œ ν›„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. MD5 ν•΄μ‹œ 계산, 이미지 리사이징 λ“± 파일 λ‚΄μš©μ„ 직접 닀뀄야 ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

BufferedFile 객체

saveToDisk의 νŒŒλΌλ―Έν„° μˆœμ„œλŠ” (diskName, key) μž…λ‹ˆλ‹€.

Stream λͺ¨λ“œ

Stream λͺ¨λ“œλŠ” νŒŒμΌμ„ λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•˜μ§€ μ•Šκ³  μ¦‰μ‹œ μ €μž₯μ†Œλ‘œ μŠ€νŠΈλ¦¬λ°ν•©λ‹ˆλ‹€. λŒ€μš©λŸ‰ 파일 μ—…λ‘œλ“œμ— μ ν•©ν•©λ‹ˆλ‹€.

UploadedFile 객체

Stream λͺ¨λ“œμ—μ„œλŠ” 파일이 이미 μ €μž₯μ†Œμ— μ—…λ‘œλ“œλœ μƒνƒœλ‘œ λ©”νƒ€λ°μ΄ν„°λ§Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜΅μ…˜

guards

μ—…λ‘œλ“œ API에 μ μš©ν•  κ°€λ“œλ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. 인증이 ν•„μš”ν•œ μ—…λ‘œλ“œ APIμ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.

description

API μ„€λͺ…을 μ§€μ •ν•©λ‹ˆλ‹€. μžλ™ μƒμ„±λ˜λŠ” API λ¬Έμ„œμ— ν‘œμ‹œλ©λ‹ˆλ‹€.

limits

파일 μ—…λ‘œλ“œ μ œν•œμ„ μ„€μ •ν•©λ‹ˆλ‹€. Fastify multipart의 limits μ˜΅μ…˜μ„ κ·ΈλŒ€λ‘œ λ°›μŠ΅λ‹ˆλ‹€.

파일 정보 확인

파일 처리 (Buffer λͺ¨λ“œ)

Buffer μ ‘κ·Ό

파일 μ €μž₯

MD5 ν•΄μ‹œ 계산

μŠ€ν† λ¦¬μ§€ λ“œλΌμ΄λ²„ μ‚¬μš©

SonamuλŠ” μ—¬λŸ¬ μŠ€ν† λ¦¬μ§€ λ“œλΌμ΄λ²„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
μŠ€ν† λ¦¬μ§€ λ“œλΌμ΄λ²„λŠ” sonamu.config.tsμ—μ„œ μ„€μ •ν•©λ‹ˆλ‹€. 첫 번째 νŒŒλΌλ―Έν„°λ‘œ λ””μŠ€ν¬ 이름을 μ „λ‹¬ν•©λ‹ˆλ‹€.

λ‹€λ₯Έ λ°μ½”λ ˆμ΄ν„°μ™€ ν•¨κ»˜ μ‚¬μš©

@transactionalκ³Ό ν•¨κ»˜

ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μš© (Web)

SonamuλŠ” μžλ™μœΌλ‘œ 파일 μ—…λ‘œλ“œ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

Axios (단일 파일)

Axios (μ—¬λŸ¬ 파일)

React μ˜ˆμ‹œ

TanStack Query μ˜ˆμ‹œ

파일 검증

MIME νƒ€μž… 검증

파일 크기 검증

파일 ν™•μž₯자 검증

이미지 처리

Sharp μ‚¬μš©

μ œμ•½μ‚¬ν•­

1. @api λ°μ½”λ ˆμ΄ν„° 없이 독립 μ‚¬μš©

@uploadλŠ” @api λ°μ½”λ ˆμ΄ν„° 없이 λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€:

2. httpMethodλŠ” POST

@uploadλ₯Ό μ‚¬μš©ν•˜λ©΄ μžλ™μœΌλ‘œ httpMethod: "POST"κ°€ μ„€μ •λ©λ‹ˆλ‹€.

3. clients μžλ™ μ„€μ •

@uploadλ₯Ό μ‚¬μš©ν•˜λ©΄ clients μ˜΅μ…˜μ΄ μžλ™μœΌλ‘œ ["axios-multipart", "tanstack-mutation-multipart"]둜 μ„€μ •λ©λ‹ˆλ‹€:

μ˜ˆμ‹œ λͺ¨μŒ

μ°Έκ³  사항

@api λ°μ½”λ ˆμ΄ν„°μ™€μ˜ 관계

@upload λ°μ½”λ ˆμ΄ν„°λŠ” λ‚΄λΆ€μ μœΌλ‘œ μžλ™μœΌλ‘œ API μ—”λ“œν¬μΈνŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. λ”°λΌμ„œ @api λ°μ½”λ ˆμ΄ν„°λ₯Ό λ³„λ„λ‘œ μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. μžλ™ μ„€μ •λ˜λŠ” κ°’:
  • httpMethod: "POST" (κ³ μ •)
  • clients: ["axios-multipart", "tanstack-mutation-multipart"] (multipart μ „μš© ν΄λΌμ΄μ–ΈνŠΈ)
  • guards: @upload μ˜΅μ…˜μ˜ guards 값이 API에 전달됨
  • description: @upload μ˜΅μ…˜μ˜ description 값이 API에 전달됨
@uploadλŠ” 파일 μ—…λ‘œλ“œμ— μ΅œμ ν™”λœ 섀정을 μžλ™μœΌλ‘œ μ μš©ν•˜λ―€λ‘œ, @api λ°μ½”λ ˆμ΄ν„°λ₯Ό μΆ”κ°€λ‘œ μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ‹€μŒ 단계

@api

API μ—”λ“œν¬μΈνŠΈ λ§Œλ“€κΈ°

@transactional

νŠΈλžœμž­μ…˜μœΌλ‘œ μ•ˆμ „ν•˜κ²Œ μ €μž₯ν•˜κΈ°

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

S3, Local λ“± μŠ€ν† λ¦¬μ§€ μ‚¬μš©ν•˜κΈ°

파일 처리

이미지/λ¬Έμ„œ 처리 κ°€μ΄λ“œ