๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋ชฉ๋ก์ „์ฒด ๊ธ€ (146)

It's easy, if you try

[SpringBoot] ์Šคํ”„๋ง๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ ์„น์…˜ 5, 6 - ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ / JPA ๋™์  ์ฟผ๋ฆฌ (JPQL, JPA Criteria)

์ฃผ๋ฌธ ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ ์ฃผ๋ฌธ ์—”ํ‹ฐํ‹ฐ ๊ฐœ๋ฐœ ์ƒ์„ฑ ๋ฉ”์„œ๋“œ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ž‘์„ฑ @NoArgsConstructor(access = AccessLevel.PROTECTED) : ์™ธ๋ถ€์—์„œ set ํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ์˜ต์…˜ ์ฃผ๋ฌธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ (์•„๋ž˜ ์ฐธ๊ณ ) ์ฃผ๋ฌธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ฐœ๋ฐœ ์ฃผ๋ฌธ ์„œ๋น„์Šค ๊ฐœ๋ฐœ new Order(); ๋“ฑ์˜ ๊ฐ๊ฐ์˜ set์€ ์ง€์–‘ํ•˜๊ณ  createOrder ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š”๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ์šฉ์ดํ•˜๋‹ค. ์ฃผ๋ฌธ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฐธ๊ณ  : ์ฃผ๋ฌธ ์„œ๋น„์Šค์˜ ์ฃผ๋ฌธ๊ณผ ์ฃผ๋ฌธ ์ทจ์†Œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋Œ€๋ถ€๋ถ„์ด ์—”ํ‹ฐํ‹ฐ์— ์žˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ธต์€ ๋‹จ์ˆœํžˆ ์—”ํ‹ฐํ‹ฐ์— ํ•„์š”ํ•œ ์š”์ฒญ์„ ์œ„์ž„ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํŠน์„ฑ์„ ์ ๊ทน ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„๋ฉ”์ธ ๋ชจ๋ธ ํŒจํ„ด(https://martinfo..

์Šคํ”„๋ง 2023. 3. 2. 21:22
[SpringBoot] ์Šคํ”„๋ง๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ ์„น์…˜ 3, 4 - ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜/ ๊ฐœ๋ฐœ์ˆœ์„œ / ์—”ํ‹ฐํ‹ฐ, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ์„œ๋น„์Šค, ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

1) ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ ์‚ฌ์šฉ controller, web: ์›น ๊ณ„์ธต (์ปจํŠธ๋กค๋Ÿฌ๋Š” repository์— ์ ‘๊ทผ๊ฐ€๋Šฅ, ๋‹จ๋ฐฉํ–ฅ) service: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ repository: JPA๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ, ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ์‚ฌ์šฉ domain: ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋ชจ์—ฌ์žˆ๋Š” ๊ณ„์ธต, ๋ชจ๋“  ๊ณ„์ธต์—์„œ ์‚ฌ์šฉ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ domain exception repository service web ๊ฐœ๋ฐœ์ˆœ์„œ ์„œ๋น„์Šค, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์ธต ๊ฐœ๋ฐœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ ์›น๊ณ„์ธต ์ ์šฉ ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ ์—”ํ‹ฐํ‹ฐ ๊ฐœ๋ฐœ (์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์ž‘์„ฑ์€ ์„น์…˜ 2 ์ฐธ๊ณ  (https://sohee-dev.tistory.com/152)) ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ฐœ๋ฐœ ์„œ๋น„์Šค ๊ฐœ๋ฐœ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์›น๊ณ„์ธต ๊ฐœ๋ฐœ ํƒ€์ž„๋ฆฌํ”„๋กœ ํ™”๋ฉด ๊ฐœ๋ฐœ ํ™”๋ฉด๊ณผ ๊ธฐ๋Šฅ ์—ฐ๊ฒฐ API ๊ฐœ๋ฐœ ajax ํ†ต์‹  ,..

์Šคํ”„๋ง 2023. 2. 19. 20:00
[SpringBoot] ์Šคํ”„๋ง๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ ์„น์…˜ 2 - ๋„๋ฉ”์ธ ๋ถ„์„ ์„ค๊ณ„ / Entity ํด๋ž˜์Šค ์ž‘์„ฑ

๋„๋ฉ”์ธ ๋ถ„์„ ์„ค๊ณ„ 1) ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ ์‹ค์ œ ๋™์ž‘ํ•˜๋Š” ํ™”๋ฉด์„ ๋ณด๋ฉฐ ๊ธฐ๋Šฅ์„ ์„ค๊ณ„ํ•œ๋‹ค 2) ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ํ…Œ์ด๋ธ” ์„ค๊ณ„ RDB๋Š” ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์–ด์„œ ๋งคํ•‘ํ…Œ์ด๋ธ”์„ ๊ฐ€์ ธ์•ผํ•จ. (1:N / N:1) ๊ณตํ†ต์†์„ฑ์„ ๊ฐ€์ง„๊ฒฝ์šฐ ์ƒ์† ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ ์—”ํ‹ฐํ‹ฐ ๋ถ„์„ (์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ฐ€์ง€๋Š” ์†์„ฑ์„ ์ž‘์„ฑ) ์ด๋•Œ, Address ๋Š” ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… - ํšŒ์›๊ณผ ๋ฐฐ์†ก์—์„œ ์‚ฌ์šฉ๋จ. ํ…Œ์ด๋ธ” ๋ถ„์„ (ํ…Œ์ด๋ธ”์— ๋งž๋Š” ํ˜•ํƒœ๋กœ ์ž‘์„ฑ - PK/ FK ์ง€์ •, ๋„ค์ด๋ฐ ๋“ฑ) ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ณณ์„ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์œผ๋กœ ์ •ํ•ด๋ผ ์ผ๋Œ€๋‹ค ๊ด€๊ณ„์—์„œ๋Š” ๋‹ค ์ชฝ์— ์™ธ๋ž˜ํ‚ค๋ฅผ ์ง€์ • @ManyToMany ๋Š” ์‚ฌ์šฉ ์ง€์–‘ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”( CATEGORY_ITEM )์— ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๊ณ , ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. @ManyToMan..

์Šคํ”„๋ง 2023. 2. 15. 23:05
[Spring] ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜ ์„น์…˜ 5, 6, 7 - ์›ฐ์ปดํŽ˜์ด์ง€/ DB ์ ‘๊ทผ๊ธฐ์ˆ / AOP

์›ฐ์ปดํŽ˜์ด์ง€ ์šฐ์„ ์ˆœ์œ„ ์šฐ์„  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ จ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๊ณ , ์—†์œผ๋ฉด static์—์„œ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— @GetMapping("/") static ๋‚ด์˜ ์›ฐ์ปดํŽ˜์ด์ง€๋กœ ์„ค์ •ํ•œ ํŒŒ์ผ html ์ด๋ฆ„ action url๋กœ controller์˜ @PostMapping์œผ๋กœ ๋งคํ•‘๋œ๋‹ค. thymeleaf # ์ด๋ฆ„ th: ๋กœ ์‹œ์ž‘ํ•˜๋Š”๊ฒŒ ํƒ€์ž„๋ฆฌํ”„ ๋ฌธ๋ฒ• ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  1. H2 DB๋ฅผ ์ด์šฉํ•œ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๊ฐœ๋ฐœ์ด๋‚˜ ํ…Œ์ŠคํŠธ ์šฉ๋„๋กœ ๊ฐ€๋ณ๊ณ  ํŽธ๋ฆฌํ•œ DB, ์›น ํ™”๋ฉด ์ œ๊ณต 2. JDBC ๊ณผ๊ฑฐ์— ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ์‹ ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ @SpringBootTest: ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค. @Transactional : ํ…Œ์ŠคํŠธ ์‹œ์ž‘ ์ „์— ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด rollback ํ•ด์ค€๋‹ค. (๋‹ค์Œ ํ…Œ..

์Šคํ”„๋ง 2023. 2. 7. 00:25
[Spring] ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜ ์„น์…˜ 3 - ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต ๊ตฌ์กฐ / ๋„๋ฉ”์ธ, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ์ž‘์„ฑ

๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ ์ •๋ฆฌ ์ผ๋ฐ˜์ ์ธ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต ๊ตฌ์กฐ ์ปจํŠธ๋กค๋Ÿฌ: ์›น MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ•  ์„œ๋น„์Šค: ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผ, ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ ๋„๋ฉ”์ธ: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ฐ์ฒด ์˜ˆ) ํšŒ์›, ์ฃผ๋ฌธ, ์ฟ ํฐ ๋“ฑ๋“ฑ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ๋จ. ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๊ฐ€ ์„ ์ •๋˜์ง€ ์•Š์•˜์„๋•, ์šฐ์„  Repository๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ƒ์„ฑํ•˜์—ฌ ์ถ”ํ›„์— ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค. 1. ๋„๋ฉ”์ธ , ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ž‘์„ฑ โญ๏ธ Optional Java8์— ๋„์ž…๋จ. null ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜. ์‚ฌ์šฉ๋ฐฉ๋ฒ• ์˜ˆ์‹œ) Optional member : Optional ๊ฐ์ฒด ์„ ์–ธ Optional.ofNullable(store.get(id)); : null์ด์–ด๋„ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜ ..

์Šคํ”„๋ง 2023. 1. 19. 00:18
[Spring] ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜ ์„น์…˜ 1,2 - ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ… / ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ / ์›น ๊ฐœ๋ฐœ ๊ธฐ์ดˆ(๊ตฌ์กฐ)

ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์…‹ํŒ… (springboot) build.gradle > repositories - mavenCentral : ๋ฉ”์ด๋ธ ๊ณต๊ฐœ ์‚ฌ์ดํŠธ์—์„œ ๊ด€๋ จ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„๋ผ. .gitignore : ๊ธฐ๋ณธ์ ์œผ๋กœ ์…‹ํŒ… ๋˜์–ด์žˆ์Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์Šคํ”„๋ง๋ถ€ํŠธ๋Š” tomcat ์„œ๋ฒ„ ์„ค์น˜ ์•ˆํ•ด๋„ ๋œ๋‹น ์‹ค๋ฌด์—์„œ๋Š” system.out.println ๋Œ€์‹  log ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค !! (๋กœ๊ทธ ๋ ˆ๋ฒจ๋ณ„๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด) ํ…Œ์ŠคํŠธ ๊ด€๋ จ java์—์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์‹œ ์ฃผ๋กœ junit์„ ์ด์šฉํ•œ๋‹ค. (์ตœ๊ทผ์— junit5๊ฐ€ ๋‚˜์˜ด) - ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ assertj: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ spring-test: ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ง€์› View ํ™˜๊ฒฝ์„ค์ • src>resources>static> index.h..

์Šคํ”„๋ง 2023. 1. 12. 21:45