๐ŸŒฑ JAVA & SPRING/Spring 5

[spring-test] standaloneSetup() vs webAppContextSetup()

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ Spring Security๊ฐ€ ์ ์šฉ๋œ ๊ณณ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด `@WithSecurityContext` ๋ผ๋Š” ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ์„ฑํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ SecurityContext์— ํ…Œ์ŠคํŠธ์—์„œ ํ™œ์šฉํ•  ์ธ์ฆ ์ •๋ณด๋ฅผ ์ฃผ์ž…ํ–ˆ๋Š”๋ฐ๋„ ๊ณ„์†ํ•ด์„œ ์ธ์ฆ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๊ฐ€ failํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.. ๋ฌดํ•œ ์‚ฝ์งˆ์„ ํ†ตํ•ด MockMvc๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ด ๋‹ฌ๋ผ์ง์„ ๊นจ๋‹ฌ์•˜๋‹ค. MockMvc ์‹ค์ œ๋กœ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ ๋„ API ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ชจํ‚น๋œ ๊ฐ์ฒด์ด๋‹ค. ์ฃผ๋กœ Controller ๋ ˆ์ด์–ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. MockMvcBuilder๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์…‹ํŒ…ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, `standaloneSetup` ํ˜น์€ `webAppContextSetup`..

[spring-test] JUnit5 Test ์ •๋ฆฌ

JUnit5์˜ ์žฅ๋‹จ์  ์žฅ์  JUnit5๋Š” JUnit4์˜ ๋ฌธ์ œ์ ์„ ๋ณด์™„ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„์‚ฌ์ดํด์„ ์ง€์›ํ•˜๊ณ , ๋™์  ํ…Œ์ŠคํŠธ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ํ…Œ์ŠคํŠธ ํŒŒ๋ผ๋ฏธํ„ฐํ™” ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“ˆํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋‹จ์  JUnit5๋Š” ์•„์ง ๋งŽ์€ Java ๊ฐœ๋ฐœ์ž๋“ค์ด ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ IDE ์ง€์›์ด JUnit4์— ๋น„ํ•ด ๋ฏธํกํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. JUnit5๊ฐ€ JUnit4์— ๋น„ํ•ด ๋งŽ์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ตœ๊ทผ์—๋Š” ๋” ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์•„์ง JUnit4๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ @ExtendWith() JUnit 5์˜ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, JUnit 4์˜ `@RunWith` ์„ ๋Œ€์ฒดํ•œ๋‹ค. `@..

๐Ÿค” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์€ "์™œ" ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ• ๊นŒ?

๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด Spring(ํ˜น์€ Spring Boot)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ž๋ช…ํ•œ ์‚ฌ์‹ค์ด๋‹ค. ๋‚˜๋„ Spring ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ์žˆ์ง€๋งŒ, "์Šคํ”„๋ง์˜ ์–ด๋–ค ์  ๋•Œ๋ฌธ์— ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ๊นŒ?"์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ•œ ์ ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„ ์ด ๊ธ€์„ ์ ๊ฒŒ ๋˜์—ˆ๋‹ค. ๐Ÿ™‹‍โ™€๏ธ ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด, ์Šคํ”„๋ง์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ Bean, IoC, DI ์ด๋‹ค. ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ Bean ์ •์˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•„์š”ํ•œ Bean(๊ฐ์ฒด)์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. ๋˜ํ•œ, ์Šคํ”„๋ง์€ DI๋ฅผ ํ†ตํ•ด ๊ทธ๊ฑธ ์ฃผ์ž…๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฐ์ฒด๋“ค์—๊ฒŒ ์•Œ์•„์„œ ์ฃผ์ž…ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค. Bean Bean์ด๋ž€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ๋œปํ•œ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” Bean์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, Bean..

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ & ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ

ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ๋น„์Šทํ•œ๋“ฏ ๋‹ค๋ฅด๋‹ค. ๋‘˜์˜ ๊ณตํ†ต์ ์„ ๋จผ์ € ๋ณด๊ณ  ๊ฐ๊ฐ์„ ์‚ดํŽด๋ณด์ž. ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ์˜ ๊ณตํ†ต์  - ์›น๊ณผ ๊ด€๋ จ๋œ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์ด๋‹ค. - HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ฐ€๋กœ์ฑ„๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. - ์ฒด์ธ ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ ํ•„ํ„ฐ๋Š” HTTP ์š”์ฒญ ๋˜๋Š” ์‘๋‹ต์„ ๊ฐ€๋กœ์ฑ„์„œ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•˜๋Š” ๊ฐœ์ฒด์ด๋‹ค. ํ•„ํ„ฐ ํ๋ฆ„ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ๋“ฑ๋ก๋œ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•œ๋‹ค. ํ•„ํ„ฐ ์ฒด์ธ ํ•„ํ„ฐ๋Š” ์ฒด์ธ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์ค‘๊ฐ„์— ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ํ•„ํ„ฐ๋ฅผ ๋จผ์ € ์ ์šฉํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์— ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•„ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค ํ•„ํ„ฐ๋Š” Java EE ์ŠคํŽ™์— ํฌํ•จ๋œ ๊ธฐ์ˆ ์ด๋‹ค. ํ•„ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์•„๋ž˜ ๋ณด์ด๋Š” ์„ธ ๊ฐ€์ง€ ..

Spring MVC ๊ตฌ์กฐ ๋ฐ ๋™์ž‘ ์›๋ฆฌ

Spring MVC์˜ ํ•ต์‹ฌ์€ DispatcherServlet์ด๋‹ค. ๋”ฐ๋ผ์„œ DispatcherServlet์˜ ๋ถ€๋ชจ์ธ Servlet๋ถ€ํ„ฐ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. Servlet ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด, ์„œ๋ธ”๋ฆฟ(Servlet)์ด๋ž€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์„œ๋ธ”๋ฆฟ์€ ์™œ ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ์„๊นŒ? ์ •์  ํŽ˜์ด์ง€๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ดˆ๊ธฐ ์›น ์„œ๋ฒ„ ์ดˆ๊ธฐ ์›น ์„œ๋ฒ„๋Š” ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜๋“  ๋ณ€ํ•จ์ด ์—†๋Š” ์ •์ ์ธ ํŽ˜์ด์ง€(์ด๋ฏธ์ง€, html, css)๋งŒ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์ฐจ ์‚ฌ์šฉ์ž๋Š” ๋งž์ถคํ˜• ํŽ˜์ด์ง€(ex. ๋กœ๊ทธ์ธ ํ›„ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ง€)์™€ ์ƒํ˜ธ ์ž‘์šฉ์ ์ธ ์š”์†Œ(ex. ์˜จ๋ผ์ธ ์‡ผํ•‘ ์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ œํ’ˆ์„ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ณ  ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ–‰์œ„)๋ฅผ ์›ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด WAS๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๋‹ค. ์ธ์ž์˜ ๋‚ด์šฉ์— ๋งž๊ฒŒ ๋™์ ์ธ ..