๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ

Books

[์˜ค๋ธŒ์ ํŠธ] ๊ฐ์ฒด ์„ค๊ณ„์— ๋Œ€ํ•ด์„œ

๊ฐ์ฒด ์ง€ํ–ฅ์  ์„ค๊ณ„๊ฐ€ ์š”์ฆ˜ ํฅ๋ฏธ๋กœ์›Œ์„œ ์˜ค๋ธŒ์ ํŠธ๋ผ๋Š” ์ฑ…์„ ์ฝ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค!! ์ธ์ƒ ๊นŠ์—ˆ๋˜ ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ๋ผ๋„ ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌํ•˜๊ณ ์ž ๊ธ€์„ ์“ด๋‹ค ใ…Žใ…Ž๐Ÿ˜‹   ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ชจ๋“ˆ ๋ชฉ์ ์‹คํ–‰ ์ค‘์— ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ๋ณ€๊ฒฝ์„ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ๊ณผ ์˜์‚ฌ์†Œํ†ต ํ•˜๋Š” ๊ฒƒ๋ชจ๋“  ์„ค๊ณ„์˜ ๋ชฉ์ ์€ ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ ๋ณ€๊ฒฝ์„ ์šฉ์ดํ•œ ์„ค๊ณ„๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค!!๐Ÿ‘‰ ๋” ๋‚˜์•„๊ฐ€์„œ ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋Š” ๋†’์ด๋Š” ๊ฒƒ์ด ์ข‹์€ ์„ค๊ณ„์ด๋‹ค.  ์—ฌ๊ธฐ์„œ ์‘์ง‘๋„๋ž€?๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋œ ์ž‘์—…๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์—ฐ๊ด€์„ฑ ์—†๋Š” ์ž‘์—…์€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์‘์ง‘๋„๊ฐ€ ๋†’๋‹ค๊ณ  ๋งํ•œ๋‹ค!์ฆ‰, ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์Šค๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž์œจ์ ์ธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค  ์บก์Šํ™”๊ฐœ๋…์ ์ด๋‚˜ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€์˜ ์„ธ๋ถ€์ ์ธ ์‚ฌํ•ญ์„ ๊ฐ์ถ”๋Š” ๊ฒƒ์™œ? ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ -..

JAVA & OOP

[JAVA] Garbage Collection(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)์ด๋ž€?

๐ŸŒฑ Garbage Collection(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)์ด๋ž€? c๋‚˜ c++ ๊ฐ™์€ unmanaged language๋Š” free() ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์—… ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ java์—์„œ๋Š” JVM์˜ ๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•Œ์•„์„œ ์ •๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ํ•ด์ œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ฃผ๋Š” ์ด์œ ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค!! ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•œ์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ•„์š” ์—†๋Š” ๋ถ€๋ถ„์€ ๊ผญ ํ•ด์ œ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๐Ÿค” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ vs ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ : ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์‹œ์Šคํ…œ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ด๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ์•„ ์ œ๊ฑฐํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ : ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜..

JAVA & OOP

[JAVA] HashCode์™€ equals ์˜ค๋ฒ„๋ผ์ด๋”ฉ

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์œ„์น˜ Id๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๋กœ์ง์ด ์žˆ์–ด์„œ hashCode๋ž‘ equals๋ฅผ ์žฌ์ •์˜ํ–ˆ๋‹ค.! ๊ทผ๋ฐ ๋‚ด๊ฐ€ ์ด ๋‘ ๊ฐœ๋ฅผ ์ž์„ธํžˆ ๊ณต๋ถ€ํ•ด ๋ณธ ์ ์ด ์žˆ์—ˆ๋‚˜ ์‹ถ์–ด์„œ ์ด์ฐธ์— ์ •๋ฆฌํ•ด์„œ ์ดํ•ดํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค! @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; GetAllPlaceResDto that = (GetAllPlaceResDto) o; return Objects.equals(placeId, that.placeId); } @Override public int hashCode() { return Objects.hash(p..

Spring

[Spring] Spring Cache์„ ์ ์šฉํ•œ ์กฐํšŒ ์„ฑ๋Šฅ ๊ฐœ์„  (with. Redis)

ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๋ฉด์„œ ์กฐํšŒํ•˜๋Š” ๋ถ€๋ถ„์— ์บ์‹ฑ์„ ์ ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค! ์™œ ์บ์‹ฑ์„ ์ ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ƒ? ! ํ•ด๋‹น ์„œ๋น„์Šค๋Š” ํ™ˆ ํ™”๋ฉด์—์„œ ์ง€๋„์œ„์— ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€ ์œ„์น˜๋ฅผ ํ‘œํ˜„ํ•ด ์ค€๋‹ค. ์‹ค์งˆ์ ์œผ๋กœ ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก, ์‚ญ์ œ๋ณด๋‹ค ์กฐํšŒ์ˆ˜๊ฐ€ ํ›จ์”ฌ ๋งŽ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ๊ฐ€์žฅ ๋งŽ์ด ๋…ธ์ถœ๋˜๋Š” ํ™ˆ ํ™”๋ฉด์—์„œ ๊ณ„์† ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค๋ฉด ์„ฑ๋Šฅ์ ์œผ๋กœ ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.! ์Šคํ”„๋ง ์บ์‹œ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋Š” ์•„๋ž˜ ๊ธ€์— ์ •๋ฆฌํ•ด๋†“์•˜๋‹ค๐Ÿ˜Š [Spring] Spring Cache(์Šคํ”„๋ง ์บ์‹œ)๋ž€?๐Ÿ”Ž Spring Cache๋ž€? ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๋ฒˆ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑํ•˜์—ฌ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด ๋†“๊ณ  ๋˜‘๊ฐ™์€ ์š”์ฒญ์ด ์™”์„ ๋•Œ ๋กœ์ง์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ฃผ์–ด ๋น ๋ฅธ dahliachoi.tistory.com ๐Ÿ”Ž ์บ์‹ฑ..

Spring

[Spring] @PrePersist์™€ @PreUpdate

ํ•˜๋“œ์ฝ”๋”ฉ๊ณผ ์ค‘๋ณต์„ ์ง€์–‘ํ•˜๊ณ ์ž @PrePersist, @PreUpdate ์‚ฌ์šฉ์„ ๋Š˜๋ฆฌ๊ณ  ์žˆ๋‹ค. ๐ŸŒฑ @PrePersist ๋ž€? JPA ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋น„์˜์† ์ƒํƒœ์—์„œ ์˜์† ์ƒํƒœ๊ฐ€ ๋˜๋Š” ์‹œ์ ์— ์‹คํ–‰๋œ๋‹ค. ์ฆ‰, ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๊ธฐ ์ „์— JPA Provider์— ์˜ํ•ด ์ž๋™์ ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค. ๐ŸŒฑ @PreUpdate ๋ž€? ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ด์ „์— ์‹คํ–‰๋œ๋‹ค. ์ฆ‰, ์—”ํ‹ฐํ‹ฐ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™๊ธฐํ™”๋˜๊ธฐ ์ „์— JPA Provider์— ์˜ํ•ด ์ž๋™์ ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค. ๐Ÿซง ์‚ฌ์šฉ ์‹œ ์œ ์˜ํ•  ์  ์ ์ ˆํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ๋กœ์ง์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ๋ณต์žกํ•œ ๋กœ์ง์€ @PrePersist, @PreUpdate ๋‚ด์—์„œ ํ”ผํ•œ๋‹ค. ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํ”ผํ•œ๋‹ค. ์—”ํ‹ฐํ‹ฐ์˜ ์ƒ..

Spring

[Spring] N+1 ๋ฌธ์ œ์™€ fetch join ํ•ด๊ฒฐ ๋ฐ ํ…Œ์ŠคํŠธ

๐ŸŒฑ N+1 ๋ฌธ์ œ๋ž€? JPA ์—ฐ๊ด€๊ด€๊ณ„์—์„œ ์ƒ๊ธฐ๋Š” ์ด์Šˆ๋กœ ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์„ค์ •๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๊ฒฝ์šฐ ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜(N)๋งŒํผ ์—ฐ๊ด€ ๊ด€๊ณ„์˜ ์กฐํšŒ ์ฟผ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋กœ ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฌธ์ œ๋ฅผ ๋งํ•œ๋‹ค. ๐Ÿค” ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ• ๊นŒ? 1. Fetch Type์„ Lazy๋กœ ์„ค์ •ํ•œ๋‹ค. 2. fetch join์„ ์‚ฌ์šฉํ•œ๋‹ค. 3. Batch Size๋ฅผ ์กฐ์ ˆํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚œ 1, 2๋ฒˆ์„ ๊ฐ€์ง€๊ณ  ํ•ด๊ฒฐํ•ด ๋ณด์•˜๋‹ค. ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ํ•ด๊ฒฐ ๊ณผ์ • ๋ฐ ํ…Œ์ŠคํŠธ ๋‚˜๋Š” ์ด ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“  ์œ ์ € ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ๊ธ€ ์ •๋ณด์™€ ๊ฐ™์ด ๋งคํ•‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค. Member ๊ฐ์ฒด์™€์˜ fetch type์„ Lazy๋กœ ์„ค์ •ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ๋งŒ ๋ถ™์ธ๋‹ค๊ณ  ํ•ด์„œ ํ•ด๊ฒฐ์ด ๋˜์ง„ ์•Š๋Š”๋‹ค. public ListResult testGetMembersV1() { L..

JAVA & OOP

[JAVA] Optional ํด๋ž˜์Šค์˜ orElse์™€ orElseGet ์ฐจ์ด

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ orElse๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ๋‚ด ์˜๋„๋Œ€๋กœ ์ž‘๋™์„ ํ•˜์ง€ ์•Š์•„์„œ ์˜๋ฌธ์ ์ด ๋“ค์—ˆ๋‹ค. ๊ฒŒ์‹œ๊ธ€์„ ์—…๋กœ๋“œํ•  ๋•Œ ์œ„์น˜ ์ •๋ณด๋ฅผ ๊ฐ™์ด ์—…๋กœ๋“œํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ์œ„์น˜ DB์— ํ•ด๋‹น ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด ์œ„์น˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค๋„๋ก ํ•˜๋Š” ๋กœ์ง์ด์—ˆ๋‹ค! orElse๋ฅผ ์‚ฌ์šฉํ–ˆ๋”๋‹ˆ ์œ„์น˜ ์ •๋ณด๊ฐ€ ๋‘ ๊ฐœ๊ฐ€ ์ €์žฅ์ด ๋˜๋Š” ์•„์ด๋Ÿฌ๋‹ˆํ•œ ์ƒํ™ฉ์ด์—ˆ๋‹ค... ํ•ด๋‹น ๋กœ์ง์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์งฐ๊ณ , ๋‹น์—ฐํžˆ placeRepository์—์„œ null๊ฐ’์„ ๊ฐ€์ ธ์™”์„ ๋•Œ๋งŒ orElse๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ–ˆ์—ˆ๋‹ค. ๊ทผ๋ฐ ์ฐพ์•„๋ณด๋‹ˆ๊นŒ ๋ฐ˜์€ ๋งž๊ณ  ๋ฐ˜์€ ํ‹€๋ ธ์—ˆ๋‹ค!! orElse()์™€ orElseGet()์˜ ๊ณตํ†ต์  ๋‘ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ Optional ํด๋ž˜์Šค ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‹ค์ œ ๊ฐ’์ด null์ผ ๊ฒฝ์šฐ ์–ด๋–ค ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•ด์„œ return ํ•ด..

Spring

[Spring] JWT AccessToken/RefreshToken ๊ตฌํ˜„ (with. Redis)

ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ„๋‹จํžˆ jwt๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•ด ๋ดค๋‹ค! ๐ŸŒฑ Spring Security๋ž€? ์ธ์ฆ(Authentication), ๊ถŒํ•œ(Authorize) ๋ถ€์—ฌ ๋ฐ ๋ถ€ํ˜ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์ธ์ฆ vs ์ธ๊ฐ€ ๋ณดํ†ต ์ธ์ฆ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์นœ ํ›„ ์ธ๊ฐ€ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์นœ๋‹ค. ์ธ์ฆ ํ˜„์žฌ ์œ ์ €๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ • (๋กœ๊ทธ์ธ) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ฆ๋ช… ์ธ๊ฐ€ ํ˜„์žฌ ์œ ์ €์˜ ๊ถŒํ•œ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ณผ์ • ํŽ˜์ด์ง€๋‚˜ ๋ฆฌ์†Œ์Šค ๋“ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ Spring Security ๊ตฌ์กฐ 1. Http Request ์ˆ˜์‹  ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์ •๋ณด์™€ ํ•จ๊ป˜ ์ธ์ฆ ์š”์ฒญ์„ ํ•œ๋‹ค. 2. ์œ ์ € ์ž๊ฒฉ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ ํ† ํฐ ์ƒ์„ฑ AuthenticationFilter๊ฐ€ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๊ณ , ๊ฐ€๋กœ์ฑˆ ์ •๋ณด๋ฅผ ํ†ตํ•ด UsernamePasswordA..

Spring

[Spring] @AllArgsConstructor, @RequiredArgsConstructor ์‚ฌ์šฉ์„ ์ง€์–‘ํ•œ ์ด์œ 

์ธํ„ด ์ƒํ™œ์„ ํ•˜๋ฉด์„œ @AllArgsConstructor, @RequiredArgsConstructor ์ด ๋‘ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณธ ์ ์ด ์—†์—ˆ๋Š”๋ฐ, ๊ทธ๋ƒฅ ์‚ฌ์šฉ์„ ์•ˆํ•˜๋Š”๊ฑฐ๊ตฌ๋‚˜๋ผ๊ณ ๋งŒ ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋ฌธ๋œฉ ์™œ ์ง€์–‘ํ• ๊นŒ๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค! ์ผ๋‹จ spring di๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜์ž๋ฉด! Spring DI๋ž€? DI๋Š” ์Šคํ”„๋ง ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์ด๋‹ค. ๊ฐ์ฒด๋“ค๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„๋ฐฉ์‹์„ ๋งํ•œ๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…, ํ•„๋“œ ์ฃผ์ž…, setter ์ฃผ์ž… ์„ธ๊ฐœ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ๊ทธ ์ค‘์—์„œ ์Šคํ”„๋ง์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์€ ์ƒ์„ฑ์ž ์ฃผ์ž…์ด๋‹ค. @Service public class UserService {..

Spring

[Spring] @ExceptionHandler๋ฅผ ํ†ตํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ (+ DTO Validation)

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒผ๋‹ค! ํ•ด๋‹น ์˜ˆ์™ธ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ๊ฐ’๋„ ๋ฐ˜ํ™˜ํ–ˆ์–ด์•ผ ํ•ด์„œ try-catch๋ฅผ ์‚ฌ์šฉํ• ๊นŒ ํ–ˆ์ง€๋งŒ ๋ฐ˜ํ™˜ํ˜• ์‹์ด ๋‹ฌ๋ผ์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ• ๊นŒ ๊ณ ๋ฏผ์„ ํ•˜๋˜ ์ค‘์— @ExceptionHandler๋ฅผ ํ†ตํ•ด์„œ ์ฒ˜๋ฆฌํ•ด ์ฃผ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค! ๊ทผ๋ฐ @ExceptionHandler๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ปจํŠธ๋กค๋Ÿฌ์— ๋งค๋ฒˆ ์ง€์ •์„ ํ•ด์ฃผ๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ ์ค‘๋ณต์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ผ์„œ @ControllerAdvice๋ฅผ ํ†ตํ•ด ์ „์—ญ์ ์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ๋‹ค. ๐Ÿ”Ž ์‚ฌ์šฉํ•œ ์ฝ”๋“œ @RestControllerAdvice public class ExceptionAdviceController { private final ResponseService responseService; public Exce..

DAHLIA CHOI
'๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก