• ABOUT
  • PORTFOLIO
  • POSTS
  • GUESTBOOK

ยฉ 2025 BlueCool12 All rights reserved.

2025.08.27Tips

๐Ÿ”ฃ ๋ฉ”ํƒ€๋ฌธ์ž ์ดํ•ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ •๊ทœํ‘œํ˜„์‹

1. ์ •๊ทœํ‘œํ˜„์‹ (Regular Expression, Regex)

์ •๊ทœํ‘œํ˜„์‹์€ ํŠน์ •ํ•œ ๊ทœ์น™์„ ๊ฐ€์ง„ ๋ฌธ์ž์—ด์˜ ํŒจํ„ด์„ ํ‘œํ˜„ํ•˜๋Š” ํ˜•์‹ ์–ธ์–ด์ด๋‹ค. ์ฃผ๋กœ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰ ๋ฐ ์น˜ํ™˜, ์ž…๋ ฅ๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๋กœ๊ทธ ๋ถ„์„ ๋ฐ ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ ๊ฐ™์€ ์ž‘์—…์— ์‚ฌ์šฉ๋œ๋‹ค.


- ์ •๊ทœํ‘œํ˜„์‹์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ

์ •๊ทœํ‘œํ˜„์‹์€ ์ผ๋ฐ˜ ๋ฌธ์ž(Literal)์™€ ํŠน์ˆ˜ ๋ฌธ์ž(Meta Characters)์˜ ์กฐํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

์ผ๋ฐ˜ ๋ฌธ์ž๋ž€ ํŠน๋ณ„ํ•œ ์˜๋ฏธ ์—†์ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋งค์นญ๋˜๋Š” ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

a
hello
catโ€‹

ํŠน์ˆ˜ ๋ฌธ์ž๋Š” ์ •๊ทœ์‹์—์„œ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด ๋ฌธ์ž๋“ค์€ ๋ฐ˜๋ณต, ์„ ํƒ, ์œ„์น˜ ๊ฒ€์‚ฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

. ^ $ * + ? { } [ ] ( ) | \


2. ์ •๊ทœํ‘œํ˜„์‹์˜ ๊ตฌ์กฐ

์ •๊ทœํ‘œํ˜„์‹์€ ๋ณดํ†ต ํ† ํฐ(Token)๊ณผ ๊ทœ์น™(Rule)์˜ ๊ฒฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํ† ํฐ์€ ๋ฌธ์ž๋ฅผ ์‹ค์ œ๋กœ ๋งค์นญํ•˜๋Š” ์š”์†Œ์ด๊ณ  ๊ทœ์น™์€ ํ† ํฐ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜๋Š” ์š”์†Œ์ด๋‹ค.


- ํ† ํฐ(Token)

๋ฌธ์ž์—ด์—์„œ ์‹ค์ œ ๋ฌธ์ž๋ฅผ ๋งค์นญํ•˜๋Š” ๋‹จ์œ„์ด๋‹ค. ์ฃผ์š” ์ข…๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1) ๋ฆฌํ„ฐ๋Ÿด (Literal)
์ผ๋ฐ˜ ๋ฌธ์ž ์ž์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

a
hello
catโ€‹

๋ฌธ์ž์—ด์—์„œ ํ•ด๋‹น ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋งค์นญ๋œ๋‹ค.

2) ๋ฌธ์ž ํด๋ž˜์Šค (Character Class)
์—ฌ๋Ÿฌ ๋ฌธ์ž ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๋งค์นญํ•œ๋‹ค.

[abc] -> a, b, c ์ค‘ ํ•˜๋‚˜
[a-z] -> a๋ถ€ํ„ฐ z๊นŒ์ง€์˜ ์†Œ๋ฌธ์ž ์ค‘ ํ•˜๋‚˜
[0-9] -> 0๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘ ํ•˜๋‚˜


3) ์ถ•์•ฝ ํด๋ž˜์Šค (Shorthand Class)
์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž ์ง‘ํ•ฉ์„ ์งง๊ฒŒ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

\d -> ์ˆซ์ž (0~9)
\w -> ๋‹จ์–ด ๋ฌธ์ž (a-z, A-Z, 0-9, _)
\s -> ๊ณต๋ฐฑ ๋ฌธ์ž (space, tab, newline ๋“ฑ)

\D -> ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž
\W -> ๋‹จ์–ด ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž
\S -> ๊ณต๋ฐฑ์ด ์•„๋‹Œ ๋ฌธ์ž


4) ๊ทธ๋ฃน (Group)
์—ฌ๋Ÿฌ ํŒจํ„ด์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ๋Š” ๊ตฌ์กฐ์ด๋‹ค.

(abc) -> "abc"๋ผ๋Š” ๋ฌธ์ž์—ด์„ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์Œ


- ์—ฐ์‚ฐ์ž (Operator)

์—ฐ์‚ฐ์ž๋Š” ํ† ํฐ์˜ ๋ฐ˜๋ณต์ด๋‚˜ ์„ ํƒ์„ ์ œ์–ดํ•œ๋‹ค.

1) ์ˆ˜๋Ÿ‰์ž (Quantifier)
ํŒจํ„ด์˜ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

*     -> 0ํšŒ ์ด์ƒ
+ -> 1ํšŒ ์ด์ƒ
? -> 0 ๋˜๋Š” 1ํšŒ
{n} -> n๋ฒˆ ๋ฐ˜๋ณต
{n,m} -> n~m๋ฒˆ ๋ฐ˜๋ณต


2) ๋ถ„๊ธฐ (Alternation)
์—ฌ๋Ÿฌ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•œ๋‹ค.

a|b -> a ๋˜๋Š” bโ€‹


- ์ œ๋กœํญ ์ฃผ์žฅ (Zero-width Assertion)

์ œ๋กœํญ ์ฃผ์žฅ์€ ๋ฌธ์ž๋ฅผ ์‹ค์ œ๋กœ ์†Œ๋น„ํ•˜์ง€ ์•Š๊ณ  ์œ„์น˜๋‚˜ ์กฐ๊ฑด๋งŒ ๊ฒ€์‚ฌํ•œ๋‹ค.

1) ์•ต์ปค (Anchor)
๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ๋˜๋Š” ๋ ์œ„์น˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

^ -> ๋ฌธ์ž์—ด ์‹œ์ž‘
$ -> ๋ฌธ์ž์—ด ๋


2) ๊ฒฝ๊ณ„ (Boundary)
๋‹จ์–ด์˜ ๊ฒฝ๊ณ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

\b -> ๋‹จ์–ด ๋ฌธ์ž(\w)์™€ ๋น„๋‹จ์–ด ๋ฌธ์ž(\W) ์‚ฌ์ด์˜ ๊ฒฝ๊ณ„


3) ํƒ์ƒ‰ (Lookaround)
ํŠน์ • ์กฐ๊ฑด์„ ํ™•์ธ๋งŒ ํ•˜๊ณ  ์†Œ๋น„ํ•˜์ง€ ์•Š๋Š” ํŒจํ„ด์ด๋‹ค.

[์ „๋ฐฉ ํƒ์ƒ‰]
(?=...) -> ๊ธ์ • ์ „๋ฐฉ ํƒ์ƒ‰
(?!...) -> ๋ถ€์ • ์ „๋ฐฉ ํƒ์ƒ‰

[ํ›„๋ฐฉ ํƒ์ƒ‰]
(?<=...) -> ๊ธ์ • ํ›„๋ฐฉ ํƒ์ƒ‰
(?<!...) -> ๋ถ€์ • ํ›„๋ฐฉ ํƒ์ƒ‰


3. ์ฃผ์š” ๋ฉ”ํƒ€ ๋ฌธ์ž ์ •๋ฆฌ ๋ฐ ํ™œ์šฉ ์˜ˆ์‹œ

- . (dot): ์ž„์˜์˜ ๋ฌธ์ž 1๊ฐœ

.์€ ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž(\n)๋ฅผ ์ œ์™ธํ•œ ์–ด๋–ค ๋ฌธ์ž๋“  1๊ฐœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

[ํŒจํ„ด]
a.b -> a์™€ b ์‚ฌ์ด์— ์ž„์˜์˜ ๋ฌธ์ž 1๊ฐœ

[โ€‹๋งค์นญ]
acb
a b
aํ•œb
a_b

์ผ๋ถ€ ์—”์ง„์—์„œ๋Š” s(DOTALL)์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž๋„ ํฌํ•จ๋œ๋‹ค.


- [ ]: ๋ฌธ์ž ํด๋ž˜์Šค

[...]์•ˆ์— ํ—ˆ์šฉํ•  ๋ฌธ์ž ์ง‘ํ•ฉ์„ ์ž‘์„ฑํ•˜๋ฉด ๊ทธ ์ค‘ ํ•˜๋‚˜์™€ ๋งค์นญ๋œ๋‹ค. ๋งจ ์•ž์— ^๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ฌธ์ž๋“ค์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

[ํŒจํ„ด]
[abc] -> a ๋˜๋Š” b ๋˜๋Š” c
[0-9] -> ์ˆซ์ž (0~9)
โ€‹
[๋ถ€์ • ํด๋ž˜์Šค]
[^0-9] -> ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž


- -: ๋ฒ”์œ„ ์ง€์ •

๋ฌธ์ž ํด๋ž˜์Šค [ ]์•ˆ์—์„œ -๋Š” ๋ฌธ์ž ๋ฒ”์œ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

[ํŒจํ„ด]
[A-Z] -> A๋ถ€ํ„ฐ Z
[a-z] -> a๋ถ€ํ„ฐ z
[0-9] -> ์ˆซ์ž 0~9

*๋ฌธ์ž ํด๋ž˜์Šค์—์„œ -๋ฅผ ๋งจ ์•ž์ด๋‚˜ ๋งจ ๋’ค์— ๋‘๋ฉด ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž๋กœ ์ฒ˜๋ฆฌ๋˜๋‹ˆ ์ฃผ์˜


- |: ๋ถ„๊ธฐ

|๋Š” ์—ฌ๋Ÿฌ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•œ๋‹ค.

[ํŒจํ„ด]
a|b -> a ๋˜๋Š” b
cat|dog -> cat ๋˜๋Š” dogโ€‹

|๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ๋‹ค.

[ํŒจํ„ด]
ab|cd = (ab)|(cd)
a|bc = (a)|(bc)

๋˜ํ•œ ์ •๊ทœ์‹ ์—”์ง„์€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋Œ€์•ˆ์„ ์‹œ๋„ํ•œ๋‹ค.

[์ž…๋ ฅ]
caterer

[ํŒจํ„ด]
(cat|cater)er

[๋™์ž‘]
cat + er -> cater (๋งค์นญ ์„ฑ๊ณต)โ€‹

๋”ฐ๋ผ์„œ cater ๋Œ€์•ˆ์€ ์‹œ๋„๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Ÿฌํ•œ ๋™์ž‘ ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ๊ฒน์น˜๋Š” ํŒจํ„ด์ด ์žˆ๋‹ค๋ฉด ๋” ๊ธด ํŒจํ„ด์„ ๋จผ์ € ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


- \: ์ด์Šค์ผ€์ดํ”„ ๋ฐ ์•ฝ์–ด ํด๋ž˜์Šค

\๋Š” ๋‘ ๊ฐ€์ง€ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

1) ๋ฉ”ํƒ€๋ฌธ์ž ์ด์Šค์ผ€์ดํ”„
๋ฉ”ํƒ€๋ฌธ์ž๋ฅผ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

[ํŒจํ„ด]
pyomin\.com -> pyomin.com
file\(name\)\.txtโ€‹ -> file(name).txt


2) ์ถ•์•ฝ ๋ฌธ์ž ํด๋ž˜์Šค
์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž ์ง‘ํ•ฉ์„ ์งง๊ฒŒ ํ‘œํ˜„ํ•œ๋‹ค.

[ํŒจํ„ด]
\d -> ์ˆซ์ž [0-9]
\w -> ๋‹จ์–ด ๋ฌธ์ž [A-Za-z0-9_]
\s -> ๊ณต๋ฐฑ ๋ฌธ์ž (space, tab, newline)
\b -> ๋‹จ์–ด ๊ฒฝ๊ณ„

[๋ฐ˜๋Œ€ ์ง‘ํ•ฉ]
\D -> ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž
\W -> ๋‹จ์–ด ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž
\S -> ๊ณต๋ฐฑ์ด ์•„๋‹Œ ๋ฌธ์ž
\B -> ๋‹จ์–ด ๊ฒฝ๊ณ„๊ฐ€ ์•„๋‹Œ ์œ„์น˜

๋Œ€๋ถ€๋ถ„์˜ ์—”์ง„์—์„œ \d, \w ๋“ฑ์€ ASCII ๊ธฐ์ค€์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ๊ธ€์ด๋‚˜ ์ „๊ฐ ์ˆซ์ž๋Š” ํฌํ•จ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.


- {m,n}: ์ˆ˜๋Ÿ‰์ž

๋ฐ”๋กœ ์•ž ํ† ํฐ์„ m~nํšŒ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ผ๋ถ€ ๋ฐ˜๋ณต ํŒจํ„ด์€ ์ถ•์•ฝํ˜•์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

[ํŒจํ„ด]
\d{3} -> ์ˆซ์ž 3๊ฐœ
\d{3,} -> ์ˆซ์ž 3๊ฐœ ์ด์ƒ
\d{2,4} -> ์ˆซ์ž 2~4๊ฐœ

[์ถ•์•ฝํ˜• ํŒจํ„ด]
? = {0,1}
* = {0,}
+ = {1,}

์ˆ˜๋Ÿ‰์ž๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ์š•์ (greedy)์ด๋‹ค. ์ฆ‰ ๊ฐ€๋Šฅํ•œ ๋งŽ์ด ๋งค์นญํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค.

[ํŒจํ„ด]
a\d{2,4}bโ€‹

[๋ฌธ์ž์—ด]
a1234b

[๋งค์นญ]
a1234b

\d{2,4}๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๊ฐœ์ˆ˜(4๊ฐœ)๊นŒ์ง€ ๋จผ์ € ์†Œ๋น„ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜๋Ÿ‰์ž ๋’ค์— ?๋ฅผ ๋ถ™์ด๋ฉด ์ตœ์†Œํ•œ๋งŒ ์†Œ๋น„ํ•˜๋Š” lazy ๋ฐฉ์‹์ด ๋œ๋‹ค.

[ํŒจํ„ด]
<.*> -> Greedy
<.*?> -> Lazy

[๋ฌธ์ž์—ด]
<div>text</div>

[๋™์ž‘]
Greedy -> <div>text</div>
Lazy -> <div>

์ •๊ทœ์‹ ์—”์ง„์€ ๋งค์นญ์— ์‹คํŒจํ•˜๋ฉด ๋ฐฑํŠธ๋ž˜ํ‚น(backtracking) ๋ฐฉ์‹์œผ๋กœ ์žฌ์‹œ๋„ํ•œ๋‹ค.


- ^ $: ์‹œ์ž‘๊ณผ ๋

^๋Š” ๋ฌธ์ž์—ด ์‹œ์ž‘ $๋Š” ๋ฌธ์ž์—ด ๋์„ ์˜๋ฏธํ•œ๋‹ค.

[ํŒจํ„ด]
^\d+$ -> ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆซ์ž๋งŒ
^Hello -> Hello๋กœ ์‹œ์ž‘
end$ -> end๋กœ ๋

๋ฉ€ํ‹ฐ๋ผ์ธ ์˜ต์…˜ m์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์ค„์˜ ์‹œ์ž‘๊ณผ ๋๋„ ์•ต์ปค๋กœ ์ธ์‹๋œ๋‹ค.


- ( ): ๊ทธ๋ฃน/์บก์ฒ˜

( )๋Š” ํŒจํ„ด์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ๋Š” ๊ทธ๋ฃน์ด๋‹ค.

[ํŒจํ„ด1]
(ab){3}

[๋งค์นญ1]
ababab

[ํŒจํ„ด2]
(https?)://

[๋งค์นญ2]
http://
https://

๊ทธ๋ฃน์€ ๋งค์นญ๋œ ๋ฌธ์ž์—ด์„ ์ž๋™์œผ๋กœ ์ €์žฅํ•˜๋Š”๋ฐ ์ด๋ฅผ ์บก์ฒ˜๋ผ๊ณ  ํ•œ๋‹ค.

[์ž…๋ ฅ]
2025-08-27

[ํŒจํ„ด]
(\d{4})-(\d{2})-(\d{2})

[๊ฒฐ๊ณผ]
Group 1 -> 2025
Group 2 -> 08
Group 3 -> 27

๊ฐ ๊ทธ๋ฃน์€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋œ๋‹ค. ์ˆซ์ž ์ธ๋ฑ์Šค ๋Œ€์‹  ์บก์ฒ˜ ๊ทธ๋ฃน์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ์ด๋ฅผ Named Group์ด๋ผ๊ณ  ํ•œ๋‹ค. Named Group์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •๊ทœ์‹์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

[์ž…๋ ฅ]
2025-08-27

[ํŒจํ„ด]
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

[๊ฒฐ๊ณผ]
year -> 2025
month -> 08
day -> 27

์บก์ฒ˜๋œ ๊ทธ๋ฃน์€ ๋‹ค์‹œ ์ฐธ์กฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

[ํŒจํ„ด]
(?<word>\w+)\s\k<word>

[๋งค์นญ]
hello hello
test test

\k<word>๋Š” word ๊ทธ๋ฃน์— ์บก์ฒ˜๋œ ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ์ฐธ์กฐํ•œ๋‹ค. ์บก์ฒ˜๊ฐ€ ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋น„์บก์ฒ˜ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (?:...) ์ด ๋ฌธ๋ฒ•์€ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์ง€๋งŒ ์บก์ฒ˜๋Š” ํ•˜์ง€ ์•Š๋Š”๋‹ค.

[ํŒจํ„ด]
^(?:https?|ftp)://

[๋งค์นญ]
http://
https://
ftp://
์ด์ „ ๊ธ€
๐Ÿ”„ ์ž๋ฐ” Stream API ๊ฐ€์ด๋“œ - ์ƒ์„ฑ, ์—ฐ์‚ฐ, ์žฅ๋‹จ์  ์ •๋ฆฌ
๋‹ค์Œ ๊ธ€
๐Ÿž JPA N+1 ๋ฌธ์ œ - Fetch Join & EntityGraph
์žฅ์‹์šฉ ๋กœ๊ณ