week 2 leekyunghee - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

SPRING

[Question 1] Spring AOP์˜ ํŠน์ง•๊ณผ ์–ด๋“œ๋ฐ”์ด์Šค ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ๋œ proxy ํŒจํ„ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

๋จผ์ € AOP์— ๊ฐœ๋…์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  Spring์—์„œ๋Š” AOP๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

https://lkh6561.tistory.com/1

AOP๋Š” ์—ฌ๊ธฐ์ €๊ธฐ ํฉ์–ด์ง„ ์ฝ”๋“œ๋ฅผ ํ•œ๊ณณ์— ๋ชจ์€๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๊ณตํ†ต ๋ถ€๋ถ„์„ ๋”ฐ๋กœ๋นผ์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 

์ค‘๋ณต๋˜๋Š” ๋กœ์ง์ด ์ œ๊ฑฐ๋˜๋ฉฐ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ์ œ์™ธํ•œ ์ธํ”„๋ผ ์ŠคํŠธ๋Ÿญ์ฒ˜ ๋ ˆ์ด์–ด์˜ ๋กœ์ง์„ AOP ๋ฐฉ์‹์œผ๋กœ ํ‘ผ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ์™€ AOP

ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ฐ์‹ผ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ”„๋ก์‹œ๋ผ๊ณ  ํ•˜๋ฉฐ Advice ์ด๋‹ค.

  1. ์—ฌ๋Ÿฌ ๊ฐ์ฒด์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•ด์„œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.

  2. AOP๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๊ณตํ†ต ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์˜ ์ˆ˜์ • ์—†์ด ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒํ•ด์ค€๋‹ค.

  3. ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ๊ตฌ๋ถ„ํ•ด์„œ ๊ตฌํ˜„ํ•œ๋‹ค. ์˜ˆ์‹œ) factorial ๊ณ„์‚ฐ ๊ธฐ๋Šฅ(ํ•ต์‹ฌ) ๊ณ„์‚ฐ ์‹œ๊ฐ„ ์ธก์ • ๊ธฐ๋Šฅ(๊ณตํ†ต)์„ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„

  4. AOP์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ณตํ†ต ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด AOP ์ด๋‹ค.

  5. ์Šคํ”„๋ง์—์„œ๋Š” ๋Ÿฐํƒ€์ž„์‹œ์— ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

  6. ์Šคํ”„๋ง AOP๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

  7. ํ”„๋ก์‹œ์˜ ํŠน์ง•์€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด๋‹ค.

  8. ํ”„๋ก์‹œ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๋Œ€์‹  ์—ฌ๋Ÿฌ ๊ฐ์ฒด์— ๊ณตํ†ต์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

AOP ์ฃผ์š” ์šฉ์–ด

AOP์—์„œ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ Aspect๋ผ๊ณ  ํ•œ๋‹ค. 

์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ํ”„๋ก์‹œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.  

Advice : ์–ธ์ œ ๊ณตํ†ต ๊ด€์‹ฌ ๊ธฐ๋Šฅ์„ ํ•ต์‹ฌ ๋กœ์ง์— ์ ์šฉํ•  ์ง€๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. 
์˜ˆ๋ฅผ ๋“ค์–ด '๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „'(์–ธ์ œ)์— ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘(๊ณตํ†ต ๊ธฐ๋Šฅ) ๊ธฐ๋Šฅ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ •์˜ํ•œ๋‹ค. 
(๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๊ฐ์‹ผ ๊ฐ์ฒด๋‹ค - ๊ธฐ๋Šฅ์„ ์–ด๋“œ๋ฐ”์ด์Šค์—์„œ ์ •์˜ ํ•˜๋ฏ€๋กœ) 

JoinPoint :  Advice๋ฅผ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ง€์ ์„ ์˜๋ฏธํ•œ๋‹ค. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ, ํ•„๋“œ ๊ฐ’ ๋ณ€๊ฒฝ  ๋“ฑ์ด Joinpoint์— ํ•ด๋‹นํ•œ๋‹ค. 
์Šคํ”„๋ง์€ ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•ด์„œ AOP๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ JoinPoint๋งŒ ์ง€์›ํ•œ๋‹ค. 

Pointcut : Advice๋ฅผ ํ•ต์‹ฌ ๋กœ์ง ์ฝ”๋“œ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ weaving์ด๋ผ๊ณ  ํ•œ๋‹ค. 
Aspect : ์—ฌ๋Ÿฌ ๊ฐ์ฒด์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ Aspect๋ผ๊ณ  ํ•œ๋‹ค. ํŠธ๋žœ์žญ์…˜์ด๋‚˜ ๋ณด์•ˆ๋“ฑ์ด Aspect์˜ ์ข‹์€ ์˜ˆ์ด๋‹ค. 

Advice ์ข…๋ฅ˜

๊ฐ€์žฅ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€? Around(๋ชจ๋‘๋‹ค ํฌํ•จ) Advice ์ด๋‹ค. ์บ์‹œ ๊ธฐ๋Šฅ, ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ Aspect๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์— ์‚ฌ์šฉํ•œ๋‹ค.

Before Advise : ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•œ๋‹ค. 
After Returning Advice : ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ต์…‰์…˜ ์—†์ด ์‹คํ–‰๋œ ์ดํ›„์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•œ๋‹ค. 
After Throwing Advice :  ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋„์ค‘ ์ต์…‰์…˜์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•œ๋‹ค. 
After Advice : Exception ๋ฐœ์ƒ ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ํ›„ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•œ๋‹ค. 
(try-catch-finally์˜ finally ๋ธ”๋ก๊ณผ ๋น„์Šทํ•˜๋‹ค.) 

์Šคํ”„๋ง AOP ๊ตฌํ˜„

@Aspect, @PointCut, @Around๋ฅผ ์ด์šฉํ•œ AOP ๊ตฌํ˜„

  • Aspect๋กœ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค์— @Aspect ์• ๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.
  • @Pointcut ์• ๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ ์šฉํ•œ Pointcut์„ ์ •์˜ํ•œ๋‹ค.
  • ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๋ฉ”์„œ๋“œ์— @Around ์• ๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Aspect ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ž๋ฐ” ์„ค์ •์„ ์ด์šฉํ•ด์„œ Aspect๋ฅผ ์–ด๋””์— ์ ์šฉํ• ์ง€ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

[Question 2] ์Šคํ”„๋ง์—์„œ ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.

  • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์˜์—ญ ๋‘๊ฐ€์ง€๋Š” ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ ์ž…๋‹ˆ๋‹ค. ์ž๊ฒฉ ์ฆ๋ช…์„ ํ†ตํ•ด ์ ‘๊ทผ ์ œ์–ด๊ถŒ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ์€ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ์ž…๋‹ˆ๋‹ค.

์ธ์ฆ์€ ์ฃผ์ฒด๊ฐ€ ๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ํ™œ๋™์ด ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ์ œ์–ด ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š”๋ฐ ์ด๊ฒƒ์„ ์ธ๊ฐ€๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ํผ ๋กœ๊ทธ์ธ ์ธ์ฆ ์ธ๊ฐ€ ์ ˆ์ฐจ๋ฅผ ๋ฐŸ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTTP ๊ธฐ๋ณธ ์ธ์ฆ ์ ˆ์ฐจ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธ์…˜ ์ฟ ํ‚ค ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆํ•œ๋‹ค.

  • ์š”์ฒญ์„ ๋ฐ›์€ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ์ €์žฅ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์น˜ํ•˜์—ฌ ๊ฒ€์ฆ๋œ ํšŒ์›์ผ ๊ฒฝ์šฐ, JSESSIONID ๋ถ€์—ฌํ•˜๊ณ  ์ด ํ›„ ์š”์ฒญ์—์„œ JSESSIONID์„ ๊ฒ€์ฆ ํ›„ ์œ ํšจํ•˜๋ฉด ์ธ์ฆ์„ ์ค€๋‹ค.

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ Architecture

https://www.notion.so/Spring-security-5f4ffc2605b545ffa0c031d8fece6b5d

Spring Security ์ธ์ฆ ์ˆœ์„œ

  • UserDetailsService ์— loadUserByUsername(String username)๋กœ DB์—์„œ ์œ ์ € ์ •๋ณด๋ฅผ ์กฐํšŒ ํ•ด์˜จ๋‹ค.
  • AuthenticationProvider ์—์„œ authenticate(Authentication authentication)๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • UserDetailsService.loadUserByUsername(String username) ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ€์ง€๊ณ ์˜จ DB ์œ ์ € ์ •๋ณด์™€ authenticate(Authentication authentication)๋กœ ์ ‘์†ํ•œ ์œ ์ € ์ •๋ณด(authentication)๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • AuthenticationProvider ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๊ฒŒ๋˜๋ฉด Authentication๊ฐ์ฒด ๋ฅผ ๋Œ๋ ค์ค€๊ฒŒ๋œ๋‹ค.

DB์—์„œ ์œ ์ €์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ ค๋ฉด UserDetailsService interface๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

๋น„๋ฐ€๋ฒˆํ˜ธ ๋น„๊ต๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด AuthenticationProvider ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

AuthenticationProvider์„ ๋”ฐ๋กœ ๊ตฌํ˜„์•ˆํ•ด๋„ UserDetailsService๋กœ ์œ ์ €์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ• ์ˆ˜ ์žˆ๋‹ค.

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณดํ˜ธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๋˜ ๋‚ด์šฉ์œผ๋กœ 4๊ฐ€์ง€ ์ •๋„์˜ ์ ์šฉ ๋‹จ๊ณ„๋ฅผ ๋ง์”€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
  1. ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์˜์กด์„ฑ ์ถ”๊ฐ€
  2. ๋ชจ๋“  ์š”์ฒญ์— ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์„ค์ •
  3. ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •
  4. ๋กœ๊ทธ ์•„์›ƒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

๋ชจ๋“  ์š”์ฒญ์„ ์ธํ„ฐ์…‰ํŠธ ํ•˜๋„๋ก ํ•„ํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

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

[Question 3] ์Šคํ”„๋ง์—์„œ @Transactional์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€?

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

์ด๋ ‡๊ฒŒ ๋‘๊ฐœ ์ด์ƒ์ด ์ฟผ๋ฆฌ๋ฅผ ํ•œ ์ž‘์—…์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŠธ๋žœ์žญ์…˜์ด๋‹ค. ํŠธ๋žœ์žญ์…˜์€ ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์ž‘์—…์œผ๋กœ ๋ฌถ์–ด์ค€๋‹ค.

  • ํ•œ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์ธ ์ฟผ๋ฆฌ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ์ „์ฒด ์ฟผ๋ฆฌ๋ฅผ ์‹คํŒจ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์‹คํŒจ ์ด์ „์— ์‹คํ–‰ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ทจ์†Œํ•œ๋‹ค.
  • ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ทจ์†Œํ•˜๊ณ  DB๋ฅผ ๊ธฐ์กด ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์„ ๋กค๋ฐฑ(rollback) ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ๋ฐ˜๋ฉด์— ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์ธ ๋ชจ๋“  ์ฟผ๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•ด์„œ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ DB์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์„ ์ปค๋ฐ‹์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๊ฑฐ๋‚˜ ๋กค๋ฐฑํ•  ๋•Œ๊นŒ์ง€ ์‹คํ–‰ํ•œ ์ฟผ๋ฆฌ๋“ค์ด ํ•˜๋‚˜์˜ ์ž‘์—… ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค.

[@Transactional์„ ์ด์šฉํ•œ ํŠธ๋žœ์ ์…˜ ์ฒ˜๋ฆฌ]

  • ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๋ฉ”์„œ๋“œ์— @Transactional ์• ๋…ธํ…Œ์ด์…˜๋งŒ ๋ถ™์ด๋ฉด ๋œ๋‹ค.
  • ํ”Œ๋žซํผ ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €(PlatformTransactionManager) ๋นˆ ์„ค์ •
  • @Transactional ์• ๋…ธํ…Œ์ด์…˜ ํ™œ์„ฑํ™” ์„ค์ •
@Configuration
@EnableTractionManagement  
public class AppCtx {
   DataSource dataSource() {
     ds.setDriverClassName("com.mysql.jdbc.Driver");
   }

}


@Bean
public PlatformTransactionManager transactionManager() {
     DataSourceTransactionManager tm = new DataSourceTransactionManager();
     tm.setDataSource(dataSource());
     return tm;
}

JAVA

์ž๋ฐ”์—์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋™๊ธฐํ™”๋˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜์‹œ์˜ค.

hashCode() ๊ฐ’์ด ๋ชจ๋‘ ๊ฐ™๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋‚˜์š”? hashcode()์™€ equls()๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๊ณ  ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€?

ํŒจ๋Ÿฌ๋ŸดGC, G1GC์˜ ์ฐจ์ด์  ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

DATABASE/SQL

SQL์˜ HINT๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

memcached๋ณด๋‹ค redis์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์€?

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ (Isolation Level) ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์„ธ์š”.

https://www.byteslounge.com/tutorials/spring-transaction-isolation-tutorial

  • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์˜ ์ข…๋ฅ˜
  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SELIALIZABLE