์ „์ฒด ๊ธ€

Spring

[Spring] Interceptor๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ? - DispatcherServlet ๋‚ด๋ถ€ ์ฝ”๋“œ ์‚ดํŽด๋ณด๊ธฐ

์—ฌ๊ธฐ ๊ฐ„๋‹จํ•œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ์„ ์ถ”๊ฐ€, ์ œ๊ฑฐ, ์กฐํšŒํ•˜๋Š” ๋”ฑ ์„ธ ๊ฐ€์ง€์˜ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์•„๋ฌด๋‚˜ ๋‚ด ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ์„ ๋‹ด์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค! ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ์ž์‹ ์˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ์„ ๋‹ด์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ƒํ’ˆ์„ ๋‹ด๊ธฐ ์ „์— ์ƒํ’ˆ์„ ๋‹ด์œผ๋ ค๋Š” ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ž‘์—…์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ˆ์ฐจ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. 'Authorization' ํ—ค๋” ์ถ”์ถœ ์ถ”์ถœ๋œ ์ •๋ณด๋กœ ์šฐ๋ฆฌ์˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํšŒ์›์ธ์ง€ ํ™•์ธ ์ด ์ž‘์—…์€ ์ƒํ’ˆ ์ถ”๊ฐ€, ์ƒํ’ˆ ์ œ๊ฑฐ, ์ƒํ’ˆ ์กฐํšŒ API์— ๋ชจ๋‘ ์ถ”๊ฐ€๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @RestController public class CartController { @PostMapping("/carts/products/{productId..

์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค/ํšŒ๊ณ 

์šฐํ…Œ์ฝ” ๋ ˆ๋ฒจ2 ์›น ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜ ํšŒ๊ณ 

์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค ๋ ˆ๋ฒจ2๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•œ๋‹ค. ๋ ˆ๋ฒจ2 ์ฒซ ๋ฒˆ์งธ ๋ฏธ์…˜์€, ๋ ˆ๋ฒจ1 ๋ฏธ์…˜์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ์ฝ˜์†” ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„์„ ์›น์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์‚ฌ์‹ค ๋‘ ๋ฒˆ์งธ ๋ฏธ์…˜์ด ๊ฑฐ์˜ ๋๋‚˜๊ฐ€๋Š” ์‹œ์ ์ด์ง€๋งŒ, ์งง๊ฒŒ๋ผ๋„ ๊ธฐ๋ก์„ ๋‚จ๊ธฐ๊ณ  ์‹ถ์–ด ํšŒ๊ณ ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๋‚˜๋Š” ์Šคํ”„๋ง์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฅธ๋‹ค. ๊ฒฝํ—˜์€ ํ•ด๋ดค์ง€๋งŒ ๊นŠ์€ ์ดํ•ด๋Š” ์—†๋Š” ์ •๋„์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ฒ˜์Œ์— ๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ถ„๋ช…ํžˆ ํ•ด๋ดค๋Š”๋ฐ ๋ญ์˜€๋”๋ผ..?๋ฅผ ๋ฐ˜๋ณตํ–ˆ๋‹ค.. ๋ญ”๊ฐ€ ์–ด๋ ดํ’‹ํ•˜๊ฒŒ ๊ธฐ์–ต์ด ๋‚˜๋Š” ๋“ฏํ•˜๋ฉด์„œ ์ •๋ง ํ•˜๋‚˜๋„ ์ œ๋Œ€๋กœ ๋ชจ๋ฅด๋Š”๊ตฌ๋‚˜ ์‹ถ์—ˆ๋‹ค ๐Ÿ˜ญ ๊ทธ๋ฆฌ๊ณ  ์Šคํ”„๋ง์ด ๋„ˆ๋ฌด ๋ฐฉ๋Œ€ํ•˜๋‹ค ๋ณด๋‹ˆ๊นŒ ์ •๋ง ๊ณต๋ถ€ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด์„œ๋„ ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ•ด์•ผ ํ–ˆ๋‹ค. ๋‹น์žฅ ๋ฏธ์…˜์„ ๊ตฌํ˜„ํ•  ์ •๋„๋กœ๋Š” ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์–ด๋Š ์ •๋„๊นŒ์ง€ ๊นŠ๊ฒŒ ๊ณต๋ถ€๋ฅผ ํ•ด์•ผ ํ• ์ง€๋Š” ๋‚ด๊ฐ€ ํŒ๋‹จํ•ด์•ผ ํ–ˆ๋‹ค. ์‚ฌ์‹ค ์•„์ง๋„ ์ž˜ ๋ชจ..

Spring

Mockito.mock(), @Mock๊ณผ @MockBean์˜ ์ฐจ์ด์ 

ํ…Œ์ŠคํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋ฌด๊ฒ๊ณ  ๊ท€์ฐฎ์•„์š” ๐Ÿ˜ฎโ€๐Ÿ’จ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ ์™ธ๋ถ€ ํ™˜๊ฒฝ๊ณผ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋ž€ ์ฐธ ์–ด๋ ค์šด ์ผ์ด๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋Š” ์„œ๋น„์Šค์—์„œ ๋กœ์ง์— ๋งž๊ฒŒ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์€๋ฐ, ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ๋„ฃ์–ด๋†“๋Š” ๋“ฑ๋“ฑ ๊ธฐํƒ€ ์„ค์ •๋“ค์„ ํ•˜๋Š”๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ๋“ค์—ฌ์•ผํ•œ๋‹ค. ๋˜ ํ…Œ์ŠคํŠธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ด€์—ฌํ•˜๋ฉด์„œ ๋ถ€ํ„ฐ๋Š”, ํ…Œ์ŠคํŠธ ํ›„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์›Œ์ฃผ๋Š” ๋“ฑ ํ›„์ฒ˜๋ฆฌ๋ฅผ ์ œ๋Œ€๋กœ ํ•˜์ง€ ์•Š์•„์„œ ์ „์ฒด ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ธ์„ ๋•Œ ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•˜๋Š” ๊ฒฝํ—˜์„ ๋งŽ์ด ํ•ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ๋”๋ธ”(Test Double)์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋‚˜์™”๋‹ค. xUnit Test Patterns์˜ ์ €์ž์ธ ์ œ๋ผ๋“œ ๋ฉ”์Šค์ž๋กœ์Šค(Gerard Meszaros)๊ฐ€..

์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค/ํšŒ๊ณ 

์šฐํ…Œ์ฝ” ๋ ˆ๋ฒจ1 ๋Œ์•„๋ณด๊ธฐ

์•ฝ ๋‘๋‹ฌ ๊ฐ„์˜ ๋ ˆ๋ฒจ1 ๊ธฐ๊ฐ„์ด ๋๋‚ฌ๋‹ค. ๋งˆ์Œ์˜ ์—ฌ์œ  ์—†์ด ์ด๊ฒƒ์ €๊ฒƒ ํ•˜๋‹ค๋ณด๋‹ˆ ๋ฏธ์…˜์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค ๋˜๋Œ์•„ ๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ–์ง€ ๋ชปํ•ด ํ›„ํšŒ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋ ˆ๋ฒจ1 ๊ธฐ๊ฐ„์„ ๋Šฆ๊ฒŒ๋‚˜๋งˆ ๋Œ์•„๋ณด๊ณ , ๋˜ ๋ ˆ๋ฒจ2๋ฅผ ์ž˜ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ๋‹ค์ง๋„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค! ๋ฒŒ์จ ๊ธฐ์–ต์ด ๊ฐ€๋ฌผ๊ฐ€๋ฌผํ•˜๋‹ค.. 1. ์ฒซ ๋ฒˆ์งธ ๋ฏธ์…˜, ์ž๋™์ฐจ ๊ฒฝ์ฃผ ํ”„๋ฆฌ์ฝ”์Šค ์ตœ์ข… ์ฝ”ํ…Œ ์ดํ›„๋กœ ์ž๋ฐ”๋ฅผ ์ณ๋‹ค๋ณด์ง€๋„ ์•Š์•˜๋”๋‹ˆ ์ฒซ ๋ฏธ์…˜๋•Œ ์ง„๋•€์„ ๋บ๋‹ค. ํ”„๋ฆฌ์ฝ”์Šคํ•˜๋ฉด์„œ๋„ ํ•™๊ต ์กธ์—…๊ณผ์ œ ๋•Œ๋ฌธ์— ์˜จ์ „ํžˆ ์ง‘์ค‘ํ•˜์ง€ ๋ชปํ–ˆ๋Š”๋ฐ, ๊ทธ ์‚ฌ์ด์— ๊ณต๋ถ€ ์ข€ ํ•  ๊ป„ ํ›„ํšŒ๊ฐ€ ๋๋‹ค.. ์ฒซ ํŽ˜์–ดํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ ์–ด์ƒ‰ํ•˜๊ธฐ๋„ ํ•˜๊ณ  ๋ญ๋ž„๊นŒ ์ฐธ ์‹ ๊ธฐํ•œ ๊ฒฝํ—˜์ด๋ผ ์ƒ๊ฐํ–ˆ๋‹ค. ์ž๋ฐ”๋ฅผ ํ™€๋ผ๋‹น ๊นŒ๋จน์–ด๋ฒ„๋ ค์„œ ์•„๋ฌด๊ฒƒ๋„ ์ œ๋Œ€๋กœ ๋ชปํ•˜๋Š” ๋‚˜๋ฅผ ๋ณด๊ณ  ํŽ˜์–ด๋Š” ๋ฌด์Šจ ์ƒ๊ฐ์„ ํ–ˆ์„๊นŒ ๐Ÿ˜… ๋™์‹œ์— ์ž๋ฐ”๋ฅผ ์ง„์งœ ์—ด์‹ฌํžˆ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋ถˆํƒ€์˜ค๋ฅด..

์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค/๋ฏธ์…˜

๊ฐ์ฒด๊ฐ„์˜ ์˜์กด์„ฑ ์ค„์ด๊ธฐ

์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„ ๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ฐ€์žฅ ๋งŽ์ด ๊ณ ๋ฏผํ–ˆ๋˜ ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. 1. ๊ณ ๋ฏผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„ ๋ฏธ์…˜์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋งŽ์ด ๊ณ ๋ฏผํ•œ ๋ถ€๋ถ„์€ โ€˜๊ฐ์ฒด๊ฐ€ ํ•„๋“œ๋กœ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์–ด๋””์—์„œ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผ ํ• ์ง€โ€™ ์ด๋‹ค. ํ•˜๋‚˜์˜ ์™„์„ฑ๋œ '์‚ฌ๋‹ค๋ฆฌ'๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋งŽ์€ ๋ถ€ํ’ˆ๋“ค์ด ํ•„์š”ํ•˜๋‹ค. (์•„์ง 2์ฃผ์ฐจ ๋ณ‘์•„๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์—..) ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋ฅผ ์–ด๋””์„œ ์ƒ์„ฑํ•ด์•ผ ํ•  ์ง€ ์กฐ์ฐจ ํ™•์‹คํ•˜๊ฒŒ ๋‹ต์„ ๋‚ด๋ฆฌ๊ธฐ ์–ด๋ ค์› ๋‹ค. ๋จผ์ € ์‚ฌ๋‹ค๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž. 1.1. ์‚ฌ๋‹ค๋ฆฌ ๊ตฌ์„ฑ ์‚ฌ๋‹ค๋ฆฌ(Ladder) ํ•˜๋‚˜๋Š” ๋””๋”ค๋Œ€๋“ค(Lines)์ด ๋ชจ์—ฌ์„œ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๋””๋”ค๋Œ€ ํ•˜๋‚˜(Line)๋Š” ๋””๋”ค๋Œ€ ์กด์žฌ ์œ ๋ฌด์˜ ์ƒํƒœ๋“ค(List)์ด ๋ชจ์—ฌ์„œ ๋งŒ๋“ค์–ด์ง„๋‹ค. (LineStatus๋Š” boolean ๊ฐ’์ด๋‹ค.) ๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ๋‹ค๋ฆฌ ํ•˜๋‚˜๋ฅผ ๋งŒ..