๋ค์ํ ๊ธฐ๋ฅ๋ค์ด ์์ต๋๋ค. ๋ง์ฝ Spring Security๋ฅผ ์ ์ฉํ์ง ์๋๋ค๋ฉด ์์ ๊ธฐ๋ฅ๋ค ์ค ํ์ํ ๋ถ๋ถ์ ๋ชจ๋ ์์ ๋ค ๊ตฌํํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ ์ธ ์ด์ ๊ฐ ์๊ฒ ์ฃ ?
๋ Security์์ OAuth2๋ฅผ Resource sever ๋ก์ ๊ตฌํ์ ํ ์๋ ์๊ณ Client ๋ก์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด ๋์์ต๋๋ค. Spring Security๋ฅผ ์ด์ฉํ์ง ์๊ณ RestTemplate์ด๋ WebClient๋ก OAuth๋ฅผ ์ ๊ณตํ๋ ์๋น์ค์ API ์์ฒญ์ ์๊ณ Redirect๋ฅผ ๊ตฌํํด OAuth๋ฅผ ์ด์ฉํ ์ ์์ง๋ง ๊ทธ ๋ชจ๋ ๊ฒ Spring Security์ ๊ตฌํ์ด ๋์ด์๊ธฐ ๋๋ฌธ์ Spring Security๋ฅผ ์ฌ์ฉํด ์นด์นด์ค OAuth ์๋น์ค๋ฅผ ์ด์ฉํ์์ต๋๋ค.
ํ์ง๋ง ์ด์ ๋ฐ๋ฅธ ๋๊ฐ๊ฐ ์๋๋ฐ ๋๋ฌด ๋์ ์ถ์ํ ์์ค ๋๋ฌธ์ ์ญ์ถ์ ์ด ์ฝ์ง๊ฐ ์๊ณ ์ง์ ๋๋ฒ๊น ์ ํ๋ฉด์ ๋ฐ๋ผ๊ฐ์ง ์์ผ๋ฉด ๊ทธ ํ๋ฆ์ ํ์ ํ๊ธฐ ์ด๋ ต๋ค๋ ๊ฒ์ ๋๋ค. ๐ญ ๊ทธ๋์ ๋จผ์ ๊ธฐ๋ณธ์ ์ธ Spring Security ์ํคํ ์ฒ ์ ๋ํด ์๊ณ ๊ฐ์ผ ํ๋ค๊ณ ์๊ฐํ์๊ณ ํ์ต ํ ๋๋ฒ๊น ์ ํด๋ณด๋ฉฐ ๋ฐ๋ผ๊ฐ์ ๋ ๋ ๋น ๋ฅด๊ฒ ํก์ ํ ์ ์์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ค์ํฉ๋๋ค.
์ ๋ OAuth๋ฅผ ์ ์ฉํ๊ธฐ ์ ์ ๋จผ์ Spring Security์ ๊ตฌ๋์๋ฆฌ์ ์ํคํ ์ฒ์ ๋ํด ๋จผ์ ํ์ตํ์์ต๋๋ค. ์ฒ์์๋ ๋ฌดํฑ๋๋ก ๋ธ๋ก๊ทธ์ ๊ธ์ ๋ณต๋ถํ๋ ํ์์ด์์ต๋๋ค. ์ฝ๋๋ฅผ ๊ทธ๋ฐ์์ผ๋ก ๊ธ์ด์ ์ฌ์ฉํ๋ ๊ทธ์ ๋ฐ๋ฅธ ๋ถ์์ฉ์ ๋์ฑ ์ปธ์ต๋๋ค. ์ฌ๋ฌ ๋ถ์์ฉ๋ค์ด ๋ง์์ง๋ง ๊ฐ์ฅ ํฐ ๋๊ฐ์ง๋ฅผ ๊ณต์ ํ๊ฒ ์ต๋๋ค.
- ๊ตฌํ์ ํ๋ ์ฌ๋์ด์ง๋ง OAuth ๋ก๊ทธ์ธ ํ๋ฆ์ ํ์ ํ์ง ๋ชปํ์ต๋๋ค.
- ์ฐ๋ฆฌ ํ๋ก๋ํธ ํ๊ฒฝ์์ ํ์์๋ ์ฝ๋๋ค์ด ์๊ฒจ๋ฌ๊ณ ๊ทธ ๊ฐ๋ค์ด DB์ ์ ์ฅ๋๊ธฐ ๊น์ง ํ์ต๋๋ค.
์ด๋ฐ ๋ถ์์ฉ์ ์์ ๊ธฐ ์ํด์๋ ํ์ต์ด ๋ฌด์กฐ๊ฑด ์ ์ผ๋ก ํ์ํ์ต๋๋ค.
๋จผ์ Spring Security ๋ฅผ ์๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์์๊ฐ๊ณ ๋ค์ด๊ฐ์ผํ ๊ฐ๋ ๋ช๊ฐ์ง๋ฅผ ์๊ฐํ๊ฒ ์ต๋๋ค.
์ฉ์ด์ ๋ํด ๋จผ์ ์์๋ณด๊ฒ ์ต๋๋ค. ๊ทธ ๋๋ผ์ ์ธ์ด๋ฅผ ๋ชจ๋ฅธ๋ค๋ฉด ์์ฌ์ํต์ด ๊ฐ๋ฅํ ๊น์? ์ํ๋ฆฌํฐ๋ฅผ ์ ์ดํดํ๊ธฐ ์ํด์ ๋จผ์ ์๊ณ ๊ฐ์ผํ๋ค ์๊ฐํฉ๋๋ค.
- ์ ๊ทผ ์ฃผ์ฒด(Principal): ๋ณดํธ๋ ๋์์ ์ ๊ทผํ๋ ์ ์
- ์ธ์ฆ(Authenticate): ์์ฒญ์ ๋ณด๋ธ ์ ์ ๊ฐ ๋๊ตฌ์ธ์ง ํ์ธ(ex. ๋ก๊ทธ์ธ), ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ์ํํ ์ ์๋ ์ฃผ์ฒด์์ ์ฆ๋ช
- ์ธ๊ฐ(Authorization): ํ์ฌ ์ ์ ๊ฐ ์ด๋ค ์๋น์ค, ํ์ด์ง์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌ
- ๊ถํ: ์ธ์ฆ๋ ์ฃผ์ฒด๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋์์ ์ํํ ์ ์๋ ๊ถํ
- ๋จผ์ ์ธ์ฆ ๊ณผ์ ์ ํตํด ์ฃผ์ฒด๊ฐ ์ฆ๋ช ๋ ์ดํ ๊ถํ์ ๋ถ์ฌํ ์ ์์
- ๊ถํ ๋ถ์ฌ์๋ ๋ ๊ฐ์ง ์์ญ์ด ์กด์ฌํ๋๋ฐ ์น ์์ฒญ ๊ถํ, ๋ฉ์๋ ํธ์ถ ๋ฐ ๋๋ฉ์ธ ์ธ์คํด์ค์ ๋ํ ์ ๊ทผ ๊ถํ ๋ถ์ฌ๊ฐ ์์ +)์ธ์ฆ๊ณผ ๊ถํ์ ๊ตฌ๋ถํด ์๊ฐํ๋ ๊ฒ์ด ์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์ดํดํ๋๋ฐ ๊ฐ์ฅ ์ค์ํฉ๋๋ค.
- ๊ถํ: ์ธ์ฆ๋ ์ฃผ์ฒด๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋์์ ์ํํ ์ ์๋ ๊ถํ
- ์ฆ๋ช ์(Credential) : ์ธ์ฆ ๊ณผ์ ์ค, ์ฃผ์ฒด๊ฐ ๋ณธ์ธ์ ์ธ์ฆํ๊ธฐ ์ํด ์๋ฒ์ ์ ๊ณตํ๋ ๊ฒ. (ID, Password ๊ฐ์ ๊ฒ)
- ๊ถํ(authorities) : ์ ์ ์๊ฒ ์ฃผ์ด์ง๋ ๊ถํ์ ๋๋ค. ์๋ฅผ๋ค์ด roles, scopes
๋ ํผ๋ฐ์ค์ ๋ณด๋ฉด SecurityContextHolder ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํํํฉ๋๋ค.
At the heart of Spring Securityโs authentication model is the SecurityContextHolder
Spring security ์ ํต์ฌ์ด๋ผ๊ณ ํ ์์๋๋ฐ์. Spring security ๋ SecurityContextHolder๋ฅผ ์ด์ฉํด ์ธ์ฆ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. SecurityContextHolder๋ ์ธ์ฆ๋ user์ details ๋ฅผ ์ ์ฅํ๊ณ ์์ต๋๋ค. details ์๋ ์ด๋ค Authentication ๊ฐ์ฒด๋ฅผ ์ฐ๋๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ฐ FormLogin์ ์ฌ์ฉํ ๊ฒฝ์ฐ UserDetails ์ ๋ํ ๋ด์ฉ์ด OAuth2Login์ ์ฌ์ฉํ ๊ฒฝ์ฐ OAuth2User ์ ๋ํ ๋ด์ฉ์ด ์ ์ฅ๋ฉ๋๋ค. ์ฐ๋ฆฌ ํ๋ก๋ํธ์๋ OAuth2 ๋ฅผ ์ฌ์ฉํ๋ OAuth2User ์ ๋ํ ๋ด์ฉ์ด ๋ค์ด๊ฐ๊ฒ ์ฃ ?
The SecurityContextHolder is where Spring Security stores the details of who is authenticated. Spring Security does not care how the SecurityContextHolder is populated. If it contains a value, then it is used as the currently authenticated user.
The simplest way to indicate a user is authenticated is to set the SecurityContextHolder directly.
SecurityContextHolder๋ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง ๋ฐฉ์์๋ ๊ด์ฌ์ด ์๋ค๊ณ ํฉ๋๋ค. ์ฆ, SecurityContextHolder ์ ์ธ์ฆ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ๊ทธ ๊ฐ์ฒด๋ ์ธ์ฆ๋ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฅ Security FilterChain์ Authentication ํ๋ Filter๊ฐ ์์ต๋๋ค. ๊ทธ ๊ณผ์ ์ ๊ฑฐ์น์ง ์์๋ ์ง์ SecurityContextHolder ์ set์ผ๋ก ๋ฃ์ด์ค๋ค๋ฉด ๊ทธ ๊ฐ์ฒด๋ ์ธ์ฆ๋ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ๋๋ค.
์ด ๋ถ๋ถ์ ์ด์ฉํด์ JwtAuthenticationFilter ๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
SecurityContextHolder๋ฅผ set ํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
SecurityContext context = SecurityContextHolder.createEmptyContext(); // (1)
Authentication authentication =
new TestingAuthenticationToken("username", "password", "ROLE_USER"); // (2)
context.setAuthentication(authentication);
SecurityContextHolder.setContext(context);
SecurityContext๋ SecurityContextHolder๋ก ๋ถํฐ ์ป์ ์ ์์ต๋๋ค. SecurityContext๋ Authentication ๊ฐ์ฒด๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.
- ๋น์ด์๋ SecurityContext ๋ง๋ญ๋๋ค. ์์ ๊ณผ์ ์ SecurityContextHolder.getContext().setAuthentication(authentication) ๋ก ํ ๋ฒ์ ์ ์ธํ๋ ๊ฑธ ํผํ๋ผ๊ณ ๋์ ์์ต๋๋ค. ์ ๋ ๊ฒ ์ ์ธํ๋ค๋ฉด ๋ฉํฐ์ค๋ ๋์ผ ๊ฒฝ์ฐ ๊ฒฝํฉ์ํ(race Condition) ์ด ๋ฐ์ํ ์ ์๋ค๊ณ ํฉ๋๋ค.
- ๊ทธ ํ Authentication์ ์ ์ธํด ์ ์ฅํฉ๋๋ค. Authentication์ ์ธํฐํ์ด์ค์ ๋๋ค. Spring Security๋ ์ด๋ค ์ข ๋ฅ์ Authentication์ธ์ง๋ ๊ด์ฌ์ด ์์ต๋๋ค. Authentication์ ๊ตฌํํ ๊ตฌํ์ฒด์ด๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
Spring Security๋ SecurityContextHolder ์ ์ ์ฅ๋ ๋ด์ฉ์ ์ธ๊ฐ(Authorization)๋ฅผ ์ํด ์ฌ์ฉํฉ๋๋ค.
SecurityContextHolder๋ฅผ ์ดํดํ๋ ๋ฐ ๊ผญ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. SecurityContextHolder๋ ์ ๋ต์ ์ผ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํ ๊ฒ์ธ์ง ์ ํด์ง๋๋ค. ๋ํด๋ ๊ฐ์ ThreadLocal ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ThreadLocal ์ด๋ ๊ฐ๋จํ ์ค๋ช ํด์ ์ค๋ ๋ ์ง์ญ ๋ณ์์ ๋๋ค. ๊ฐ์ Thread ํ๋ Scope ๋ด์์ ๊ณต์ ๋์ด ์ฌ์ฉ๋ ์ ์๋ ๊ฐ์ผ๋ก ๋ค๋ฅธ ์ค๋ ๋์์ ๊ณต์ ๋ณ์์ ์ ๊ทผํ ์ ๋ฐ์ํ ์ ์๋ ๋์์ฑ ๋ฌธ์ ์ ์๋ฐฉ์ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. Security์ ThreadLocalSecurityContextH ํด๋์ค๋ฅผ ๋ณด๋ฉด ThreadLocal์ static์ผ๋ก ์ ์ธํฉ๋๋ค. ๊ทธ ์ด์ ๋ฅผ ์๊ฐํด ๋ณธ๋ค๋ฉด ์ด๋ฐ ์ด์ ์ด์ง ์์๊น ์๊ฐ๋ฉ๋๋ค. Thread๋ ThreadLocal์ Map์ผ๋ก ๊ด๋ฆฌํ๊ณ ์์ด์ ์ฌ๋ฌ ๊ฐ์ ThreadLocal ๊ฐ์ ๊ฐ์ง๊ณ ์์ ์ ์์ต๋๋ค.
static์ผ๋ก ์ ์ธํ๋ฉด ํด์๊ฐ์ด ํญ์ ๊ฐ๊ธฐ ๋๋ฌธ์ ํ๋์ ThreadLocal์ ๊ณ์ ์ธ ์ ์์ด ์ธ์ฆ๊ฐ์ฒด๋ฅผ set ํ ํ ๊ณ์ํด์ ์ด์ฉํ ์ ์๋ ๊ฒ์ ๋๋ค. ๋ง์ฝ static์ ์ ์ธํ์ง ์๋๋ค๋ฉด getContext ๋ฅผ ์ ์ธํ ๋๋ง๋ค ๊ณ์ TheadLocal์ ์์ฑํด์ ๋ค๋ฅธ ๋ฉ์๋์์ SecurityContext๋ฅผ ์ฌ์ฉํ ๋ ์ฌ๋ฐ๋ฅด์ง ๋ชปํ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ ๊ฒ์ ๋๋ค.
์๋ ThreadLocalSecurityContextH ํด๋์ค๋ฅผ ํ์ธํด ๋ณด๋ฉด ์ ์ ์์ต๋๋ค.
๋ Spring Docs์ ๋ณด๋ฉด ์ด๋ฐ ๋ง์ด ์์ต๋๋ค.
Using a ThreadLocal in this way is quite safe if care is taken to clear the thread after the present principalโs request is processed. Spring Securityโs FilterChainProxy ensures that the SecurityContext is always cleared.
์์ฒญ์ด ๋๋๋ฉด ์ค๋ ๋๋ฅผ ๋น์๋ฒ๋ฆฐ๋ค๋ ๋ด์ฉ์ธ๋ฐ ์ด ๋ถ๋ถ๋ ThreadLocalSecurityContextHolderStrategy ๋ฅผ ๋ณด๋ฉด ์ ์ ์์ต๋๋ค. Context๋ฅผ get์ ํ๋๋ฐ ๋ง์ฝ ์ค๋ ๋๊ฐ ๋น์ด์์ง ์๋๋ค๋ฉด ์ฐ๋ ๋๊ฐ ์ฌ์ฌ์ฉ๋ ๋ ์ฐ๋ ๋๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ค๋ฅธ ์ธ์ฆ์์ฒญ์ด ์๋ ์ด๋ฏธ TheadLocal์ ์ด์ ์ ์ฌ์ฉ๋ ์ธ์ฆ๊ฐ์ฒด๊ฐ ์์ด์ ์๋ก์ด ์ธ์ฆ ์์ฒญ์ด ์๋ ์ธ์ฆ๋ ์ฌ์ฉ์๋ผ๊ณ ์ธ์ฆ ํ๊ฐ๋ฅผ ๋ด์ค ๊ฒ์ ๋๋ค.
-
SecurityContextHolder ์ Session
-
SecurityContextHolder ๋ Spring Security์ ์ธ๋ฉ๋ชจ๋ฆฌ ์ธ์ ์ ์ฅ์ ์ ๋๋ค. ์ํ๋ฆฌํฐ์ ์ค์ ์ค์ ์ธ์ฆ๊ณผ์ ์ Session์ ๋๋ ์ค์ ์ด ์์ต๋๋ค.
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
JWT ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Session์ ์ฌ์ฉํ ํ์๊ฐ ์์ด์ ํด๋น ์ค์ ํด์ฃผ์๋๋ฐ ๋๋ฒ๊น ์์ SecurityContextHolder ๋ก ๊ณ์ ์ธ์ฆ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ ์ ๊ฐ ํท๊ฐ๋ฆฐ ๊ฑฐ๋ ์ธ์ ์ด๋ ๋จ์ด๋ฅผ ํผ๋ํ๊ณ ์์๋ ๊ฒ์ ๋๋ค. ์ ๋ ์ธ์ ์ด๋ผ ํจ์ HttpSession ์ ๋งํ๋ ์ค ์์๊ฑฐ๋ ์. ๊ทธ๋์ SecurityContextHolder ์ธ ์ธ๋ฉ๋ชจ๋ฆฌ ์ธ์ ์ ๊ณ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋๋ฌด ์ด์ํ์ต๋๋ค. ์ง๊ธ ์๊ฐํ๋ฉด ์ ๋ง ๋ฐ๋ณด ๊ฐ์ ์๊ฐ์ด์ฃ
๋ถ๋๋ฝ์ง๋ง, ์ ์ ๊ฐ์ ์๊ฐ์ ํ๋ ์ฌ๋์ด ์์ ์ ์๊ธฐ์.. ๊ธฐ๋ก์ ๋จ๊น๋๋ค.
์ข ์์ธํ ๋ค์ด๊ฐ ๋ณด์๋ฉด ์ฐ๋ฆฌ๊ฐ ํํ ์น ํ๊ฒฝ์์ ์ฐ๋ Session์ HttpSession์ ์ด์ผ๊ธฐํฉ๋๋ค. ํฐ์บฃ์ ์๋ก ๋ค๋ฉด ํฐ์บฃ์์ ํ์ฉํ ์ ์๋ ๊ฐ์ฒด ๋ฒ์์ ์ข ๋ฅ(application, session, request, page) ์ค ํ๋์ธ session์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. Spring Security์์๋ ํฐ์บฃ์ ๊ฐ์ฒด ๋ฒ์(scope) ์ค ํ๋์ธ session์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ Threadlocal์ด๋ผ๋ ๊ฐ์ฒด ๋ฒ์(scope)๋ฅผ ํ์ฉํฉ๋๋ค.
Session์ด๋ผ๋ ๊ฐ๋ ์ด ์ ์ ์กํ๊ธฐ ๋๋ฌธ์ ๋์จ ๋ฌธ์ ์ด์ฃ .
Session ์ด๋ ๋ ๊ฐ ๋๋ ๊ทธ ์ด์์ ์์ฌ์ํตํ๋ ์ฅ์น๋ค(devices) ๋๋ ์ปดํจํฐ ๊ทธ๋ฆฌ๊ณ ์ ์ ๊ฐ์ ๋ํ, ํํ ๋๋ ํ์์ ๊ฐ์ ๋ฐ์๊ตฌ์ ์ธ ์๋ฐฉํฅ ์ ๋ณด ๊ตํ์ ๋๋ค. Session์ ์ ๋ณด๊ตํ์ด๋ผ๋ ์๋ฏธ๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด์ง HttpSession์ด๋ผ๋ ํน์ ํ ๊ฒ์ ๋ํ๋ด๋ ๊ฒ ์๋๋ผ๋ ๊ฒ๋๋ค.
์ด ์ฐจ์ด๋ฅผ ์๊ฒ ๋๋ ํ์คํ ์ดํด๋๋๋ผ๊ณ ์. ํด๋น ๋ด์ฉ์ ์ ์ธ์งํ๊ณ ๋ค์ด๊ฐ๋ฉด ๋ ๋น ๋ฅธ ์ดํด๋ฅผ ํ ์ ์์ ๊ฒ์ ๋๋ค.
Security ๊ฐ ์ HttpSession์ ์ฌ์ฉํ์ง ์๊ณ ThreadLocal ์ ์ฌ์ฉํ๋์ง์ ๋ํด ๋ช๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
- HttpSession์ ์๋ธ๋ฆฟ์ ์์กด์ ํ๊ณ ์์ต๋๋ค. Security๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ธ๋ฆฟ ํํฐ๋ฅผ ์ด์ฉํด ์๋ธ๋ฆฟ ๋ณด์์ ๊ธฐ๋ณธ์ผ๋กํ์ง๋ง ์๋ธ๋ฆฟ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๋ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์๋ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค.
- HttpSession์ ์ ์ฅํ์ง ์๊ณ ์ธ๋ถ๋ก ์ธ์ฆ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ํํ๋ก ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.(๊ธฐ๋ณธ ํด๋์ค๋ฅผ ํ์ฅํ์ฌ DB ๋๋ Redis,MongoDB ๋ฑ์ผ๋ก ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.)
- AOP ๋ฐ ์ธํฐ์ ํฐ ๋ฑ ๊ณต๋ํ๋ ์ ์ํฌ๋ฅผ ๋ง๋ค ์ ์ ์ฉํฉ๋๋ค.
2,3์ ๋ํ ์ด์ ๋ ์์ง ํ์คํ๊ฒ ์๋ฟ์ง ์์ง๋ง 1์ ์ด์ ๋ง์ผ๋ก ์ดํดํ๊ธฐ์๋ ์ถฉ๋ถํ๋ค๊ณ ๋ด ๋๋ค!
-
-
์ฐธ๊ณ