๐Ÿ’ Spring

๐Ÿ’ Spring

[Spring MVC] Zip, UnZip ์—…๋กœ๋“œ ๋ฐ ๋‹ค์šด๋กœ๋“œ API ๊ตฌํ˜„ (feat. MultipartFile)

๊ฐœ๋ฐœํ™˜๊ฒฝ๐Ÿ’ก ์ „์ฒด ์ฝ”๋“œ๋Š” Github๋ฅผ ์ฐธ์กฐํ•ด์ฃผ์„ธ์š”.spring boot 3.3.1JDK 17IntroSpring MVC์—์„œ๋Š” MultipartFile ์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ZIP, UnZIP ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์œ ํ‹ธ์„ฑ ํด๋ž˜์Šค๋ฅผ ํ•จ๊ป˜ ๊ฐœ๋ฐœํ•ด๋ณด๊ณ , MultipartFile์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์—…๋กœ๋“œ, ๊ทธ๋ฆฌ๊ณ  HttpServletResponse๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ๋‚ด๋ ค์ค˜์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.๋จผ์ € Multipartfile์ด ๋ญ˜๊นŒ์š”?๋ณดํ†ต ํŒŒ์ผ์„ ์ „์†กํ•  ๋•Œ, HTTP body๋ฅผ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„(Multipart Data)์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋ณด๋‚ด๋Š”๋ฐ ์ด๋Ÿฌํ•œ Multipart Data ์ฆ‰, Mult..

๐Ÿ’ Spring

[Spring] - ConfigurationProperties๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ์ฃผ์ž…ํ•˜๊ธฐ (feat. @Value ์ƒ์œ„ ํ˜ธํ™˜)

๊ฐœ์š”application.yml์— ์„ค์ •ํ•œ property๊ฐ’๋“ค์„ @Value๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋ณด๋‹ค๋Š” ํ•ด๋‹น ์„ค์ •์„ ๋‹ค๋ฃจ๋Š” ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋‘๊ณ  ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์—†์„๊นŒ? ํ•˜๋Š” ์˜๋ฌธ์—์„œ ์ถœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” @ConfigurationProperties๋ฅผ ํ†ตํ•ด Property๋ฅผ ๊ฐ์ฒด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @Value ์ฃผ์ž… ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ๋” ์•ˆ์ „ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.1. Dependency ์ถ”๊ฐ€annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'2. application.ymlmy: service: enabled: false remote-addr..

๐Ÿ’ Spring/๊ฐœ๋… ๋ฐ ์ดํ•ด

Spring ์กด์žฌํ•˜์ง€ ์•Š๋Š” API ์‘๋‹ต ์ปค์Šคํ„ฐ๋งˆ์ด์ง• (feat. ๋‚ด๋ถ€ ๋™์ž‘๋„ ์‚ดํŽด๋ณด๊ธฐ)

Intro ๊ธฐ๋ณธ์ ์œผ๋กœ Spring MVC๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” API ์š”์ฒญ ์‹œ ์‘๋‹ต์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. { "timestamp":"2023-09-21T11:30:05.517+00:00", "status":404, "error":"Not Found", "path":"/api/404" } ์œ„ ์‘๋‹ต์€ Spring MVC๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ์˜ค๋ฅ˜ ์‘๋‹ต ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต ์‹ค๋ฌด์—์„œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ์‘๋‹ต๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹จ ๊ณตํ†ต ์‘๋‹ต ํฌ๋งท์„ ๋งž์ถฐ์„œ ์‚ฌ์šฉํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด Not Found์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์™€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š”์ง€๋„ ํ•จ๊ป˜ ์—๋Ÿฌ ๋กœ๊ทธ์™€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—๋Ÿฌ ์‘๋‹ต์ด ์ƒ์„ฑ๋˜๊ธฐ๊นŒ์ง€์˜ ์—ฌ์ • ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์Šคํ”„๋งMVC์—์„œ๋Š” ์—๋Ÿฌ ๋ฉ”์„ธ์ง€๋ฅผ..

๐Ÿ’ Spring/๊ฐœ๋… ๋ฐ ์ดํ•ด

Spring MVC | @Valid๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฑฐ์•ผ? (feat. DispatcherServlet)

@Valid Spring Boot์—์„œ @Valid๋ฅผ @RequestBody ๊ฐ์ฒด์— ๋ถ™์ด๊ฒŒ ๋˜๋ฉด, ์ด๋•Œ ์Šคํ”„๋ง์€ Hibernate Validator(javax.validation ํŒจํ‚ค์ง€์— ์žˆ๋Š” JSR-303/JSR-380์ธ BeanValidation์„ ํ™œ์šฉํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Spring MVC์—์„œ๋Š” Validation์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ MVC ๋™์ž‘์›๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Dispatcher Servlet ์•„๋ž˜๋Š” Spring MVC์˜ ๋™์ž‘๊ตฌ์กฐ๋ฅผ ๋„์‹ํ™”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐจ๊ทผํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ œ์ผ ๋จผ์ € ๋ฐ›๋Š” ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ(ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ)์ž…๋‹ˆ๋‹ค. DispatcherServlet์˜ HandlerMapping ์ „๋žต์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด ์ค„ Controller๋ฅผ ์ฐพ์Šต..

๐Ÿ’ Spring

Spring Validation์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆํ•˜๊ธฐ

Validation ์š”์ฒญ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ(์‚ฌ์šฉ์ž์˜ ์•„์ด๋””์˜ ๊ธธ์ด๋ผ๋˜์ง€ ์ •๊ทœํ‘œํ˜„์‹์— ๋งŒ์กฑํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒ€์ฆ ๋“ฑ๋“ฑ)๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ๋ณดํ†ต Service ๋กœ์ง์— ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค. DB ์ค‘๋ณต ์ฒดํฌ ๋“ฑ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์„œ๋น„์Šค์— ๋‘๊ณ , ์ด ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” Validation ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋”๋Ÿฌ ์„œ๋น„์Šค์—๋Š” ์˜ค์ง ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ๋‘˜ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‹ค์Šต์„ ํ†ตํ•ด ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœํ™˜๊ฒฝ SpringBoot 2.7.9 JDK 11 Gradle ์˜์กด์„ฑ ์ถ”๊ฐ€ SpringBoot 2.3.0 ์ด์ƒ๋ถ€ํ„ฐ๋Š” ์˜์กด์„ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. implementation 'org.springfram..

๐Ÿ’ Spring

Springdoc์„ ์ด์šฉํ•œ API ๋ฌธ์„œ ์ž๋™ํ™” (Swagger, SpringBoot 3.x)

Spring Boot 3.x.x ๋ถ€ํ„ฐ๋Š” JavaEE → Jakarta EE๋กœ ๊ต์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์— ์‚ฌ์šฉํ–ˆ๋˜ Springfox๋Š” ํ˜„์žฌ Spring Boot 3.x.x์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ค„์ง€์ง€ ์•Š๊ณ  ํ˜„์‹œ์ ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Springdoc ๊ณต์‹๋ฌธ์„œ์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋ฐฉ๋ฒ•์ด ๋‚˜์™€์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. springdoc-openapi v2.0.2 ์˜์กด์„ฑ ์ถ”๊ฐ€ Spring Boot 3.x.x๋ถ€ํ„ฐ๋Š” ์•„๋ž˜ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด Swagger-ui ์„ค์ •์€ ๋์ž…๋‹ˆ๋‹ค. implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2" springdoc-openapi-ui → springdoc-..

iseunghan
'๐Ÿ’ Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก