week 2 duyongseon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
JAVA
์๋ฐ์์ ์ฐ๋ ๋๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๊ณผ ๋๊ธฐํ๋๋ ๊ณผ์ ์ ์ค๋ช ํ์์ค.
Thread๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
1. Thread ํด๋์ค๋ฅผ ์์ ๋ฐ์ต๋๋ค
- Thread ํด๋์ค๋ฅผ ์์ ๋ฐ์ ์์๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ ๋ฐ์ ์ ์์ต๋๋ค.
2. Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
- Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ด ํด๋์ค์ ๊ฐ์ฒด๋ Runnable ๊ฐ์ฒด๊ฐ ๋ฉ๋๋ค.
- Thread ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋, Thread์ ์์ฑ์์ Runnable ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋๊น๋๋ค. ์ด Thread ๊ฐ์ฒด๋ ์ด์ run() ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ Runnable ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ๋ฉ๋๋ค.
- ์ด์ ๋จ๊ณ์์ ์์ฑํ Thread๊ฐ์ฒด์ start() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
hashCode() ๊ฐ์ด ๋ชจ๋ ๊ฐ๋ค๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์? hashcode()์ equls()๋ ์ธ์ ์ฌ์ฉํ๊ณ ์ ์ฌ์ฉํ๋์ง?
- equals()๋ ๋ ๊ฐ์ฒด์ ๋ด์ฉ์ด ๊ฐ์์ง, ๋๋ฑ์ฑ(equality)๋ฅผ ๋น๊ตํ๋ ์ฐ์ฐ์์ ๋๋ค.
- hashCode()๋ ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๊ฐ์ฒด์ธ์ง, ๋์ผ์ฑ(identity)๋ฅผ ๋น๊ตํ๋ ์ฐ์ฐ์์ ๋๋ค.
- equals()๋ก ๋น๊ต ์ ๋๊ฐ์ ์ค๋ธ์ ํธ๊ฐ ๊ฐ๋ค๋ฉด, hashCode() ๊ฐ๋ ๊ฐ์์ผ ํฉ๋๋ค.
- equals()๋ก ๋น๊ต ์ false ๋ผ๋ฉด, hashCode()๊ฐ์ ๋ค๋ฅผ์๋, ๊ฐ์์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฑ๋ฅ์ ์ํด์๋ hashCode() ๊ฐ์ด ๋ค๋ฅธ ๊ฒ์ด ๋ซ์ต๋๋ค. ๊ทธ๋์ผ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก Set ์ ํด๋น ์ค๋ธ์ ํธ๊ฐ ์กด์ฌํ๋์ง ์๋์ง ๋น ๋ฅด๊ฒ ๊ฒ์ ํ ์ ์์ต๋๋ค.
- hashCode() ๊ฐ์ด ๊ฐ๋ค๊ณ ํด์, equals()๊ฐ true๋ฅผ ๋ฆฌํดํ๋ ๊ฒ์ ์๋๋๋ค. ํด์ฑ ์๊ณ ๋ฆฌ์ฆ ์์ฒด์ ๋ฌธ์ ๋ก, ๊ฐ์ ํด์ ๊ฐ์ด ๋์ฌ ์ ์์ต๋๋ค.
ํจ๋ฌ๋ดGC, G1GC์ ์ฐจ์ด์ ์ค๋ช ํด์ฃผ์ธ์
-
Parallel GC(-XX:+UseParallelGC)
Parallel GC๋ ๊ฐ์ฒด๊ฐ ์ ์ผ ๋จผ์ ์์ฑ๋๋ Young ์์ญ๊ณผ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋์ฐจ๋ฉด ์คํํ๋ ๋ถ๋ถ์ธ Old ์์ญ์ด ์์ต๋๋ค. Young ์์ญ์์๋ Eden ์์ญ๊ณผ Survivor ์์ญ(2๊ฐ)์ธ ์ด 3๊ฐ์ง ์์ญ์ผ๋ก ๊ตฌ์ฑ๋์ด์๊ณ , ๊ฐ ์์ญ์ ์ฒ๋ฆฌ ์ ์ฐจ๋ฅผ ์์์ ๋ฐ๋ผ ๊ธฐ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๋ก ์์ฑํ ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ Eden ์์ญ์ ์์นํ๋ค.
- Eden ์์ญ์์ GC๊ฐ ํ ๋ฒ ๋ฐ์ํ ํ ์ด์๋จ์ ๊ฐ์ฒด๋ Survivor ์์ญ ์ค ํ๋๋ก ์ด๋๋๋ค.
- Eden ์์ญ์์ GC๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฏธ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ Survivor ์์ญ์ผ๋ก ๊ฐ์ฒด๊ฐ ๊ณ์ ์์ธ๋ค.
- ํ๋์ Survivor ์์ญ์ด ๊ฐ๋ ์ฐจ๊ฒ ๋๋ฉด ๊ทธ ์ค์์ ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ์ด๋ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ ์ฐฌ Survivor ์์ญ์ ์๋ฌด ๋ฐ์ดํฐ๋ ์๋ ์ํ๋ก ๋๋ค.
- ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๊ฐ ๊ณ์ํด์ ์ด์๋จ์ ์๋ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค.
์ดํ Old ์์ญ์์์ GC๋ mark-sweep-compact์ด๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฒซ ๋จ๊ณ๋ Old ์์ญ์ ์ด์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ณ(Mark)ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ ๋ค์์๋ ํ(Heap)์ ์๋ถ๋ถ๋ถํฐ ํ์ธํ์ฌ ์ด์ ์๋ ๊ฒ๋ง ๋จ๊น๋๋ค(Sweep). ๋ง์ง๋ง ๋จ๊ณ์์๋ ๊ฐ ๊ฐ์ฒด๋ค์ด ์ฐ์๋๊ฒ ์์ด๋๋ก ํ์ ๊ฐ์ฅ ์ ๋ถ๋ถ๋ถํฐ ์ฑ์์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ๊ณผ ๊ฐ์ฒด๊ฐ ์๋ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค(Compaction). GC๋ฅผ ์ฒ๋ฆฌํ๋ ์ฐ๋ ๋๊ฐ ์ฌ๋ฌ๊ฐ์ฌ์ ๋น ๋ฅด์ง๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฐจ์งํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ๊ณ ์ฝ์ด์ ๊ฐ์๊ฐ ๋ง์ ๋ ์ ๋ฆฌํฉ๋๋ค. Parallel GC๋ Throughput GC๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค.
-
G1 GC
G1 GC๋ Young ์์ญ๊ณผ Old ์์ญ์ผ๋ก ๋๋๋ ๋ฐฉ์์ ์ฌ์ฉํ์ง ์๋ ํน์ดํ ์ปฌ๋ ํฐ์ ๋๋ค. ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ฐ๋ํ ๋ชจ์์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ์ฝ 2000๊ฐ์ ๊ตฌ์ญ์ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ฐ๋ํ ๋ชจ์์ ๊ตฌ์ญ์์ ์ผ๋ถ๋ฅผ ์ ์ ํ์ฌ Young ์์ญ์ผ๋ก ์ง์ ํ ํ ํด๋น ๊ตฌ์ญ์ ๋ฐ์ดํฐ๊ฐ ๊ฝ ์ฐจ๋ฉด GC๋ฅผ ์งํ ํฉ๋๋ค. GC ํ ์ด์์๋ ๊ฐ์ฒด๋ง Servivor ์์ญ์ผ๋ก ์ด๋ํฉ๋๋ค.
SPRING
Spring์ AOP์ ํน์ง๊ณผ ์ด๋๋ฐ์ด์ค ์ข ๋ฅ์ ์ฌ์ฉ๋ proxy ํจํด์ ๋ํด ์ค๋ช ํด๋ณด์ธ์.
์คํ๋ง AOP ํน์ง
- ํ๋ก์ ํจํด ๊ธฐ๋ฐ์ AOP ๊ตฌํ์ฒด, ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ฐ๋ ์ด์ ๋ ์ ๊ทผ ์ ์ด ๋ฐ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด์์ ๋๋ค.
- ์คํ๋ง ๋น์๋ง AOP๋ฅผ ์ ์ฉ ๊ฐ๋ฅ
- ๋ชจ๋ AOP ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด ์๋ ์คํ๋ง IoC์ ์ฐ๋ํ์ฌ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์ฅ ํํ ๋ฌธ์ (์ค๋ณต์ฝ๋, ํ๋ก์ ํด๋์ค ์์ฑ์ ๋ฒ๊ฑฐ๋ก์, ๊ฐ์ฒด๋ค ๊ฐ ๊ด๊ณ ๋ณต์ก๋ ์ฆ๊ฐ ...)์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ง์ํ๋ ๊ฒ์ด ๋ชฉ์
Advice ์ข ๋ฅ
-
@Before : ๋์ ๊ฐ์ฒด์ ๋ฉ์๋ ํธ์ถ ์ ์ ๊ณตํต ๊ธฐ๋ฅ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋จ.
-
@AfterReturning : ๋์ ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ์ต์ ์ ์์ด ์คํ๋ ์ดํ์ ๊ณตํต ๊ธฐ๋ฅ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋จ.
-
@AfterThrowing : ๋์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์คํํ๋ ๋์ค ์ต์ ์ ์ด ๋ฐ์ํ ๊ฒฝ์ฐ์ ๊ณตํต ๊ธฐ๋ฅ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋จ.
-
@After : ์ข ๋ฃ ํ์ ๋ฌด์กฐ๊ฑด ์คํ๋จ. ๋์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์คํํ๋ ๋์ค์ ์ต์ ์ ์ด ๋ฐ์ํ๋์ง์ ์ฌ๋ถ์ ์๊ด์์ด ๋ฉ์๋ ์คํ ํ ๊ณตํต ๊ธฐ๋ฅ์ ์คํํจ. ( try-catch-finally์ finally๋ธ๋ก๊ณผ ๋น์ท )
-
@Around : ๋์ ๊ฐ์ฒด์ ๋ฉ์๋ ์คํ ์ , ํ ๋๋ ์ต์ ์ ๋ฐ์ ์์ ์ ๊ณตํต ๊ธฐ๋ฅ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋จ. ์บ์ ๊ธฐ๋ฅ, ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ๊ณผ ๊ฐ์ Aspect๋ฅผ ๊ตฌํํ ๋ ์ฃผ๋ก ์ด์ฉ
JDK Dynamic Proxy
JDK Dynamic Proxy๋ JDK 1.3+ ๋ถํฐ ์ ๊ณต๋๋ Proxy Factory์ ์ํด ๋ฐํ์ ์ ๋์ ์ผ๋ก ๋ง๋ค์ด ์ง๋ ์ค๋ธ์ ํธ์ ๋๋ค. JDK Dynamic Proxy๋ ๋ฐ๋์ Interface๊ฐ ์ ์ ๋์ด์๊ณ , Interface์ ๋ํ ๋ช ์ธ๋ฅผ ๊ธฐ์ค์ผ๋ก Proxy๋ฅผ ์์ฑํฉ๋๋ค. ๋ฐ๋ผ์ Interface ์ ์ธ์ ๋ํ ๊ฐ์ ์ฑ์ด ์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ๋ด๋ถ์ ์ผ๋ก Dynamic Proxy์์๋ InvocationHandler๋ผ๋ Interface๋ฅผ ๊ตฌํํ์ฌ ๋ง๋ค์ด์ง๋๋ฐ InvocationHandler์ invoke๋ผ๋ ํจ์๋ฅผ Overrideํ์ฌ Proxy์ ์์ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค. ์ด ๊ณผ์ ์์ Object์ ๋ํด Reflection๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ํผํฌ๋จผ์ค์ ํ๋ฝ์ ์์ธ์ด ๋๊ธฐ๋ ํฉ๋๋ค.
CGLIB Proxy
CGLIB Proxy๋ ์์ Java JDK ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์๋ CGLIB๋ผ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ผ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ค์ CGLIB์ Enhancer๋ผ๋ ํด๋์ค๋ฅผ ๋ฐํ์ผ๋ก Proxy๋ฅผ ์์ฑํ๋ฉฐ, JDK Dynamic Proxy์ ๋จ์ ์ธ Interface๊ฐ ์์ด๋ Proxy๋ฅผ ์์ฑ ํ ์ ์์ต๋๋ค. CGLIB Proxy๋ Target Class๋ฅผ ์์๋ฐ์ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ Proxy๋ฅผ ์์ฑ ํ๊ธฐ ์ํด ๊ตณ์ด Interface๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ์๊ณ ๋ฅผ ๋ ์ ์์ต๋๋ค.
ํ์ง๋ง, ์์์ ์ด์ฉํ๋ ๋งํผ final์ด๋ private๊ณผ ๊ฐ์ด ์์์ ๋ํด Override๋ฅผ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ Proxy์์ ํด๋น ๋ฉ์๋์ ๋ํ Aspect๋ฅผ ์ ์ฉํ ์ ์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
CGLIB Proxy์ ๊ฒฝ์ฐ ์ค์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์กฐ์ํ์ฌ JDK Dynamic Proxy๋ณด๋ค๋ ํผํฌ๋จผ์ค๊ฐ ์๋์ ์ผ๋ก ๋น ๋ฅธ ์ฅ์ ์ด ์์ต๋๋ค.
์คํ๋ง์์ @Transactional์ ์ด๋ป๊ฒ ๋์ํ๋ฉฐ ์ด๋ค ์ต์ ์ด ์๋๊ฐ?
์คํ๋ง์์๋ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋๋ฐ ๊ทธ ์ค ์ด๋ ธํ ์ด์ ๋ฐฉ์์ผ๋ก @Transactional์ ์ ์ธํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ผ๋ฐ์ ์ด๋ฉฐ, ์ ์ธ์ ํธ๋์ญ์ ์ด๋ผ ๋ถ๋ฆ ๋๋ค. ํด๋์ค, ๋ฉ์๋ ์์ @Transactional์ด ์ถ๊ฐ๋๋ฉด, ์ด ํด๋์ค์ ํธ๋์ญ์ ๊ธฐ๋ฅ์ด ์ ์ฉ๋ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด ํ๋ก์ ๊ฐ์ฒด๋ @Transactional์ด ํฌํจ๋ ๋ฉ์๋๊ฐ ํธ์ถ ๋ ๊ฒฝ์ฐ, PlatformTransactionManager๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ์์ํ๊ณ , ์ ์ ์ฌ๋ถ์ ๋ฐ๋ผ Commit ๋๋ Rollback ํฉ๋๋ค.
@Transactional์ Propagation ์์ฑ
โถ REQUIRED
- ๋ํดํธ ์์ฑ, ๋ถ๋ชจ ํธ๋์ญ์ ๋ด์์ ์คํํ๋ฉฐ ๋ถ๋ชจ ํธ๋์ญ์ ์ด ์์ ๊ฒฝ์ฐ ์๋ก์ด ํธ๋์ญ์ ์ ์์ฑํ๋ค.
โถ SUPPORTS
- ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ฐธ์ฌํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ํธ๋์ญ์ ์์ด ์งํํ๊ฒ ๋ง๋ ๋ค.
โถ REQUIRES_NEW
- ๋ถ๋ชจ ํธ๋์ญ์ ์ ๋ฌด์ํ๊ณ ๋ฌด์กฐ๊ฑด ์๋ก์ด ํธ๋์ญ์ ์ด ์์ฑ
โถ MANDATORY
-
REQUIRED์ ๋น์ทํ๊ฒ ์ด๋ฏธ ์์๋ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ฐธ์ฌํ๋ค.
-
๋ฐ๋ฉด์ ํธ๋์ญ์ ์ด ์์๋ ๊ฒ์ด ์์ผ๋ฉด ์๋ก ์์ํ๋ ๋์ ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
-
ํผ์์๋ ๋ ๋ฆฝ์ ์ผ๋ก ํธ๋์ญ์ ์ ์งํํ๋ฉด ์ ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
โถ REQUIRES_NEW
-
ํญ์ ์๋ก์ด ํธ๋์ญ์ ์ ์์ํ๋ค.
-
์ด๋ฏธ ์งํ ์ค์ธ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ํธ๋์ญ์ ์ ์ ์ ๋ณด๋ฅ์ํจ๋ค.
โถ NOT_SUPPORTED
-
ํธ๋์ญ์ ์ ์ฌ์ฉํ์ง ์๊ฒ ํ๋ค.
-
์ด๋ฏธ ์งํ ์ค์ธ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ๋ณด๋ฅ์ํจ๋ค.
โถ NEVER
-
ํธ๋์ญ์ ์ ์ฌ์ฉํ์ง ์๋๋ก ๊ฐ์ ํ๋ค.
-
์ด๋ฏธ ์งํ ์ค์ธ ํธ๋์ญ์ ๋ ์กด์ฌํ๋ฉด ์๋๋ค ์๋ค๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
โถ NESTED
-
์ด๋ฏธ ์งํ์ค์ธ ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ค์ฒฉ ํธ๋์ญ์ ์ ์์ํ๋ค.
-
์ค์ฒฉ ํธ๋์ญ์ ์ ํธ๋์ญ์ ์์ ๋ค์ ํธ๋์ญ์ ์ ๋ง๋๋ ๊ฒ์ด๋ค.
-
ํ์ง๋ง ๋ ๋ฆฝ์ ์ธ ํธ๋์ญ์ ์ ๋ง๋๋ REQUIRES_NEW์๋ ๋ค๋ฅด๋ค.
์คํ๋ง์์ ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋ํด ์ค๋ช ํด๋ณด์ธ์.
์ธ์ฆ : ์ฌ์ฉ์์ ์ ๋น์ฑ ํ์ธ ์ธ๊ฐ : ์ฌ์ฉ์์ ๋ฆฌ์์ค ์ ๊ทผ์ ๋ํ ์ ์ด
์ธ์ฆ ์ฒ๋ฆฌ ๋ฐฉ์
Spring Security๊ฐ ์ ๊ณตํ๋ ์ธ์ฆ ๋ฉ์นด๋์ฆ
1. AuthenticationFilter
- ์ธ์ฆ ์ฒ๋ฆฌ ๋ฐฉ์
- ํด๋ผ์ด์ธํธ์ ์์ฒญ ํ๋ผ๋ฏธํฐ์์ ์ธ์ฆ์ ๋ณด(๊ณ์ , ํจ์ค์๋)๋ฅผ ๋ฐ๊ณ Authentication Manager์ method ํธ์ถ
2. AuthenticationManager(implementation : ProviderManager)
- ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์ํํ๊ธฐ ์ํ ์ธํฐํ์ด์ค
- ๊ธฐ๋ณธ ๊ตฌํ : AuthenticationProvider์๊ฒ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ณ ์ธ์ฆ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ ๊ตฌ์กฐ
3. AuthenticationProvider(implementation : DaoAuthenticationProvider)
- ์ธ์ฆ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํ ์ธํฐํ์ด์ค
์ธ๊ฐ ์ฒ๋ฆฌ
์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์๋ resource ์ ์ด resource์ ๋ํ ์ ๊ทผ ์ ์ฑ ์ ์, resource ์ ๊ทผ ์ ์ ๊ทผ ์ ์ฑ ํ์ธ ํ ํ์ฉ ์ฌ๋ถ ๊ฒฐ์
- ExceptionTranslationFilter
- ์ธ๊ฐ ๊ณผ์ ์์ ๋ฐ์ํ ์์ธ ์ฒ๋ฆฌ
- ํด๋ผ์ด์ธํธ์ ์๋ต์ ํ๊ธฐ ์ํ servlet filter
- ์ธ์ฆ๋์ง ์์ ์ฌ์ฉ์ ์ ๊ทผ ์, ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ
- FilterSecurityInterceptor
- HTTP ์์ฒญ์ ๋ํ ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ๊ธฐ ์ํ servlet filter
- AccessDecisionManager์ method๋ฅผ ํธ์ถํ์ฌ ์ธ๊ฐ ์ฒ๋ฆฌ
- AccessDecisionManager(implementation : AffirmativeBased)
- AccessDecisionVoter์ method๋ฅผ ํธ์ถํ์ฌ ์ ๊ทผ ๊ฐ๋ฅ ์ฌ๋ถ ํฌํ
- ํ๋์ AccessDecisionVoter๊ฐ ๋ถ์ฌ๋ก ํฌํํ๋ฉด ์ ๊ทผ ๊ถํ ๋ถ์ฌ
- AccessDecisionVoter(implementation : WebExpressionVoter)
- ์ ๊ทผํ๋ ค๋ resource์ ์ ๊ทผ ์ ์ฑ ์ ์ฐธ์กฐํ์ฌ ์ ๊ทผ ๊ถํ ๋ถ์ฌ ์ฌ๋ถ ํฌํ
DATABASE/SQL
SQL์ HINT๋ฅผ ์ค๋ช ํด์ฃผ์ธ์.
ํํธ๋ SQL ํ๋์ ํต์ฌ๋ถ๋ถ์ผ๋ก ์ผ์ข ์ ์ง์๊ตฌ๋ฌธ์ ๋๋ค. SQL์ ํฌํจ๋์ด ์ฐ์ฌ์ ธ Optimizer์ ์คํ ๊ณํ์ ์ํ๋ ๋๋ก ๋ฐ๊ฟ ์ ์๊ฒ ํด์ค๋๋ค. ์ค๋ผํด Optimizer๋ผ๊ณ ํด์ ํญ์ ์ต์ ์ ์คํ ๊ณํ์ ์๋ฆฝํ ์๋ ์์ผ๋ฏ๋ก ํ ์ด๋ธ์ด๋ ์ธ๋ฑ์ค์ ์๋ชป๋ ์คํ ๊ณํ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฐ๊ฟ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์๋ ํน์ SQL ๋ฌธ์ฅ์์ ์ด๋ค ์ธ๋ฑ์ค๊ฐ ์ ํ๋๊ฐ ๋์์ง์ ๋ํด ์๊ณ ์๋๋ฐ ์ด ๊ฒฝ์ฐ ์ค๋ผํด ์๋ฒ์ Optimizer์ ์์กดํ์ฌ ๋์จ ์คํ ๊ณํ๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ธ ์คํ ๊ณํ์ ์ฌ์ฉ์๊ฐ ๊ตฌ์ฌํ ์ ์์ต๋๋ค.
memcached๋ณด๋ค redis์ ๊ณตํต์ ๊ณผ ์ฐจ์ด์ ์?
๊ณตํต์
1. 1ms ์ดํ์ ์๋ต๋๊ธฐ์๊ฐ
๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์, ๋์คํฌ ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณด๋ค ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
1. ๊ฐ๋ฐ์ ์ฉ์ด์ฑ
๋ฌธ๋ฒ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ๊ฐ๋ฐ์ฝ๋ ์ ๋ํ ์ ์ต๋๋ค.
1. ๋ฐ์ดํฐ ํํฐ์ ๋
๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ ธ๋์ ๋ถ์ฐํ์ฌ ์ ์ฅ์ํฌ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์์๊ฐ ์ฆ๊ฐํ ๋ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ์ฌ ์ค์ผ์ผ ์์์ด ๊ฐ๋ฅํฉ๋๋ค.
1. ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ง์
์ฌ๋ฌ ๊ฐ๋ฐ์ธ์ด๋ฅผ ์ง์ํฉ๋๋ค. ์๋ฐ, ํ์ด์ฌ, C, C++, C#, JavaScript, Node.Js, Ruby, Go ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ธ์ด๋ค์ ์ง์ํฉ๋๋ค.
Memcached๋ง์ ํน์ง
๋ฉํฐ์ค๋ ๋๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์, ๋ฉํฐํ๋ก์ธ์ค์ฝ์ด๋ฅผ ์ฌ์ฉ ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ์ค์ผ์ผ์ ์ ํตํ์ฌ ๋์ฑ ๋ง์ ์์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
Redis๋ง์ ํน์ง
1. ๋์ฑ ๋ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ
๋ฌธ์์ด ๋ฟ๋ง ์๋๋ผ List, Set, ์ ๋ ฌ๋ Set, Hash, Bit ๋ฐฐ์ด, hyperloglogs (๋งค์ฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ก ์งํฉ์ ๊ฐ์๋ฅผ ์ถ์ ํ ์ ์๋ ๋ฐฉ๋ฒ)์ ์ง์ํฉ๋๋ค. ํ๋ก๊ทธ๋จ์์ ์์ ๋ค์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Sorted Set์ ํ์ฉํ์ฌ ๊ฒ์์ ์ ์ ์์๋ญํฌ ์ ๋ณด๋ฅผ ์ฝ๊ฒ ์ ๊ณตํ ์ ์์ต๋๋ค.
2. Snapshots
๋ ๋์ค๋ ํน์ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์ ์ฅํ์ฌ ํ์ผ ๋ณด๊ด์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ํ, ์ฅ์ ์ํฉ์ ๋ณต๊ตฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
3. ๋ณต์
Master โ Salves ๊ตฌ์กฐ๋ก, ์ฌ๋ฌ๊ฐ์ ๋ณต์ ๋ณธ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฝ๊ธฐ๋ฅผ ํ์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ๋์ ๊ฐ์ฉ์ฑ(์ค๋ ์๊ฐ๋์ ๊ณ ์ฅ๋์ง ์์) ํด๋ฌ์คํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค
3. ํธ๋์ ์
ํธ๋ ์ ์ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ์์ ๋จ์๋ฅผ ์๋ฏธํ๊ณ , ์์์ฑ, ์ผ๊ด์ฑ, ๋ ๋ฆฝ์ฑ, ์ง์์ฑ์ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. Redis๋ ์ด๋ฌํ ํน์ง์ ์ง์ํฉ๋๋ค.
4. Pub / Sub messaging
Publish(๋ฐํ)๊ณผ Sub(๊ตฌ๋ )๋ฐฉ์์ ๋ฉ์์ง๋ฅผ ํจํด ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ ๋์ ์ฑ๋ฅ์ ์๊ตฌํ๋ ์ฑํ , ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ, SNS ํผ๋ ๊ทธ๋ฆฌ๊ณ ์๋ฒ์ํธํต์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
5. ๋ฃจ์ ์คํฌ๋ฆฝํธ ์ง์
๋งค์ฐ ๊ฒฝ๋ํ๋ ์ ์ฐจ์คํฌ๋ฆฝํธ ์ธ์ด์ธ ๋ฃจ์๋ฅผ ์ง์ํฉ๋๋ค. eval ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจ์์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํฌ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ํ๋ก๊ทธ๋จ์ ๋ช ๋ฃํ๊ฒํ๊ณ ์ฑ๋ฅ์ ๋์ผ ์ ์์ต๋๋ค.
6. ์์น๊ธฐ๋ฐ ๋ฐ์ดํฐ ํ์ ์ง์
Redis๋ ์ค์๊ฐ ์์น๊ธฐ๋ฐ๋ฐ์ดํฐ๋ฅผ ์ง์ํฉ๋๋ค. ๋ฐ๋ผ์, ๋ ์์น์ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๊ฑฐ๋, ์ฌ์ด์ ์๋ ์์ ์ฐพ๊ธฐ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ ๋ง์ง, ๊ธธ์ฐพ๊ธฐ ๊ทธ๋ฆฌ๊ณ ์ง๋๊ธฐ๋ฐ์ ๊ณ ์ฑ๋ฅ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค (Isolation Level) ์ ๋ํด์ ์ค๋ช ํ์ธ์.
ํธ๋์ญ์ ์ด ๋ณด์ฅํด์ผ ํ๋ ACID ์ค I์ ํด๋น๋๋ ๊ฒฉ๋ฆฌ์ฑ(Isolation)์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ชจ๋ ํธ๋์ญ์ ์ ์์ฐจ์ ์ผ๋ก ์คํํ๋ค๋ฉด ๋์์ฑ ์ฒ๋ฆฌ ์ด์๊ฐ ๋ฐ์ํ๋ฉฐ ๋ฐ๋๋ก ๋์์ฑ์ ๋์ด๊ธฐ ์ํด ์ฌ๋ฌ ํธ๋์ญ์ ์ ๋ณ๋ ฌ์ฒ๋ฆฌํ๊ฒ ๋๋ฉด ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ด ๊นจ์ง ์ ์์ต๋๋ค.
์์ ๊ฐ์ ๋ฌธ์ ๋ค ๋๋ฌธ์ ANSIํ์ค์์ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ์ฑ๊ณผ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ ์ฌ์ด์ Trade-off๋ฅผ ๋๊ณ 4๋จ๊ณ ๊ฒฉ๋ฆฌ ์์ค์ ๋๋์์ต๋๋ค. ๋ด๋ ค๊ฐ์๋ก ๊ฒฉ๋ฆฌ ์์ค์ด ๋์์ ธ์ ์ธ๊ธ๋ ์ด์๋ ์ ๊ฒ ๋ฐ์ํ์ง๋ง ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋จ์ด์ง๋๋ค.
1. Read Uncommitted
ํ ํธ๋์ญ์ ์์ ์ปค๋ฐํ์ง ์์ ๋ฐ์ดํฐ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ ๊ทผ ๊ฐ๋ฅํ๋ค. ์ฆ, ์ปค๋ฐํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค.
2. Read Committed
์ปค๋ฐ์ด ์๋ฃ๋ ๋ฐ์ดํ๋ง ์ฝ์ ์ ์๋ค.
3. Repeatable Read
ํธ๋์ญ์ ๋ด์์ ํ๋ฒ ์กฐํํ ๋ฐ์ดํ๋ฅผ ๋ฐ๋ณตํด์ ์กฐํํด๋ ๊ฐ์ ๋ฐ์ดํ๊ฐ ์กฐํ ๋๋ค
์ด๋ ๊ฐ๋ณ ๋ฐ์ดํ ์ด์์ธ Dirty Read๋ Non-Repeatable Read๋ ๋ฐ์ํ์ง ์์ง๋ง, ๊ฒฐ๊ณผ ์งํฉ ์์ฒด๊ฐ ๋ฌ๋ผ์ง๋ Phantom Read๋ ๋ฐ์๊ฐ๋ฅํ๋ค.
4. Serializable
๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค
์ 3๊ฐ์ง ๋ฌธ์ ์ ์ ๋ชจ๋ ์ปค๋ฒ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๊ธ๊ฒฉํ ๋จ์ด์ง ์ ์๋ค.