Spring/๐Ÿ”ฅ[spring]์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ์›น ํ”„๋กœ์ ํŠธ_๊ตฌ๋ฉ๊ฐ€๊ฒŒ ์ฝ”๋”ฉ๋‹จ 14

4.4.1 ๋“ฑ๋ก๊ณผ DTO๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

๊ตฌํ˜„ํด๋ž˜์Šค์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” dtoToEntity()๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. GuestbookServiceImpl ํด๋ž˜์Šค์—์„œ๋Š” ์ด๋ฅผ ํ™œ์šฉํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋˜๋Š” GuestbookDTO๋ฅผ ๋ณ€ํ™˜ํ•ด๋ณด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ธต์˜ ํ…Œ์ŠคํŠธ ํ…Œ์ŠคํŠธ ์ž‘์—…์„ ํ†ตํ•ด์„œ ํ™•์ธํ•˜๊ณ  ์ดํ›„์— ์ปจํŠธ๋กค๋Ÿฌ์™€ ์—ฐ๋™์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์ง€๋Š” ์•Š์ง€๋งŒ GuestbookDTO๋ฅผ Guestbook์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด GuestbookServiceImpl ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์‹ค์ œ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ๋กœ์šด ๋ฒˆํ˜ธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 4.5 ๋ชฉ๋ก์ฒ˜๋ฆฌ -ํ™”๋ฉด์—์„œ ํ•„์š”ํ•œ ๋ชฉ๋ก ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ DTO์ƒ์„ฑ -DTO๋ฅผ Pageable ํƒ€์ž…์œผ๋กœ ์ „ํ™˜ -ํ™”..

Part2. ๋‹จ์ผ ํ•ญ๋ชฉ ๊ฒ€์ƒ‰ ํ…Œ์ŠคํŠธ

์˜ˆ์ œ๋กœ ์ œ๋ชฉ์— 1์ด๋ผ๋Š” ๊ธ€์ž๊ฐ€ ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ๋“ค์„ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @Test public void testQuery1(){ PageRequest pageable = PageRequest.of(0,10, Sort.by("gno").descending()); QGuestbook qGuestbook = QGuestbook.guestbook; //1 String keyword="1"; BooleanBuilder builder = new BooleanBuilder(); //2 BooleanExpression expression = qGuestbook.title.contains(keyword); //3 builder.and(expression); //4 Page result = guestb..

4.3.2 ์—”ํ‹ฐํ‹ฐ์˜ ํ…Œ์ŠคํŠธ

์ด๋ฒˆ ์žฅ์˜ ์˜ˆ์ œ์—์„œ๋Š” Querydsl ์œ„์ฃผ์˜ ์˜ˆ์ œ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ ์ „์— ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. GuestbookRepositoryTests์—๋Š” 300๊ฐœ์˜ ํ…Œ์ŠคํŠธ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๋„ฃ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. package org.zerock.guestbook.repository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.zerock.guestbook.entity.Guestbook; import java.util.stream.IntStream; @SpringBootTes..

4.3.1 ๋™์ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ๋ฅผ ์ดํ•œ Querydsl ์„ค์ •

build.gradle์„ ์ˆ˜์ •ํ•ด์ค๋‹ˆ๋‹ค. compile ๊ทธ ๊ตฌ๋ฌธ ๋นผ๊ณ  sync ๋Œ๋ฆฌ๊ณ  ๋‹ค์‹œ ๋„ฃ๊ณ  ์˜†์— ์žฌ์ƒ๋ฒ„ํŠผ ๋ˆ„๋ฆ„ ์‹คํ–‰๊ฐ€๋Šฅํ•œ task๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์”๋‹ˆ๋‹ค. Unable to load class 'com.mysema.codegen.model.Type'. This is an unexpected error. Please file a bug containing the idea.log file. ์—๋Ÿฌ ๋ฐœ์ƒ https://www.inflearn.com/questions/355723/compilequerydsl-%EC%98%A4%EB%A5%98 compileQuerydsl ์˜ค๋ฅ˜ - ์ธํ”„๋Ÿฐ | ์งˆ๋ฌธ & ๋‹ต๋ณ€ ํ•™์Šตํ•˜๋Š” ๋ถ„๋“ค๊ป˜ ๋„์›€์ด ๋˜๊ณ , ๋” ์ข‹์€ ๋‹ต๋ณ€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ์งˆ๋ฌธ์ „์— ๋‹ค์Œ์„ ๊ผญ ํ™•์ธํ•ด์ฃผ์„ธ์š”.1..

4.2 ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋‚ ์งœ/์‹œ๊ฐ„ ์„ค์ •

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

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

build.gradle์— ์ด ๋‘์ค„์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค... compile์ด๋ผ๊ณ  ํ•˜์ง€ ๋ง๊ณ  implementaion์ด๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด build successfull ๋‚˜์˜ต๋‹ˆ๋‹ค. 4.1.3 ์ปจํŠธ๋กค๋Ÿฌ/ํ™”๋ฉด ๊ด€๋ จ ์ค€๋น„ list.html ์ƒ์„ฑ ์‹คํ–‰์‹œ์ผœ๋ณด๋ ค ํ–ˆ์œผ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ Cause: error: invalid source release: 17 ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •

3.4.3 ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ…œํ”Œ๋ฆฟ ์ ์šฉํ•˜๊ธฐ

์ด๋ฒˆ ์žฅ์˜ ๋งˆ์ง€๋ง‰์€ ๋‹ค์Œ ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•  ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์–ด ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://startbootstrap.com/template/simple-sidebar Simple Sidebar - Bootstrap Sidebar Template - Start Bootstrap Like our free products? Our pro products are even better! Go Pro Today! startbootstrap.com ์ฑ…์„ ๋”ฐ๋ผํ•˜๋ฉด ์ œ๋Œ€๋กœ ์•ˆ๋‚˜์˜จ๋‹ค. ๊ตฌ๋ฒ„์ „์ธ๊ฐ€๋ณด๋‹ค ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์ž˜๋‚˜์˜จ๋‹ค. 04. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์‹ค์Šตํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ…Œ์ด๋ธ”์ด ํ•˜๋‚˜๋กœ๋งŒ ๊ตฌ์„ฑ๋˜๋Š” '๋ฐฉ๋ช…๋ก'์„ ๊ตฌ์„ฑํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. 4.1 ํ”„๋กœ์ ํŠธ์˜ ์™€์ด์–ดํ”„๋ ˆ์ž„ ์™€์ด์–ดํ”„๋ ˆ์ž„์„ ์ œ์ž‘ํ•˜๋ฉด ํ™”๋ฉด์˜ URI์™€ ์ „๋‹ฌ..

3.2 Thymeleaf์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

@GetMapping์˜ value ์†์„ฑ๊ฐ’์„ '{}'๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ URL์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. exModel()์€ ๋‚˜์ค‘์— ๋‹ค์–‘ํ•˜๊ฒŒ Thymeleaf๋ฅผ ์‹ค์Šตํ•˜๊ธฐ ์œ„ํ•ด์„œ URL ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. SampleDTO ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ 20๊ฐœ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ Model์— ๋‹ด์•„์„œ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. 3.2.1 ๋ฐ˜๋ณต๋ฌธ ์ฒ˜๋ฆฌ th:each = "๋ณ€์ˆ˜: ${๋ชฉ๋ก} " 3.2.2 ์ œ์–ด๋ฌธ ์ฒ˜๋ฆฌ th:if์™€ th:unless๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋‹ค๋ฅธ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. 3.2.3 inline ์†์„ฑ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ th:inline์†์„ฑ ๊ฒฐ๊ณผ์—์„œ ์ฃผ๋ชฉํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„ 3.4 Thymeleaf์˜ ๋ ˆ์ด์•„์›ƒ - JSP์˜ include์™€ ๊ฐ™์ด ํŠน์ • ๋ถ€๋ถ„์„ ์™ธ๋ถ€ ํ˜น์€ ๋‚ด๋ถ€์—์„œ ๊ฐ€์ ธ์™€์„œ ํฌํ•จํ•˜๋Š” ํ˜•ํƒœ -..

2.6.2 @Query ์–ด๋…ธํ…Œ์ด์…˜

์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ๊ฐ„๋‹จํ•œ ์ฒ˜๋ฆฌ๋งŒ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๊ณ , @Query๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. @Query์˜ ๊ฒฝ์šฐ๋Š” ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„๊ณผ ์ƒ๊ด€์—†์ด ๋ฉ”์„œ๋“œ์— ์ถ”๊ฐ€ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋ฉ”์„œ๋“œ์— ์ถ”๊ฐ€ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด์„œ ์›ํ•˜๋Š” ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. @Query์˜ value๋Š” JPQL๋กœ ์ž‘์„ฑํ•˜๋Š”๋ฐ ํ”ํžˆ '๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ'๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ตฌ๋ฌธ๋“ค์ž…๋‹ˆ๋‹ค. @Query๋ฅผ ์ด์šฉํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์„ ๋ณ„์ ์œผ๋กœ ์ถ”์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๊ฐ€๋Šฅ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งž๋Š” ์ˆœ์ˆ˜ํ•œ SQL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ - insert, update, delete์™€ ๊ฐ™์€ select๊ฐ€ ์•„๋‹Œ DML ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ ๊ฐ์ฒด์ง€ํ–ฅ์ฟผ๋ฆฌ๋Š” ํ…Œ์ด๋ธ” ๋Œ€์‹ ์— ์—”ํ‹ฐํ‹ฐํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜๊ณ , ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ ๋Œ€์‹ ์— ํด๋ž˜์Šค์— ์„ ์–ธ๋œ ํ•„๋“œ๋ฅผ ์ด..

2.6 ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ(Query Methods)๊ธฐ๋Šฅ๊ณผ @Query

JpaRepository ์˜ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ดํŽด๋ณผ ๊ธฐ๋Šฅ์€ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ผ๋Š” ๊ธฐ๋Šฅ๊ณผ JPQL์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ์˜ˆ์ œ์—์„œ ์•„์‰ฌ์šด ์ ์€ ๋‹ค์–‘ํ•œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. Spring Data JPA์˜ ๊ฒฝ์šฐ์—๋Š”, ์ด๋Ÿฌํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. - ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ : ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์ž์ฒด๊ฐ€ ์ฟผ๋ฆฌ์˜ ๊ตฌ๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ธฐ๋Šฅ - @Query : SQL๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ - Querydsl๋“ฑ์˜ ๋™์  ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ 2.6.1 ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ๋ง ๊ทธ๋Œ€๋กœ '๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„ ์ž์ฒด๊ฐ€ ์งˆ์˜๋ฌธ'์ด ๋˜๋Š” ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ์€ ์ฃผ๋กœ 'findBy๋‚˜ getBy'๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ์— ๋”ฐ๋ผ์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ..