๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring/Test

์ „์ฒด ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„ ์†๋„๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” Spring Test Context Caching

by ํ‘์‹œ๋ฐ” 2023. 11. 8.

๐Ÿ˜‚  ๋ฐฐ๊ฒฝ

ํ•„์ž๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ฐ ์ผ€์ด์Šค๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ณ , ๋ฉ”์„œ๋“œ ์ž‘์„ฑ์ด ์ ๋‹นํžˆ ๋งˆ๋ฌด๋ฆฌ๋˜๋ฉด ํด๋ž˜์Šค ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•ด ์™”๋‹ค.

 

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์–ด๋Š ์ •๋„ ์–‘์ด ์Œ“์˜€์„ ๋•Œ ์ „์ฒด ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ธ๋Š”๋ฐ, ์‹œ๊ฐ„์ด ๊ต‰์žฅํžˆ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ ๋Š” ์ถฉ๊ฒฉ์„ ๋ฐ›์•˜๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ „์ฒด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜ํ–‰ ์†๋„์— ๋Œ€ํ•ด ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , Context Caching์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

[ Context Caching ]

์Šคํ”„๋ง ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ApplicationContext๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ด๋ฅผ ์บ์‹œ์— ์ €์žฅํ•˜๊ณ , ๋งŒ์•ฝ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ฆด ๋•Œ ์ด๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ํ…Œ์ŠคํŠธ์—์„œ ๋„์šด ์ปจํ…์ŠคํŠธ๋ฅผ ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์บ์‹ฑํ•ด ๋‘” ์ปจํ…์ŠคํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ Context Caching์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

Context Caching์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ์Šคํ”„๋ง ํ†ตํ•ฉ(Integration) ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰์‹œํ‚ด์œผ๋กœ์จ ์ƒ์‚ฐ์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

๊ทธ๋Ÿผ Context๋ฅผ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋Š” ์–ด๋–ค ๊ฒƒ์ผ๊นŒ?

๋ฐ”๋กœ, ํ…Œ์ŠคํŠธ๊ฐ€ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. 

์Šคํ”„๋ง์€ ๋™์ผํ•œ ํ™˜๊ฒฝ์ด๋ผ๋Š” ๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ํŒ๋ณ„ํ• ๊นŒ? ์ด๊ฒƒ์€ Context Caching์—์„œ cache key๊ฐ€ ๋ฌด์—‡์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š”์ง€์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค. ์Šคํ”„๋ง ํ…Œ์ŠคํŠธ ์ปจํ…์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹ค์Œ ๊ตฌ์„ฑ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…์ŠคํŠธ cache key๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

  • locations (from @ContextConfiguration)
  • classes (from @ContextConfiguration)
  • contextInitializerClasses (from @ContextConfiguration)
  • contextCustomizers (from ContextCustomizerFactory) – this includes @DynamicPropertySource methods as well as various features from Spring Boot’s testing support such as @MockBean and @SpyBean.
  • contextLoader (from @ContextConfiguration)
  • parent (from @ContextHierarchy)
  • activeProfiles (from @ActiveProfiles)
  • propertySourceLocations (from @TestPropertySource)
  • propertySourceProperties (from @TestPropertySource)
  • resourceBasePath (from @WebAppConfiguration)

์ด ์ค‘์—์„œ ๊ฐ€์žฅ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ @MockBean, @SpyBean์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์žฌ์‚ฌ์šฉ ์—ฌ๋ถ€์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, @MockBean, @SpyBean์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ํ™˜๊ฒฝ์œผ๋กœ ์ธ์‹ํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋œจ๊ฒŒ ๋œ๋‹ค.

[ ํ™œ์šฉ Tip ]

1. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ƒ์† ํ™œ์šฉ

๋™์ผํ•œ ํ™˜๊ฒฝ์„ ์œ ์ง€์‹œํ‚ค๋Š” ์ข‹์€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์— ๋™์ผํ•œ ์„ค์ •์„ ๋„ฃ๊ณ  ์ƒ์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ฌด์–ธ๊ฐ€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ ์„ค์ •์„ ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ  ํŽธ๋ฆฌํ•˜๋‹ค.

2. @MockBean/@SpyBean ๋˜ํ•œ ์ƒ์† ํ™œ์šฉ

@MockBean ๋˜๋Š” @SpyBean์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด, ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ํ•„์š”ํ•œ @MockBean/@SpyBean์„ ๋ชจ๋‘ ํ•˜๋‚˜์˜ ์ƒ์œ„ ํด๋ž˜์Šค์— ์„ ์–ธํ•˜๊ณ  ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ƒ์†์‹œ์ผœ์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ ์  ํด๋ž˜์Šค๊ฐ€ ์ปค์ง€๊ฒ ์ง€๋งŒ ํ•„์ž๋Š” Context Caching์ด ์ฃผ๋Š” ์ด์ ์ด ๋” ํฌ๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

REFERENCE

https://docs.spring.io/spring-framework/reference/testing/testcontext-framework/ctx-management/caching.html

https://medium.com/@inzuael/how-to-optimize-the-runtime-of-your-springboot-integration-tests-2a13584f577e

๋Œ“๊ธ€