ThreadLocal
์คํ๋ง ์ํ๋ฆฌํฐ์ SecurityContextHolder๋ฅผ ์ฌ์ฉํ์ จ๋๋ฐ ThreadLocal์ ๋ํด์ ์ด์ผ๊ธฐํด๋ณด์ธ์.
์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ด๋ถ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ํด๋์ค ์ค ํ๋๋ ThreadLocal ์ด๋ผ๋ ์๋ฐ ๊ธฐ๋ณธ ํด๋์ค๋ผ๊ณ ํ ์ ์๋ค. ์ ์ ์น ๊ฐ๋ฐ์๋ค์ ๋ํ ์ธํฐ๋ทฐ๋ฅผ ์งํํ๋ค๋ณด๋ฉด ์คํ๋ง ํ๋ ์์ํฌ์ ์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์์๋ ๋ถ๊ตฌํ๊ณ ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ๋์์ ํ๋์ง ๋ชจ๋ฅด๊ฑฐ๋ ThreadLocal ์ด๋ผ๋ ์๋ฐ ์ธ์ด์์์ ๊ธฐ๋ณธ ์ง์์ ๋ํด์ ๋ค์ด๋ณด์ง ๋ชปํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋๋ถ๋ถ ์ ๋ช ํ ๊น์ํ๋์ ๊ฐ์๋ฅผ ์๊ฐํ๋ค๊ณ ์ด๋ ฅ์์ ๊ธฐ์ฌํ๊ธฐ ๋๋ฌธ์ ์ด ThreadLocal์ ๋ํ ๋ถ๋ถ์ ๋ค๋ฃจ์ง ์์๋ค๊ณ ์๊ฐํ๋๋ฐ ์ฐพ์๋ณด๋ ThreadLocal์ด๋ผ๋ ๋ถ๋ถ์ ๋ํด์๋ ์ธ๊ธํ๊ณ ์๊ธฐ์ ์๊ฐ์๋ค์ด ์ผ๋ถ ๋ด์ฉ์ ์ค์ค๋ก ์๋ตํ๊ณ ๋์ด๊ฐ์ ๊ฒ ๊ฐ๋ค.
XXXContextHolder
โ org.springframework.web.context.request.RequestContextHolder
โ org.springframework.context.i18n.LocaleContextHolder
โ org.springframework.security.core.context.SecurityContextHolder
์์ ๊ฐ์ด ContextHolder๋ก ๋๋๋๋ก ์ด๋ฆ์ด ์ ์๋ ํด๋์ค๋ ๋ด๋ถ์ ์ผ๋ก ThreadLocal์ ์ฌ์ฉํ๋๋ก ๊ตฌํ๋์ด์๋ ๋ํ์ ์ธ ์คํ๋ง ํ๋ ์์ํฌ์ ํด๋์ค์ด๋ค. ์ธํ ๋ฆฌ์ ์ด IDEA๋ฅผ ํตํด์ ์ ํด๋์ค๋ค์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ๋ฐ๋ผ๊ฐ๋ณด๋ฉด ์ด๋ป๊ฒ ํ์ฉํ๊ณ ์๋์ง๋ฅผ ์ดํดํ ์ ์๋๋ฐ RequestContextHolder์ LocaleContextHolder์ ์์ฑ๊ณผ ์ญ์ ๋ RequestContextFilter์์ ์ํํ๊ณ ์์ผ๋ฉฐ SecurityContextHolder๋ SecurityContextHolderFilter์์ ๊ด๋ฆฌํ๊ณ ์์์ ์ฐพ์ ์ ์๋ค.
์ด์ ๊ฐ์ด ์ผ๋ฐ์ ์ธ ์๋ฐ ๊ฐ๋ฐ์๋ค๋ ThreadLocal๊ณผ Filter๋ฅผ ๊ตฌํํ์ฌ ๋์ผํ ์ค๋ ๋ ๋ด์์๋ ์ธ์ ๋ ์ง ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ํจํด์ ๋ง๋ค ์ ์๋ค๋ ์ด์ผ๊ธฐ์ด๋ค. ThreadLocal ์์ฒด๊ฐ ์ค๋ ๋ ๋ด์ ์ ๋ณด ๊ณต์ ๋ฅผ ์ํ ์ง์ญ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
RequestContextFilter
RequestContextFilter์์๋ HttpServletRequest์ ๋ก์ผ์ผ ์ ๋ณด์ ServletRequestAttributes๋ฅผ ThreadLocal์ ์ ์ฅํ๋๋ก ๊ตฌํ๋์ด์๋ค. ๋ค๋ฅธ ํํฐ๋ฅผ ๊ฑฐ์น๊ณ ๋ ํ ๋ฐ๋์ ThreadLocal์ ์๋ ์ ๋ณด๋ค์ ์ ๊ฑฐํ๋๋ก ๋์ด์๋ ๋ถ๋ถ์ด ์ค์ํ๋ค. RequestContextHolder์ ์ ์ฅ๋๋ ํด๋์ค๋ ServletRequestAttributes ์ด๋ฉฐ ์ด์ ์ ๊ณต์ ํ ๋ ๋์ค ์ฅ์ ํ๊ณ ์์๋ ๋ด๋ถ ๊ตฌํ์ ์ดํด๋ณธ ํด๋์ค์ ํด๋นํ๋ค.
SecurityContextHolderFilter
์คํ๋ง ์ํ๋ฆฌํฐ 5.7+ ๋ถํฐ๋ SecurityContextPersistenceFilter๊ฐ ์๋ SecurityContextHolderFilter๋ก ๋์ฒด๋์ด ์ฌ์ฉ๋๋ค. SecurityContextPersistenceFilter๋ก ์ฒ๋ฆฌ๋๋ ๊ฒ์ด SecurityContextHolderFilter ์์๋ ์ด๋ ํ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์๋์ง ๋น๊ตํด๋ณด์๋ ์ข์ ํ์ต์ด ๋ ๊ฒ ๊ฐ๋ค. Supplier ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ฌ SecurityContext๋ฅผ ์ง์ฐ๋์ด ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์๋ค.
๋ง์ ํ์ฌ์์ ์ ์ ๊ฐ๋ฐ์์๊ฒ ๋ฐ๋ผ๋ ์ญ๋ ์ค ๊ธฐ๋ณธ ์ง์์ ๋ํ ์ด์ผ๊ธฐ๋ ์ฌ์ฉํ๋ ๊ธฐ์ ์ ๋ํด์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ๊ฐ๋ ์ด ์๋์ง ์ฐพ์๋ณด๋ ํธ์ธ๊ฐ๋ฅผ ๋งํ๋๊ฒ ์๋๊น? ๋น๋ก ์ ์ ์น ๊ฐ๋ฐ์๋ก ์ผํ๊ธฐ ์ํด์ ์ค๋ฌด ๊ธฐ์ ์ ๋ํ ์ญ๋์ ๋ฐฐ์ฐ๊ณ ์ดํํ๋ ๊ฑด ์ด์ฉ ์ ์๋ ์ํฅ ํ์คํ๋ ๋ถ๋ถ์ด ์์ง๋ง ๊ธฐ๋ณธ์ ์ธ ์ง์๊ณผ ๊ด๋ จ๋ ์ง์์ ์๋์ง ์ฐพ์๋ณด๊ณ ์ง์์ ์ธ ํ์ต์ ๋ํ ์ดํ๋ ํ์ํ ๊ฒ์ด๋ค.