๐Ÿ’ Spring

๐Ÿ’ 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-..

๐Ÿ’ Spring/Spring Security

CORS์ด๋ž€ ๋ฌด์—‡์ด๊ณ , Spring-boot์—์„œ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•

CORS (Cross-Origin Resource Sharing) ์ด๋ž€? A๋ผ๋Š” ๋„๋ฉ”์ธ์—์„œ ์ œ๊ณต๋˜๋Š” FE์—์„œ โ†’ B๋ผ๋Š” ๋„๋ฉ”์ธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” BE์— HTTP ์š”์ฒญ์„ ํ–ˆ์„ ๊ฒฝ์šฐ, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด๋ผ ํŒ๋‹จํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ์„ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Preflight Request ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹ค์ œ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „ ๋ธŒ๋ผ์šฐ์ € ์Šค์Šค๋กœ ์ด ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ์ง€ ์˜ˆ๋น„ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๊ฒŒ ๋ฐ”๋กœ Preflight Request๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด Preflight Request๋Š” OPTION ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์š”์ฒญํ•˜๋Š”๋ฐ ์„œ๋ฒ„์—์„œ ๋ณด๋‚ด์ค€ ์‘๋‹ต ํ—ค๋”์— Access-Controller-* ํ—ค๋”๋“ค์ด ์ž˜ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. GET, POST, HEAD ์š”์ฒญ..

๐Ÿ’ Spring/Spring Security

(Deprecated) WebSecurityConfigurerAdapter์— ๋Œ€์‘ํ•˜๊ธฐ

Spring Boot 2.7 (Spring 5.7.0-M2) ๋ถ€ํ„ฐ WebSecurityConfigurerAdapter๋Š” Deprecated๊ฐ€ ๋˜์—ˆ๋‹ค. Spring Security without the WebSecurityConfigurerAdapter In Spring Security 5.7.0-M2 we deprecated the WebSecurityConfigurerAdapter, as we encourage users to move towards a component-based security configuration. authz .anyRequest().authenticated() ) .httpBasic(withDefaults()); } } ์Šคํ”„๋ง์€ SecurityFilterChain ๋นˆ์„ ๋“ฑ๋กํ•˜..

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