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

๐Ÿ’Ž/Spring5

[JPA] ์ฆ‰์‹œ ๋กœ๋”ฉ, ์ง€์—ฐ ๋กœ๋”ฉ | FetchType.EAGER, FetchType.LAZY ์ฆ‰์‹œ ๋กœ๋”ฉ FetchType.EAGER ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฆ‰์‹œ ์กฐํšŒํ•œ๋‹ค. ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด SQL ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ ๋ฒˆ์— ์กฐํšŒํ•œ๋‹ค. ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด @ManyToOne์˜ fecth ์†์„ฑ์„ FetchType.EAGER๋กœ ์ง€์ •ํ•œ๋‹ค. @ManyToOne(fetch = FetchType.EAGER) JPA ๊ตฌํ˜„์ฒด๋Š” ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•˜๋ฉด ์กฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด SQL ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ ๋ฒˆ์— ์กฐํšŒํ•œ๋‹ค. ์ฃผ์˜์  ์ปฌ๋ ‰์…˜์„ ํ•˜๋‚˜ ์ด์ƒ ์ฆ‰์‹œ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ปฌ๋ ‰์…˜๊ณผ ์กฐ์ธํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๋กœ ๋ณด๋ฉด ์ผ๋Œ€๋‹ค ์กฐ์ธ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, A ํ…Œ์ด๋ธ”์„ N, M ๋‘ ํ…Œ์ด๋ธ”๊ณผ ์ผ๋Œ€๋‹ค ์กฐ์ธํ•˜๋ฉด SQL ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ N*M์ด ๋˜๋ฉด์„œ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ.. 2021. 8. 31.
[Spring] DI(Dependency Injection) ๊ฐœ๋… DI๋Š” Dependency Injection ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๋Š” ๋œป์œผ๋กœ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ†ต์šฉ๋˜๋Š” ๊ฐœ๋…์ด๋‹ค. '๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค'๋Š” ๊ฒƒ์€ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋„˜๊ฒจ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ์ฒด๋ฅผ ์Šค์Šค๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ œ์–ด๊ถŒ์„ (์Šคํ”„๋ง์—) ์œ„์ž„ํ•˜์—ฌ (์Šคํ”„๋ง์ด) ๋งŒ๋“ค์–ด ๋†“์€ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ณ , ๋Ÿฐํƒ€์ž„์‹œ์— ์˜์กด๊ด€๊ณ„๊ฐ€ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. SOLID ์›์น™์—์„œ O ์— ํ•ด๋‹นํ•˜๋Š” Open Closed Principle ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ ๋””์ž์ธ ํŒจํ„ด ์ค‘ ์ „๋žตํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ „๋žตํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. OCP : ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™ ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ , ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค. ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์—๋Š” ํฌ๊ฒŒ .. 2021. 5. 2.
[Spring] PSA (Portable Service Abstraction) ์Šคํ”„๋ง 3๋Œ€ ํŠน์ง•(IoC/DI, AOP, PSA) ์ค‘ PSA์— ์•Œ์•„๋ณธ๋‹ค. ๊ฐœ๋… PSA๋Š” Portable Service Abstraction์œผ๋กœ ์ผ๊ด€์„ฑ ์žˆ๋Š” ์„œ๋น„์Šค ์ถ”์ƒํ™”์ด๋‹ค. ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ์ ์šฉํ•ด ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ๋‹ค์ˆ˜์˜ ๊ธฐ์ˆ ์„ ๊ณตํ†ต์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๊ฒƒ์„ ์„œ๋น„์Šค ์ถ”์ƒํ™”๋ผ๊ณ  ํ•œ๋‹ค. ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ค ๊ธฐ์ˆ ์„ ๋‚ด๋ถ€์— ์ˆจ๊ธฐ๊ณ  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํŽธ์˜์„ฑ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์„œ๋น„์Šค ์ถ”์ƒํ™”(Service Abstraction)์ด๋ผ ํ•œ๋‹ค. ์„œ๋น„์Šค ์ถ”์ƒํ™”(Service Abstraction)๋กœ ์ œ๊ณต๋˜๋Š” ๊ธฐ์ˆ ์„ ๋‹ค๋ฅธ ๊ธฐ์ˆ  ์Šคํƒ์œผ๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ์„ฑ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์ด Portable Service Abstraction์ด๋‹ค. Spring์€ Spring Web MVC, Spring Transacti.. 2021. 5. 2.
[Spring] AOP ๊ฐœ๋… AOP(Aspect Oriented Programming) ์˜ ์•ฝ์ž๋กœ ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ๊ด€์  ์ง€ํ–ฅ์€ ์‰ฝ๊ฒŒ ๋งํ•ด ์–ด๋–ค ๋กœ์ง์„ ๊ธฐ์ค€์œผ๋กœ ํ•ต์‹ฌ์ ์ธ ๊ด€์ , ๋ถ€๊ฐ€์ ์ธ ๊ด€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๋ณด๊ณ  ๊ทธ ๊ด€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ๊ฐ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋“ˆํ™”๋ž€ ์–ด๋–ค ๊ณตํ†ต๋œ ๋กœ์ง์ด๋‚˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋ชจ๋“ˆํ™”๋ฅผ ํ†ตํ•ด ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์—์„œ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•œ๋‹ค. ๋ถ„๋ฆฌํ•œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์• ์ŠคํŽ™ํŠธ(Aspect)๋ผ๋Š” ๋…ํŠนํ•œ ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์„œ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ• ํ•ต์‹ฌ๊ธฐ๋Šฅ์—์„œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•ด์„œ Aspectํ˜•ํƒœ๋กœ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ ํ•ต์‹ฌ๊ธฐ๋Šฅ : ์—…๋ฌด ๋กœ์ง์„ ํฌํ•จํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ต์‹ฌ๊ธฐ๋Šฅ(Core Concerns) ๋ถ€๊ฐ€๊ธฐ๋Šฅ : ํ•ต์‹ฌ๊ธฐ๋Šฅ์„ ๋„์™€์ฃผ๋Š” ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ(๋กœ๊น…, ๋ณด์•ˆ ๋“ฑ)์„ ๋ถ€๊ฐ€๊ธฐ๋Šฅ(Cross-c.. 2021. 4. 18.
[Spring] Pageable ๋‹ค์ค‘ Sorting | PageableDefault | Pagination SQL์„ Pageable์„ ์ด์šฉํ•˜์—ฌ ๋‚˜ํƒ€๋‚ด๊ธฐ select * from luvket.luvkets order by status desc, created_at desc limit 0, 25; ์œ„์™€ ๊ฐ™์€ SQL๋ฌธ์„ Spring ์—์„œ Pageable์„ ์ด์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 1 2 3 4 5 6 7 8 9 @GetMapping("") public LuvketResponse search(@PageableDefault(size = 25) @SortDefault.SortDefaults({ @SortDefault(sort = "status", direction = Sort.Direction.DESC), @SortDefault(sort = "createdAt", direction = Sort.D.. 2020. 1. 9.