๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

โœ๏ธ Today I Learned(TIL)/๐ŸŒฑ ์ŠคํŒŒ๋ฅดํƒ€ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„71

[ TIL ] ํ”Œ๋Ÿฌ์Šค ํ”„๋กœ์ ํŠธ_Day 6 ์˜ค๋Š˜ ํ•œ ๊ณต๋ถ€ ๐Ÿง ํ”„๋กœ์ ํŠธ์— ์บ์‹œ ์ ์šฉํ•˜๋ฃจ์ข…์ผ ๊ณต๋ถ€ํ–ˆ๋˜ ์บ์‹œ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ–ˆ๋‹ค. ๊ฒ€์ƒ‰์–ด๋ฅผ ํ†ตํ•ด ์ƒํ’ˆ๋“ค์„ ์กฐํšŒํ•  ๋•Œ์™€ ์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด ์กฐํšŒํ•  ๋•Œ ์บ์‹œ๋ฅผ ์ ์šฉํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒ€์ƒ‰์–ด๋ฅผ ํ†ตํ•ด ์ƒํ’ˆ๋“ค์„ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•œ ๊ฒ€์ƒ‰์–ด๋ฅผ DB์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ count ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— DB์™€ Cache ๊ฐ„์˜ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ํฌ๊ฒŒ ๋‚˜์ง€ ์•Š์•˜๋‹ค.์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด๋Š” ์กฐ๊ธˆ ๋‹ฌ๋ž๋‹ค. ConcurrentHaspMap์„ ์ด์šฉํ•ด์„œ ์บ์‹œ์— ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•˜๊ณ  ๋งŽ์ด ์ €์žฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ๋˜์–ด ์กฐํšŒ๋˜๊ฒŒ๋” ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ๋”๋‹ˆ DB์—์„œ ์ง์ ‘ ์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ๊ณผ Cache์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์— ์†๋„ ์ฐจ์ด๊ฐ€ ์กด์žฌํ–ˆ๋‹ค.ํ”„๋กœ์ ํŠธ์— Redis ์ ์šฉ๊ทธ๋‹ค์Œ์€ ์บ์‹œ๋ฅผ ์ ์šฉํ–ˆ๋˜ ๋ถ€๋ถ„์„ Redis๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ๋‹ค.์ƒ๊ฐ๋ณด๋‹ค R.. 2025. 2. 5.
[ TIL ] ํ”Œ๋Ÿฌ์Šค ํ”„๋กœ์ ํŠธ_Day 5 ์˜ค๋Š˜ ํ•œ ๊ณต๋ถ€ ๐Ÿง ์บ์‹œ ๊ณต๋ถ€ํ”„๋กœ์ ํŠธ์— ์บ์‹œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?์Šคํƒ ๋‹ค๋“œ๋ฐ˜ Redis ์„ธ์…˜ ๋“ฃ๊ธฐ ์˜ค๋Š˜ ํ•˜๋ฃจ ์ •๋ฆฌ โœ๏ธ  ๋‚ด์ผ ๊ณ„ํš โฐ 2025. 2. 5.
[ TIL ] Kotlin ๋ฌธ๋ฒ• ๊ธฐ์ดˆ/์‹ฌํ™”_Day 4 ์˜ค๋Š˜ ํ•œ ๊ณต๋ถ€ ๐Ÿง ํ•„์ˆ˜ ๊ณผ์ œ ํ•ด๊ฒฐSpring Security์ธ์ฆ, ๊ถŒํ•œ ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ์›น ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ํ•„์ˆ˜์ ์ธ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋„์›€์„ ์ฃผ๋Š” Spring์˜ ๊ฐ•๋ ฅํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.์‚ฌ์šฉํ•˜๋Š” ์ด์œ Spring Security๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” Spring์˜ ์ƒํƒœ๊ณ„์—์„œ ๋ณด์•ˆ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์ผ์ผ์ด ๋ณด์•ˆ ๊ด€๋ จ ๋กœ์ง์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. Spring Security๋Š” Spring์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํ™œ์šฉํ•˜๊ธฐ ์ ์ ˆํ•œ ๊ตฌ์กฐ๋กœ, ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ํ™œ์šฉํ•˜๊ธฐ ์ข‹๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ Spring์—์„œ ์ถ”๊ตฌํ•˜๋Š” IoC/DI ํŒจํ„ด๊ณผ ๊ฐ™์€ ํ™•์žฅ ํŒจํ„ด์„ ๊ณ ๋ คํ•˜์—ฌ ์ธ์ฆ/์ธ๊ฐ€ ๋ถ€๋ถ„์„ ์ง์ ‘ ๊ฐœ๋ฐœํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š์ง€๋งŒ.. 2025. 1. 24.
[ TIL ] Kotlin ๋ฌธ๋ฒ• ๊ธฐ์ดˆ/์‹ฌํ™”_Day 3 ์˜ค๋Š˜ ํ•œ ๊ณต๋ถ€ ๐Ÿง QueryDSL ์ฑŒ๋ฆฐ์ง€๋ฐ˜ ์„ธ์…˜ ๋“ฃ๊ธฐ๊ณผ์ œ์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด QueryDSL ๊ณต๋ถ€SQL, JPQL ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ Java ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ORM ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ ๋นŒ๋”SQL์„ Java ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด์„œ, ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋Œ€ํญ ๊ฐœ์„ ๋œ๋‹ค.๋™์  ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋งค์šฐ ์œ ์—ฐํ•˜๋‹ค.์ดˆ๊ธฐ ์„ธํŒ…์ด ๋งค์šฐ ๋ณต์žกํ•˜๋‹ค.Q ํด๋ž˜์Šค ์ƒ์„ฑ์ด ํ•„์š”ํ•˜๋‹ค.๊ณผ์ œ ํ•ด๊ฒฐJPQL๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ๋ฅผ QueryDSL๋กœ ๋ณ€๊ฒฝ์„ธ์…˜์—์„œ ๋ฐฐ์šด๋Œ€๋กœ ์ดˆ๊ธฐ ์„ธํŒ…todoId๋ฅผ ํ†ตํ•ด ์ผ์ •์„ ์กฐํšŒํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฉ”์„œ๋“œ๋ผ์„œ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ”๋“œ ์ž‘์„ฑ@Repository@RequiredArgsConstructorpublic class TodoQueryRepository { private final JPAQueryFactory queryFactor.. 2025. 1. 23.
[ TIL ] Kotlin ๋ฌธ๋ฒ• ๊ธฐ์ดˆ/์‹ฌํ™”_Day 1 ์˜ค๋Š˜ ํ•œ ๊ณต๋ถ€ ๐Ÿง ๊ฐœ์ธ ๊ณต๋ถ€ (BaseEntity, GlobalExceptionHandler)BaseEntity์—”ํ‹ฐํ‹ฐ(Entity) : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ด๊ฐ€ ํŽธํ•˜๋‹ค.์ธ์Šคํ„ด์Šค(Instance) : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๋‚ด์šฉ์˜ ์ „์ฒด ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค.์†์„ฑ(Attribute) : ์ธ์Šคํ„ด์Šค์˜ ๊ตฌ์„ฑ์š”์†Œ๋กœ์จ ๋” ์ด์ƒ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š๋Š” ๋‹จ์œ„๋กœ, ์—…๋ฌด์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ๊ณตํ†ต ์†์„ฑ์ธ created_at, updated_at ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์†Œ์œ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋ณด์—ฌ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค.์ƒ์„ฑ์ผ, ์ˆ˜์ •์ผ์ด ๊ณตํ†ต ์†์„ฑ์œผ๋กœ ํ•ด๋‹นํ•œ๋‹ค. ์ด ์ฝ”๋“œ๋“ค์„ ์—”ํ‹ฐํ‹ฐ์— ๋ชจ๋‘ ์ ์–ด์ค„ ๊ฒฝ์šฐ ์ฝ”๋“œ์˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿฐ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„.. 2025. 1. 21.
[ TIL ] JPA ์‹ฌํ™”_Day 7 ์˜ค๋Š˜ ํ•œ ๊ณต๋ถ€ ๐Ÿง ํ•„์ˆ˜ ๊ณผ์ œ Level 2 (Cascade, N+1)CascadeType.ALL์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ„ํ—˜์„ฑ์ด ๋„ˆ๋ฌด ํฌ๋‹ค. ๊ทธ๋ž˜์„œ ALL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ PERSIST๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•˜๋‹ค.FetchType = LAZY์™€ Fetch Join์„ ํ•จ๊ป˜ ์ด์šฉํ•ด์„œ N+1 ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.FeFetch Join๊ณผ @EntityGraph ๋‘˜ ์ค‘ ํ•˜๋‚˜๋กœ N+1์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ์ค‘์—์„œ Fetch Join์ด inner join๊ณผ outer join ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Fetch Join์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ์„ธ์…˜ ๋“ฃ๊ธฐDocker ์‚ฌ์šฉํ•ด์„œ MySQL๊ณผ Redis image ๋ถˆ๋Ÿฌ์˜ค๊ณ  IntelliJ์™€ ์—ฐ๋™์‹œ์ผœ ๋ณด๊ธฐ ์˜ค๋Š˜ ํ•˜๋ฃจ ์ •๋ฆฌ โœ.. 2025. 1. 20.