2024. 1. 21. 00:59ใBack-End ์์ ์ค/Nest.js
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ ๋ชฉ์ฐจ
โ
[Nest.js] JWT๋ฅผ ์ด์ฉํ ์ธ์ฆ, ์ธ๊ฐ ๊ทธ๋ฆฌ๊ณ Multi part ์ด์ผ๊ธฐ - โ ์ด๊ธฐ๊ตฌ์ฑ
โ
[Nest.js] JWT๋ฅผ ์ด์ฉํ ์ธ์ฆ, ์ธ๊ฐ ๊ทธ๋ฆฌ๊ณ Multi part ์ด์ผ๊ธฐ - โก ํ์๊ฐ์
๊ณผ ์ธ์ฆ(feat. Access Token & Refresh Token)
โ
[Nest.js] JWT๋ฅผ ์ด์ฉํ ์ธ์ฆ, ์ธ๊ฐ ๊ทธ๋ฆฌ๊ณ Multi part ์ด์ผ๊ธฐ - โข Multer๋ฅผ ์ด์ฉํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ
โ
๐ Multi part๋ฅผ ์ด์ฉํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ
๐ฝ ๊ฐ์
๐ฆ ์๊ฐ
Multi part(๋ฉํฐ ํํธ)๋ Client(ํด๋ผ์ด์ธํธ)์ Server(์๋ฒ) ์ฌ์ด์ ์ ์ก๋๋ HTTP Request(์์ฒญ) ๋๋ Response(์๋ต)์์ ์ฌ๋ฌ ์ข
๋ฅ์ Data(๋ฐ์ดํฐ)๋ฅผ ๋์์ ์ ์กํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฐฉ์์ ์ด์ผ๊ธฐํด์.
์ผ๋ฐ์ ์ผ๋ก File Upload(ํ์ผ ์
๋ก๋)์ ๊ด๋ จ๋ ๋ฐ์ดํฐ ์ ์ก ๋ ๋ง์ด ์ฌ์ฉํ๊ณ ์์ด์.
HTTP Protocol(ํ๋กํ ์ฝ)์ ๊ธฐ๋ณธ์ ์ผ๋ก Text(๊ธ์) ๊ธฐ๋ฐ์ ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํด์.
ํ์ง๋ง, ํ์ผ๊ณผ ๊ฐ์ Binary(์ด์ง) ๋ฐ์ดํฐ๋ฅผ ์ ์กํด์ผ ํ ๋ ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๊ธ์ ํ์์ผ๋ก Encoding(์ธ์ฝ๋ฉ)ํ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๊ณ , ์ ํ ์ฌํญ์ด ์๋ ๊ฒ์ด์์.
๋ฉํฐ ํํธ ์์ฒญ์ Content-Type Header(ํค๋)์ multipart/form-data ๊ฐ์ ๊ฐ์ง๋ฉฐ, ์ฌ๋ฌ๊ฐ์ Part(ํํธ)๋ก ๊ตฌ์ฑ๋ผ์.
๊ฐ ํํธ๋ ๊ฐ๋ณ์ ์ธ ๋ฐ์ดํฐ ์กฐ๊ฐ์ผ๋ก ํ์ผ์ด๋, ๊ธ์ ๋ฐ์ดํฐ ๋ฑ์ ํฌํจํ ์ ์์ด์.
๋ํ, ๊ฐ ํํธ๋ ํค๋์ Body(๋ณธ๋ฌธ)์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ํค๋์๋ ํํธ์ Meta data(๋ฉํ ๋ฐ์ดํฐ)๊ฐ ํฌํจ๋์ด ์๊ณ , ๋ณธ๋ฌธ์๋ ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ ๋ฐฉ์์ด์์.
๋ฉํฐ ํํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ์๋ฒ ์ธก์์ ๋ฉํฐ ํํธ ๋ฐ์ดํฐ๋ฅผ Parsing(ํ์ฑ)ํ๋ Logic(๋ก์ง)์ด ํ์ํด์.
์ผ๋ฐ์ ์ผ๋ก ๋ฉํฐ ํํธ ์์ฒญ์ ์ฒ๋ฆฌํ๋ Library(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋, Framework(ํ๋ ์์ํฌ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํฐ ํํธ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ , ์ฒ๋ฆฌํ๊ฒ ๋๋ต๋๋ค.
์ฐธ๊ณ ๋ก Spring MVC์์๋ MultipartResolver๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํฐ ํํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์์ด์.
์ฃผ๋๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด์ฉํด์ ๋ฉํฐ ํํธ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํด ๋ณด๋ ค๊ณ ํด์.
์ต์ด ๋จ์ผ ํ์ผ ์ฒ๋ฆฌ๋ Router(๋ผ์ฐํฐ) Handler(ํธ๋ค๋ฌ)์ Decorator(๋ฐ์ฝ๋ ์ดํฐ)๋ฅผ ์ด์ฉํด์ Option(์ต์
)์ ์ค์ ํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด ๋ณผ ๊ฒ์ด๊ณ ,
๋๋ฒ์งธ ๋ค์์ ํ์ผ ์ฒ๋ฆฌ๋ multer.options ๋ผ๋ ์ต์
ํ์ผ์ ๋ง๋ค์ด ๊ณตํต์ ์ผ๋ก ์ด์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌํด ๋ณด๋ ค๊ณ ํด์.
๐ฝ ๋จ์ผ ํ์ผ ์ฒ๋ฆฌ
๐ฆ Entity
Entity๋ ๋ชจ๋ ๋ฉํฐ ํํธ๋ฅผ ํตํด ๋ค์ด์ค๋ File(ํ์ผ) ์ ๋ณด๋ฅผ ๋ชจ๋ ์ ์ฅํ ์ ์๋๋ก ๊ตฌ์ฑํด ์ฃผ์์ด์.
์ฌ์ค ์ด๋ ๊ฒ ๋ค Database(๋ฐ์ดํฐ ๋ฒ ์ด์ค)์ ์ ์ฅํ ํ์๋ ์๊ณ , ๊ณ ์ ๋ฒํธ(ID)์ image url๋ง ์ฒ๋ฆฌํด๋ ๋๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ ์๋ณธ ํ์ผ ์ด๋ฆ๊ณผ ์ฌ ๊ตฌ์ฑ๋ ํ์ผ ์ด๋ฆ ์ ๋ณด๋ง ์ฒ๋ฆฌํด๋ ๋ฌด๋ฐฉํ์ง๋ง, ์ฃผ๋๋ ์ค์ต์ ์ํด ์์ ๊ฐ์ด ๊ตฌ์ฑํด ์ฃผ์์ด์.
๐ฆ Controller
๋ผ์ฐํฐ ํธ๋ค๋ฌ์ ๋ํด ๋ถ์ํด ๋ณผ๊ฒ์.
์ต์ด ํด๋น ํด๋์ค์ URN Prifix๋ file๋ก ์ ์ํด ์ฃผ์์ด์.
๊ทธ๋ ๋ค๋ฉด http://localhost:8181/file ๋ก ์ ์๊ฐ ๋ ๊ฑฐ์์.
16๋ฒ์งธ ์ค์ ์์ฑ์๋ฅผ ํตํด FileService๋ฅผ ์ฃผ์
๋ฐ๋๋ฐ, ์ฃผ๋๋ SOLID 5์์น ์ค์๋ฅผ ์ํด Interface(์ธํฐํ์ด์ค)์ Implementation(๊ตฌํ์ฒด)๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด ์ฃผ์
ํ์ฌ ์ฃผ์์ด์.
18, 21๋ฒ์งธ ์ค์ Swagger(์ค์จ๊ฑฐ) ๋ฐ์ฝ๋ ์ดํฐ๋ก 18 ~ 20๋ฒ์งธ ์ค ๋ด์ฉ์ ์ค์จ๊ฑฐ ๋ฌธ์์์ API์ ์์ฝ ์ ๋ณด ์ ๊ณต์ ์ํ์ฌ ์์ฑํด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ , 21 ~ 24๋ฒ์งธ ์ค์ ๋ด์ฉ์ ๋ก์ง์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ ๋์์ ๋, ์ฑ๊ณต์ ๋ํ Response(์๋ต)์ ์ด๋ป๊ฒ ๋ด๋ ค์ค ๊ฒ์ธ์ง์ ๋ํด ์ค๋ช
ํ๋ ๋ถ๋ถ์ด๊ณ , ์ฌ๊ธฐ์๋ ํ์ผ ์
๋ก๋ ์ฑ๊ณต์ ๋ํ ์ค๋ช
๊ณผ ์๋ต ํ์์ ์ ์ํด ์ฃผ์์ด์.
25๋ฒ์งธ ์ค์ REST API ํ์์ ์ํด HTTP POST Method๋ก Endpoint URN์ /uploads/image๋ก ๊ตฌ์ฑํด ์ฃผ์์ด์.
์ด๋ ๊ฒ ๋๋ฉด ํด๋น ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์ํด์๋ http://localhost:8181/file/uploads/image๋ผ๋ URL๋ก POST ์์ฒญ์ ๋ณด๋ด์ค์ผ ํด์.
26 ~ 39๋ฒ์งธ ์ค ๊น์ง๊ฐ ๋ฉํฐ ํํธ๋ฅผ ์ํ ์ค์ ๋ถ๋ถ์ด์์.
26๋ฒ์งธ ์ค์ ๋ฐ์ฝ๋ ์ดํฐ๋ NestJS์์ Interceptor(์ธํฐ์
ํฐ)๋ฅผ ์ฌ์ฉํ ๋, ์ ์ฉํ๋ ๋ฐ์ฝ๋ ์ดํฐ์์.
์ฌ๊ธฐ์๋ FileInterceptor๋ฅผ ์ฌ์ฉํ์ฌ Image File(์ด๋ฏธ์ง ํ์ผ)์ ์ฒ๋ฆฌํ๋๋ฐ, ์
๋ก๋๋ ํ์ผ์ ๋ค๋ฃจ๊ธฐ ์ํด diskStorage๋ฅผ ๊ตฌ์ฑํ๋๋ก ๋ง๋ ๋ถ๋ถ์ด์์.
27 ~ 38๋ฒ์งธ ์ค์ ๋ํด ๋ถ์ํด ๋ณด๋ฉด FileInterceptor๋ ์ด๋ฏธ์ง ํ์ผ ์
๋ก๋ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ ์ํ ๋ถ๋ถ์ด๊ณ , fieldName ์ฆ, ์ฒซ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ์
๋ก๋๋ ํ์ผ์ Field(ํ๋) ์ด๋ฆ์ ๋ํ๋ด ์ฃผ๋ ๋ถ๋ถ์ด์์.
๋๋ฒ์งธ ๋งค๊ฐ ๋ณ์ localOptions์ storage ์์ฑ์ ์
๋ก๋๋ ํ์ผ์ ์ ์ฅ์๋ฅผ ์ง์ ํ๋ ๋ถ๋ถ์ด๊ณ , ์ฃผ๋๋ Disk Storage(๋์คํฌ ์คํ ๋ฆฌ์ง)๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๊ณ ์ ์ํด ์ฃผ์๊ณ , ํ์ผ์ ํ์ฌ ํ๋ก์ ํธ ๋ด์ ./local/storage/images ๊ฒฝ๋ก๋ก ์ง์ ํด ์ฃผ์์ด์.
30๋ฒ์งธ ์ค filename()์ ๊ฐ ํ์ผ์ ๋ํ ๊ณ ์ ์ด๋ฆ์ ์์ฑํ๊ธฐ ์ํ ๋ถ๋ถ์ด๊ณ , ์ฃผ๋๋ Random(๋๋ค)์ผ๋ก 32์์ ์์์ ๋ฌธ์์ด๊ณผ ์
๋ก๋๋ ํ์ผ ์๋ณธ ์ด๋ฆ์ ํ์ฅ์๋ฅผ ์กฐํฉํ์ฌ ๋ง๋ค๋๋ก ๊ตฌ์ฑํด ์ฃผ์์ด์.
40 ~ 42๋ฒ์งธ ์ค์ด ๋ณธ๊ฒฉ์ ์ธ ํธ๋ค๋ฌ ์ ์ ๋ถ๋ถ์ธ๋ฐ, ์ฌ๊ธฐ์ ๋งค๊ฐ ๋ณ์์ ๋ฐ์ฝ๋ ์ดํฐ @UploadedFile()์ ์
๋ก๋๋ ํ์ผ์ ์ ๊ทผํ ์ ์๊ฒ ํ๊ธฐ ์ํด ์ ์ํ ๋ถ๋ถ์ด๊ณ , Express.Multer.File์ ์
๋ก๋๋ ์ด๋ฏธ์ง ํ์ผ์ ๋ฐ๊ธฐ ์ํด ์ ์ํด ์ค ๋ถ๋ถ์ด์์.
๊ทธ๋ฆฌ๊ณ ํด๋น ํธ๋ค๋ฌ๋ fileService.uploadImage()๋ฅผ ํธ์ถํ์ฌ ์ด๋ฏธ์ง ์
๋ก๋ ์์
์ ์ฒ๋ฆฌํ๊ณ , ๊ฒฐ๊ณผ๋ก Promise๋ก Wrapping(๋ํ)๋ DefaultResponse ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ก ํด ์ฃผ์์ด์.
์ ๋ฆฌํ๋ฉด ํด๋น ํธ๋ค๋ฌ๋ ์ด๋ฏธ์ง ์
๋ก๋์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋๋ก ๋ง๋ค์ด์ง ํธ๋ค๋ฌ์ด๊ณ , ๋๋คํ ํ์ผ ์ด๋ฆ ์์ฑ, ๋์คํฌ ์คํ ๋ฆฌ์ง ์ค์ , ์ค์จ๊ฑฐ ๋ฌธ์ํ ๋ฑ์ ํตํด ๋จ์ผ ์ด๋ฏธ์ง ์ ์ฅ์ ๋ํ ๊ธฐ๋ฅ์ ์ ์ํ ๋ฉ์๋์์.
๐ฆ Service
Service ๋ก์ง์ ์ธํฐํ์ด์ค ์ฝ๋ ๋ถ๋ถ์ ์บก์ณํ์ง ์์๊ฒ์.
์์ธํ ๋ด์ฉ์ ์ฃผ๋์ ๊นํ์์ ํ์ธํ์ค ์ ์์ด์.
Business Logic(๋น์ฆ๋์ค ๋ก์ง)์ ์์ ๊ฐ์ด ๊ตฌ์ฑํด ์ฃผ์์ด์.
์ต์ด 13๋ฒ์งธ ์ค ์์ฑ์์์ TypeORM์ ์ด์ฉํ๊ธฐ ์ํด fileRepository๋ฅผ ์ฃผ์
์์ผ ์ฃผ์์ด์.
uploadImage()๋ ๋ฉํฐ ํํธ๋ฅผ ์ด์ฉํด ์ ๋ฌ๋ ํ์ผ์ ๋งค๊ฐ ๋ณ์๋ก ๋ฐ๊ฒ ๋๊ณ , ์ฒ๋ฆฌ๊ฐ ๋๋ ๋ค DefaultResponse ๊ฐ์ฒด๋ก ๋ฐํ๋๋๋ฐ, ์ด ๋, data Type์ผ๋ก ์ ์ฅ๋ ์ด๋ฏธ์ง์ ๊ณ ์ ๋ฒํธ์ URL์ ์ ๋ฌํ ์ ์๋๋ก ์ฒ๋ฆฌํด ์ฃผ์์ด์.
๋๊ธฐ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ async - await์ด ์ฌ์ฉ๋์๊ณ , ์ด ๋๋ฌธ์ Promise<>๋ก ๋ํํ์ฌ ๋ฐํํด์ฃผ์์ด์.
16๋ฒ์งธ ์ค์ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ๋ ํ์ผ์ด Null์ธ์ง ํ์ธํ๊ณ ์์ด์.
Null์ด ์๋๋ผ๋ฉด TypeORM์ save()๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅํ๋๋ฐ, ๋ฉํฐ ํํธ๋ก ์ ๋ฌ๋๋ ๋ชจ๋ ๋ด์ฉ์ ์ ์ฅํ ์ ์๋๋ก ์ฒ๋ฆฌํด ์ฃผ์์ด์.
์ฐธ๊ณ ๋ก 30๋ฒ์งธ ์ค์ URL์ configuration()์ ์ด์ฉํ์ฌ .env.yml์ ์๋ฒ URL ๊ฐ๊ณผ PORT ๋ฒํธ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํด ์ฃผ์์ด์.
๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ ์ฅ ์ ์ ๋ฌ๋ ํ์ผ ์ ๋ณด๋ฅผ Entity๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด 21๋ฒ์งธ ์ค๊ณผ ๊ฐ์ด ์์ฑ์๋ฅผ ํธ์ถํด์ ๊ฐ๊ฐ์ ๋ด์ฉ์ ๋ฃ๊ณ , ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ค ๋ค ์ด Entity๋ฅผ save()์๊ฒ ์ ๋ฌํ์ฌ ์ ์ฅ๋ ์ ์๋๋ก ์ฒ๋ฆฌํด ์ค ๋ถ๋ถ์ด์์.
๊ทธ๋ฐ๋ค 34 ~ 37๋ฒ์งธ์ ๊ฐ์ด ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด imageContent๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์์ ์ด๋ฏธ์ง ๊ณ ์ ๋ฒํธ์ URL์ด ์๋ณ ๊ฐ๋ฅํ๊ฒ Key - Value ํํ๋ก ๋ฃ์ด์ฃผ๊ณ , ์ด๋ฅผ ๋ฐํํ๋๋ก ํด ์ฃผ์์ด์.
๐ฆ Module
Module(๋ชจ๋)์ ์์ ๊ฐ์ด ์ปจํธ๋กค๋ฌ์ ์๋น์ค๋ฅผ ์ ์ํด ์ฃผ์๊ณ ,
TypeORM์ Entity๋ฅผ File๋ก ๋ฐ๋ผ๋ณผ ์ ์๋๋ก ์ค์ ํด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ app.module์ ์์ ๊ฐ์ด FileModule์ ์ ์ํด ์ฃผ์์ด์.
๐ฝ ์ ๋ง๋ค์๋? ๐ค
๐ฆ Postman
์์ ๋ก์ง์ด ์ ์ ๊ตฌ๋๋๋์ง Postman์ ์ด์ฉํ์ฌ ํ์ธํด ๋ณผ๊ฒ์.
์์ ๊ฐ์ด HTTP Request Body์ image๋ผ๋ Key๋ก Value๋ฅผ ์ด๋ฏธ์ง ํ์ผ๋ก ๋ฃ์ด์ฃผ๋ฉด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
์ค์ ์ด๋ฏธ์ง ํ์ผ์ ์ง์ ํด ์ค ๊ฒฝ๋ก์ ์ ์ ์ฅ๋ ๊ฒ๋ ํ์ธํ ์ ์์ด์.
๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ๊ฐ์ด ์ ์ ์ฅ๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
๐ฝ ๋ค์ค ํ์ผ ์ฒ๋ฆฌ
๐ฆ Controller
์ด๋ฒ์๋ ์ฌ๋ฌ ํ์ผ์ ํ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ๋ง๋ค์ด ๋ณผ๊ฒ์.
์์์๋ ์ด์ผ๊ธฐ ํ๋ฏ ์ด๋ฒ์๋ ์ต์
์ฒ๋ฆฌ๋ฅผ ๊ณตํต์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ํ์ผ์ ๋ง๋ค์ด ๊ตฌ์ฑํด ๋ณด๋๋ก ํ ๊ฒ์.
๋จ์ผ ํ์ผ ์ฒ๋ฆฌ ํธ๋ค๋ฌ๋ณด๋ค ์ฝ๋ ๊ธธ์ด๊ฐ ๋ง์ด ์งง์๊ฑธ ์ ์ ์์ด์.
๊ทธ ์ด์ ๋ ๋ฐ๋ก 52๋ฒ์งธ ์ค์ multerDiskOptions ๋๋ถ์ด์์.
๋จ์ผ ํ์ผ ์ฒ๋ฆฌ์ ๋ค๋ฅธ์ ์ 52๋ฒ์งธ ์ค์ FilesInterceptor์ fieldName์ด images ์ด๊ธฐ ๋๋ฌธ์ HTTP Request Body์ Key ์ด๋ฆ์ image๊ฐ ์๋ images๋ก ๋ฃ์ด์ค์ผ ํ๋ค๋ ๊ฒ์ด์์.
๋ํ, ์ด ํธ๋ค๋ฌ๋ ์ฌ๋ฌ๊ฑด์ ํ์ผ์ ๋ฐ์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ ๋ณ์ ์๋ฃํ ํ์
์ด Array๋ก ๊ฐ์ธ์ ธ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
52๋ฒ์งธ ์ค์์ FilesInterceptor(...)๋ ๋ค์ค ํ์ผ ์
๋ก๋๋ฅผ ์ฒ๋ฆฌํ๋ ์ธํฐ์
ํฐ๋ฅผ ์ ์ํ ๋ถ๋ถ์ผ๋ก images ๋ฌธ์์ด์ ์
๋ก๋๋ ํ์ผ๋ค์ ํ๋ ์ด๋ฆ์ ๋ํ๋ด๋ ๋ถ๋ถ์ด๊ณ , multerDiskOptions๋ ๋ฐ์์ ์ด์ผ๊ธฐํ Options ์์ ๋ง๋ multerDiskOptions ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ ์ํด ์ค ๋ถ๋ถ์ด์์.
๊ทธ๋ฆฌ๊ณ , 53๋ฒ์งธ ์ค ๋ด์ฉ์ uploadImages()์ ๋งค๊ฐ ๋ณ์์ ํ์ผ ์
๋ก๋๋ ์ด๋ฏธ์ง๋ค์ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด ๋ช
์ํ ๋ฐ์ฝ๋ ์ดํฐ์์.
54๋ฒ์งธ ์ค ๋ฉ์๋์ ๋งค๊ฐ ๋ณ์ ๋ด์ฉ์ ์
๋ก๋๋ ์ด๋ฏธ์ง ํ์ผ๋ค์ ์ ๊ทผํ ์ ์๋ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ์ํด ์ค ๋ถ๋ถ์ด์์.
๐ฆ Options
์ด ๋ถ๋ถ์ด ํ์ผ ์ฒ๋ฆฌ์ ๋ํด ๊ณตํต์ผ๋ก ์ ์ํ ์ฌํญ์ ๋ชจ์๋๊ณ ์ฌ์ฉํ ์ ์๋ ํ์ผ์ด์์.
multerDiskOptions{}๋ ๋ฉํฐ ํํธ๋ฅผ ์ด์ฉํ ๋, ๋์คํฌ์ ์ ์ฅํ๋ ๊ฒ์ ๋ํด ์ต์
์ ์ ์ํ ์ ์๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ์.
ํด๋น ์ต์
์ MemoryOption๋ ์กด์ฌํ๋๋ฐ, ์ด๋ ํ์ผ์ ๋์คํฌ ์ฆ, ๋ณด์กฐ ๊ธฐ์ต ์ฅ์น๊ฐ ์๋ RAM(๋จ) ์ฃผ ๊ธฐ์ต ์ฅ์น์ ์ ์ฅํ ๋ ์ฌ์ฉํด์.
์ฃผ ๊ธฐ์ต ์ฅ์น์ ์ด๋ฏธ์ง ์ ์ฅํ ์ผ์ด ์์๊น ์ถ์ด ์ด ๋ถ๋ถ์ ๋ํด์๋ ์ค์ตํ์ง ์๋๋ก ํ ๊ฒ์.
๋ณธ๊ฒฉ์ ์ผ๋ก ์ ์ฝ๋์ ๋ํด ๋ถ์ํด ๋ณด๋๋ก ํ ๊ฒ์.
์ด ์ฝ๋๋ multer๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์
๋ก๋ ์ ํ์ํ ๋ค์ํ ์ค์ ์ ํฌํจํ๊ณ ์๋๋ฐ, ์ฃผ๋ก File filter(ํ์ผ ํํฐ), ์ ์ฅ์(destination ๋ฐ ํ์ผ ์ด๋ฆ ์ค์ ), ์
๋ก๋ ์ ํ ์ฌํญ(limits)๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ด์์.
์ต์ด 7๋ฒ์งธ ์ค์ fileFilter()๋ ์
๋ก๋ ๋๋ ํ์ผ์ ํํฐ๋ง์ ๋ด๋นํ๋ ํจ์์์.
์ด ์ฝ๋์์๋ ์ด๋ฏธ์ง ํ์ฅ์๋ก .jpg, .jpeg, .png ํ์ฅ์๋ง ํ์ฉํ๋๋ก ์ค์ ํด ์ฃผ์์ด์.
๋ง์ฝ ํ์ฉ๋์ง ์๋ ํ์ผ ํ์์ด ์
๋ก๋ ์์ฒญ์ด ์ค๋ฉด HttpException์ ํฐํธ๋ ค Client(ํด๋ผ์ด์ธํธ)์๊ฒ ๋ฐํ๋ ๊ฑฐ์์.
25๋ฒ์งธ ์ค storage๋ diskStorage()๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ ์ฅ์(destination)์ ํ์ผ ์ด๋ฆ(filename)์ ์ค์ ํ ์ ์์ด์.
destination()์ ํ์ผ์ด ์ ์ฅ๋ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋๋ฐ, 29๋ฒ์งธ ์ค์ ํด๋น ๊ฒฝ๋ก์ ๋๋ ํฐ๋ฆฌ๊ฐ ํ์ฌ ์กด์ฌํ๋์ง ํ์ธํ๊ณ , ์์ผ๋ฉด 31๋ฒ์งธ ์ค์ ํตํด ๊ฐ ๋๋ ํฐ๋ฆฌ๋ค์ ์์ฑํด ์ฃผ๋๋ก ์ค์ ํด ์ฃผ์์ด์.
filename()์ ์
๋ก๋ ์์ฒญ์ ๋ํ ํ์ผ์ ์ด๋ฆ์ ์ค์ ํ๋ ๋ถ๋ถ์ด์์. ์ฌ๊ธฐ์๋ ํ์ฌ ์๊ฐ(timestamp)๊ณผ ์
๋ก๋ ์์ฒญ๋ ํ์ผ์ ์๋ณธ ์ด๋ฆ์ ํ์ฅ์๋ฅผ ์กฐํฉํ์ฌ ์ด๋ฆ์ ๋ง๋ค๋๋ก ํด ์ฃผ์์ด์.
limits ๊ฐ์ฒด๋ ์
๋ก๋๋ ํ์ผ ๊ด๋ จ ์ ํ ์ฌํญ์ ์ค์ ํด ์ค ์ ์๋ ๋ถ๋ถ์ด์์.
์ด ๋ฆ | ์ค ๋ช |
fieldNameSize | Field ์ด๋ฆ์ ์ต๋ ํฌ๊ธฐ ์ค์ (๊ธฐ๋ณธ๊ฐ 100 bytes) |
fieldSize | Field Size ์ต๋๊ฐ (๊ธฐ๋ณธ๊ฐ 1MB) |
fields | File ํ์์ด ์๋ Field์ ์ต๋ ๊ฐ์ (๊ธฐ๋ณธ๊ฐ ๋ฌด์ ํ) |
fileSize | Multipart ํ์ Form์ ์ต๋ ์ฉ๋. (๊ธฐ๋ณธ๊ฐ ๋ฌด์ ํ) ์ฆ, ํ์ผ์ ํ์ฉ ํฌ๊ธฐ ์ค์ . |
files | Multipart ํ์ Form์ File Field ์ต๋ ํ์ฉ ๊ฐ์ (๊ธฐ๋ณธ๊ฐ ๋ฌด์ ํ) |
์์ ๊ฐ์ด ์ค์ ๋ multerDiskOptions ๊ฐ์ฒด๋ NestJS์์ ์ฌ์ฉ๋๋ฉฐ, ํธ๋ค๋ฌ์์ FileInterceptor ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ํด๋น ๊ฐ์ฒด๋ฅผ ๋ช
์ํด ์ฃผ๋ฉด ์ฌ์ฉํ ์ ์๊ณ , ์ด๋ฌํ ์ค์ ์ ํตํด ์
๋ก๋๋ ํ์ผ์ ํ์, ๊ฒฝ๋ก, ์ด๋ฆ ๋ฐ ์ ํ ์ฌํญ์ ํ๋์ ํ์ผ๋ก ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ด์.
๐ฆ Service
๋น์ฆ๋์ค ๋ก์ง ์ฝ๋์ ๋ํด ๋ถ์ํด ๋ณผ๊ฒ์.
์ต์ด 43๋ฒ์งธ ์ค์์ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ๋ ํ์ผ์ ๋ฐฐ์ด์ด Null์ด๊ฑฐ๋, ๊ธธ์ด๊ฐ 0์ธ์ง๋ฅผ ํ์ธํ๊ณ ์์ด์.
์๋๋ผ๋ฉด result๋ผ๋ ๋ฐฐ์ด์ ํ๋ ๋ง๋ค์ด ์ค ๋ค ํฅ์๋ For ๋ฌธ์ ํตํด images์ ์์ ํ๋ํ๋๋ฅผ ๊บผ๋ด๋ฉด์ ๋ฐ๋ณต๋ฌธ์ ๋๊ฒ ํด ์ฃผ์์ด์.
50๋ฒ์งธ ์ค์์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ํ๋์ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด TypeORM์ save()๋ฅผ ํธ์ถํ์ฌ new ์ฐ์ฐ์๋ก File ๊ฐ์ฒด์ ์์ฑ์๋ฅผ ํธ์ถํ ๋ค์ ์ ์ฅํ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๊ฐ๊ฐ ๋ฃ์ด ๊ฐ์ฒดํ ํด ์ฃผ๊ณ , Entity ๊ฐ์ฒด๋ฅผ save()์ ๋ฃ์ด ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅํ๊ฒ ํด ์ค ๋ค ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ saveFile์ ๋ด๊ธฐ๋๋ก ํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค 64๋ฒ์งธ ์ค์์ ํด๋น saveFile ๊ฐ์ฒด์ ๋ด๊ธด Entity๊ฐ Null์ธ์ง ํ์ธํด ์ฃผ๊ณ , ์๋๋ผ๋ฉด imageContent๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ด๋ฏธ์ง ๊ณ ์ ๋ฒํธ์ URL์ ์๋ณ ๊ฐ๋ฅํ๊ฒ ์ ์ํ์ฌ ๋ฃ์ด์ค ๋ค imageContent ๊ฐ์ฒด๋ฅผ result ๋ฐฐ์ด์ ๋ฃ์ด ์ฃผ๋๋ก ํ์๊ณ , ์ด๋ฅผ ๊ณ์ ๋ฐ๋ณตํด์ ์ฒ๋ฆฌํ๋๋ก ํด ์ฃผ์์ด์.
๋ฐ๋ณต๋ฌธ์ด ๋ชจ๋ ๋๋๋ฉด ์ ์ ์ฒ๋ฆฌ ๋์๋ค๊ณ ํ๋จํ ์ ์๊ธฐ ๋๋ฌธ์ result[]์ ํจ๊ป ์ ์ ์ฒ๋ฆฌ ์ ๋ณด๋ฅผ ๋ฐํํ๋๋ก ํด ์ฃผ์์ด์.
๐ฝ ์ ๋ง๋ค์๋? ๐ค
๐ฆ Postman
Postman์ ํตํด HTTP Request Body์ form-data ํ์์ผ๋ก images๋ผ๋ Key๋ก ๋ ์ฅ์ ์ด๋ฏธ์ง๊ฐ ์ ์ก๋ ์ ์๋๋ก ํ ๋ค ์์ฒญ์ ๋ณด๋ด๋ ์ ์ ์ฒ๋ฆฌ ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
ํ์ผ๋ ๋์คํฌ์ ์ ์ ์ฅ๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
์์ ๊ฐ์ด ๋ฐ์ดํฐ ๋ฒ ์ด์ค์๋ ์ ์์ ์ผ๋ก ์ ์ ์ฅ๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
๐ฝ ์ ์ฅ๋ ์ด๋ฏธ์ง ์ด์ฉํ๊ธฐ - URL์ ์ด์ฉํ ์ด๋ฏธ์ง ๋ฐ๋ก ์ถ๋ ฅ
๐ฆ ๊ฐ์
์ด๋ฒ์๋ ์ ์ฅ๋ ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ก ์ถ๋ ฅํด ๋ณผ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํด ๋ณด๋๋ก ํ ๊ฒ์.
HTTP Method GET์ ์ด์ฉํ์ฌ Parameter(ํ๋ผ๋ฏธํฐ)๋ก ์ด๋ฏธ์ง ์ด๋ฆ์ ๋ณด๋ด๋ฉด ์ถ๋ ฅ๋ ์ ์๋ ๊ธฐ๋ฅ์ด์์.
๐ฆ Controller
์ ์ฝ๋๋ ํ๋์ ์ด๋ฏธ์ง ์ด๋ฆ(ํ์ฅ์ ํฌํจ)์ ๋ณด๋ด์ฃผ๋ฉด ๋ฐ๋ก ํด๋น ์ฌ์ง์ ๋ณผ ์ ์๋๋ก ํด์ฃผ๋ ํธ๋ค๋ฌ์์.
๋ง์ฝ ์ฌ๋ฌ ๊ฑด์ ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฆ์ ๋ฐฐ์ด๋ก ๋ฐ๋์ง ํด๋ณด๋ฉด ๋ ๊ฑฐ ๊ฐ์์.
์ฃผ๋๋ ํ๋์ ์ด๋ฏธ์ง ์์ฒญ์ ๋ํด์๋ง ์ฒ๋ฆฌํด ๋ณผ๊ฒ์.
ํด๋น ํธ๋ค๋ฌ๋ URL ํ๋ผ๋ฏธํฐ๋ก ์ด๋ฏธ์ง์ ์ด๋ฆ์ ๋ฐ๊ณ , ์๋ต ๊ฐ์ฒด๋ฅผ ๋ฐ๋๊ฑธ ํ์ธํ ์ ์์ด์.
์๋ต ๊ฐ์ฒด๋ฅผ ๋ฐ๋ ์ด์ ๋ ์ด ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ๋ณด๋ผ ์๋ต์ Customizing (๋ชฉ์ ์ ๋ง๊ฒ ๋ณ๊ฒฝ)ํ๊ธฐ ์ํจ์ด์์.
๐ฆ Service
๋ก์ง์ ์๊ฐ๋ณด๋ค ๊ฐ๋จํด์.
๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ๋ ์ด๋ฏธ์ง ์ด๋ฆ์ด Null์ธ์ง ํ์ธํ๊ณ , Null์ด ์๋๋ฉด ๋ก์ง์ด ์ฒ๋ฆฌ๋๋๋ฐ,
์ด ๋, Express ์๋ต ๊ฐ์ฒด response์ sendFile()์ ํธ์ถํ์ฌ ๋งค๊ฐ ๋ณ์๋ก ํ์ผ ์ด๋ฆ๊ณผ options(ํ์ผ ์ ์ก๊ณผ ๊ด๋ จ๋ ์ฌ๋ฌ ์ต์
์ค์ ํ๋ ๊ฐ์ฒด)๋ก root Key ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด ์ฃผ๋๋ฐ, ์ด๋ ํ์ผ์ ์ฐพ์ ๊ธฐ์ค ๊ฒฝ๋ก๋ฅผ ์ ์ํด ์ค ๊ฒ์ผ๋ก ./local/storage/images์์ ํ์ผ์ ์ฐพ์ผ๋ผ๋ ์๋ฏธ์์.
sendFile()์ Server(์๋ฒ) ์ธก์์ ํด๋ผ์ด์ธํธ์๊ฒ ์ด๋ฏธ์ง ํ์ผ ์ ์ก ์ ์ฌ์ฉ๋๋๋ฐ, ํด๋ผ์ด์ธํธ๋ ์๋ฒ์๊ฒ ํ์ผ ์ด๋ฆ์ ํฌํจํ ์ด๋ฏธ์ง ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ฉด ์๋ฒ๋ ํด๋น ํ์ผ์ ์ฐพ์ response.sendFile()์ ํตํด ํด๋ผ์ด์ธํธ์๊ฒ ์ด๋ฏธ์ง๋ฅผ ์ฐพ์ ์ ์กํ๋ ๊ฒ์ด์์.
ํด๋ผ์ด์ธํธ๋ ์ด๋ฅผ ๋ฐ์ ์ด๋ฏธ์ง๋ฅผ ํ์ํ ์ ์๊ฒ ๋๋ต๋๋ค.
๐ฝ ์ ๋ง๋ค์๋? ๐ค
๐ฆ Postman
๊ทธ๋์ ์์ ๊ฐ์ด Postman์ ์ด์ฉํ์ฌ ํ์ผ ์ด๋ฆ์ ํ๋ผ๋ฏธํฐ๋ก ๋ณด๋ด๋ณด๋ฉด ํด๋น ์ด๋ฏธ์ง๊ฐ ๋ฐ๋ก ์ถ๋ ฅ๋๋ ๊ฑธ ์ ์ ์์ด์.
๐ฝ ์ ์ฅ๋ ์ด๋ฏธ์ง ์ด์ฉํ๊ธฐ - image ๊ณ ์ ๋ฒํธ๋ฅผ ์ ๋ ฅํ์ฌ ์ ๋ณด ์ป์ด ์ค๊ธฐ
๐ฆ ๊ฐ์
์ด๋ฒ์๋ ํด๋ผ์ด์ธํธ๊ฐ GET ์์ฒญ์ผ๋ก image ๊ณ ์ ๋ฒํธ๋ฅผ ๋ณด๋์ ๋, ํด๋น ์ด๋ฏธ์ง URL์ ๋ฐํํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด ๋ณด๋ ค๊ณ ํด์.
์ด ๋ํ, ๋จ์ผ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ๋ค์ค ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ก ๋๋์ด์ ์ด์ผ๊ธฐ ํด ๋ณผ๊ฒ์.
๐ฆ Controller - ๋จ์ผ ์ด๋ฏธ์ง ์ฒ๋ฆฌ
์ ํธ๋ค๋ฌ๋ imageId๋ฅผ URL ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๋์ํ๋ ํธ๋ค๋ฌ์์.
๋ฐํ๋๋ ์ ๋ณด๋ ์ด๋ฏธ์ง URL์ ๋ฐํํด ๋ณด๋๋ก ํ ๊ฒ์.
๐ฆ Service - ๋จ์ผ ์ด๋ฏธ์ง ์ฒ๋ฆฌ
๋น์ฆ๋์ค ๋ก์ง์ ์ต์ด 87๋ฒ์งธ ์ค์์ imageId๊ฐ 0๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ง ํน์ Null์ธ์ง๋ฅผ ํ์ธํ๊ณ ์์ด์.
๋ ๋ค ๋ชจ๋ True๊ฐ ์๋๋ผ๋ฉด 91๋ฒ์งธ ์ค์ ํตํด imageId๋ฅผ id ๋ณ์๋ช
์ผ๋ก ๋ฐ๊พธ๊ณ , ๊ทธ๊ฑธ TypeORM findOne()์ ํตํด ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌํ์ฌ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ํด๋น ์ด๋ฏธ์ง ๊ณ ์ ๋ฒํธ๋ก ์ ์ฅ๋ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ์ด์.
๋ง์ฝ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์กด์ฌํ์ง ์๋๋ค๋ฉด (95๋ฒ์งธ ์ค) ์กด์ฌ ํ์ง ์๋๋ค๋ ์๋ฌ ๋ด์ฉ์ ๋ฐํํ๊ฒ ํด์ฃผ๊ณ , ์กด์ฌ ํ๋ค๋ฉด ํด๋น ์ด๋ฏธ์ง URL์ ๋ฐํํ๋๋ก ํด ์ฃผ์์ด์.
๐ฝ ์ ๋ง๋ค์๋? ๐ค
๐ฆ Postman
Postman์ ์ด์ฉํ์ฌ URL ํ๋ผ๋ฏธํฐ์ ์ฐพ์ ์ด๋ฏธ์ง์ ๊ณ ์ ๋ฒํธ๋ฅผ ๋ฃ๊ณ , GET ์์ฒญ์ ๋ณด๋ด๋ฉด ์์ ๊ฐ์ด ์ด๋ฏธ์ง URL์ ๋ฐํ๋ฐ๋๊ฑธ ํ์ธํ ์ ์์ด์.
๐ฆ Controller - ๋ค์ค ์ด๋ฏธ์ง ์ฒ๋ฆฌ
์ด๋ฒ์๋ ์ฌ๋ฌ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํด ๋ณผ๊ฒ์.
์ด ํธ๋ค๋ฌ๋ ์ด๋ฏธ์ง ๊ณ ์ ๋ฒํธ๋ฅผ ์ฌ๋ฌ๊ฐ ๋ฐ์ ์ ์๋๋ก ๋ฐฐ์ด์ ๋ฐ๋๋ก ํด ์ฃผ์๋๋ฐ, ๋จ์ผ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์๋ ๋ฌ๋ฆฌ Query String์ผ๋ก GET ์์ฒญ์ ๋ฐ๋๋ก ํด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ , ๋ฐํ๋๋ ๊ฒ๋ ์ด๋ฏธ์ง URL์ด ์ฌ๋ฌ๊ฐ ๋ฐํ๋ ์ ์๋๋ก ๋ฐฐ์ด์ ๋ด๊ฒจ ๋ฐํ๋ ์ ์๋๋ก ํด ์ฃผ์์ด์.
๐ฆ Service - ๋ค์ค ์ด๋ฏธ์ง ์ฒ๋ฆฌ
๋น์ฆ๋์ค ๋ก์ง์ ์ต์ด ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ๋ ์ด๋ฏธ์ง ๊ณ ์ ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ด Null์ด๊ฑฐ๋, ๊ธธ์ด๊ฐ 0์ธ์ง๋ฅผ ํ์ธํ๊ณ , ์๋๋ผ๋ฉด ์๋ต๊ฐ์ผ๋ก ์ ๋ฌํ ๊ฐ์ฒด images๋ฅผ ๋ง๋๋๋ฐ, ์ด ๊ฐ์ฒด๋ ์ด๋ฏธ์ง URL์ ๋ฌธ์์ด๋ก ๋ด์ ๋ฐฐ์ด ๊ฐ์ฒด๋ก ์ ์ธํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค 109 ~ 116๋ฒ์งธ ์ค๊น์ง ํฅ์๋ For๋ฌธ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ๊ณ ์ ๋ฒํธ ์์ ํ๋ํ๋๋ฅผ ๊บผ๋ด ๋ฐ๋ณต๋ฌธ์ ๋๊ฒ ํ๋๋ฐ, 110๋ฒ์งธ ์ค์์ ํ ๊ฐ์ ์ด๋ฏธ์ง ๊ณ ์ ๋ฒํธ๋ฅผ ๊บผ๋ด ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์ ์กฐํ๋๋๋ก TypeORM์ findOne()์ ์ด์ฉํ์ฌ ์ฐพ๊ฒ ํ๊ณ , ์ฐพ์ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ image ์์ ๋ณ์์ ๋ด๊ธฐ๋๋ก ํ์์ด์.
๊ทธ๋ฐ ๋ค ๊ทธ ๊ฐ์ฒด๊ฐ Null์ด ์๋์ง ํ์ธ(111๋ฒ์งธ ์ค)ํ๊ณ , ์๋๋ผ๋ฉด images ๊ฐ์ฒด ๋ฐฐ์ด์ ๋ด์ ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค ๋ฐ๋ณต๋ฌธ์ด ๋๋๋ฉด ์ ์ ์ฒ๋ฆฌ๋ ์ ๋ณด์ ํจ๊ป images ๊ฐ์ฒด ๋ฐฐ์ด์ ๋ฐํํด ์ฃผ๋ ๋ก์ง์ด์์.
๐ฝ ์ ๋ง๋ค์๋? ๐ค
๐ฆ Postman
์์ ๊ฐ์ด GET ์์ฒญ์ Query String์ผ๋ก ์์ฒญ์ ๋ณด๋ด๊ณ , ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ imagesId๋ก ํ ๋ค
,(์ผํ)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ์ง ๊ณ ์ ๋ฒํธ๋ฅผ ๊ฐ์ผ๋ก ๋ฃ์ด ์์ฒญ์ ๋ณด๋ด๋ฉด ์ ์ ์ฒ๋ฆฌ ๋๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
์ฌ๊ธฐ๊น์ง NestJS์ Multer๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต๋ถํ๊ณ , ์ค์ตํด ๋ณด์์ด์.
๋ค์ ๊ธ์์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ฒ์ํ ํ์์ ๊ธฐ๋ฅ ๋ ๊ฐ๋ฅผ ๋ง๋ค๊ณ , JWT ์ธ๊ฐ๋ฅผ ์ด์ฉํด ๊ถํ์ ํ์ธํ๊ณ ,
๊ธ์์ ์ด๋ฏธ์ง ๋ฑ์ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ตฌํํ๊ณ , ์ค์ตํด ๋ณด๋๋ก ํ ๊ฒ์.
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."