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

728x90

Spring๐Ÿƒ

(30)
์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜ ๋…ธํŠธ ์ •๋ฆฌ (6) : AOP AOP : ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ AOP๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ - ๋ชจ๋“  ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? - ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ vs ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ - ํšŒ์› ๊ฐ€์ž… ์‹œ๊ฐ„, ํšŒ์› ์กฐํšŒ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ์‹œ๊ฐ„ ์ธก์ • ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ผ์ผํžˆ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์žก์•„๋จน๋Š”๋‹ค ํšŒ์›๊ฐ€์ž…, ํšŒ์› ์กฐํšŒ์— ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋กœ์ง์€ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์ด๋‹ค. ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋กœ์ง๊ณผ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค์˜ ๋กœ์ง์ด ์„ž์—ฌ์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค. ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋กœ์ง์„ ๋ณ„๋„์˜ ๊ณตํ†ต ๋กœ์ง์œผ๋กœ ๋งŒ๋“ค๊ธฐ ๋งค์šฐ ์–ด๋ ต๋‹ค. ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋กœ์ง์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ชจ๋“  ๋กœ์ง์„ ์ฐพ์•„๊ฐ€๋ฉด์„œ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. AOP ์ ์šฉํ•˜๊ธฐ ๋ชฉํ‘œ : ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์„ ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ๊ณผ ๋ถ„๋ฆฌํ•˜๊ธฐ ํ•ด๊ฒฐ ํšŒ์›๊ฐ€์ž…, ํšŒ์› ์กฐํšŒ..
์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜ ๋…ธํŠธ ์ •๋ฆฌ (5) : ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  1) H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์น˜ ์œˆ๋„์šฐ ์‹คํ–‰ : h2.bat ์ฝ˜์†”์—์„œ test.mv.db ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ ์ ‘์† ์‹œ jdbc:h2:tcp://localhost/~/test ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— sql/ddl.sql ํŒŒ์ผ๋กœ sql ๋ช…๋ น์–ด ๊ด€๋ฆฌํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค. 2) ์ˆœ์ˆ˜ JDBC build.gradle ํŒŒ์ผ์— jdbc, h2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ implementation 'org.springframework.boot:spring-boot-starter-jdbc' runtimeOnly 'com.h2database:h2' ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ • ์ถ”๊ฐ€ spring.datasource.url=jdbc:h2:tcp://localhost/~/test spring.datasource...
์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜ ๋…ธํŠธ ์ •๋ฆฌ(4) : ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ - ์›น MVC ๊ฐœ๋ฐœ ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ - ์›น MVC ๊ฐœ๋ฐœ 1) ํ™ˆ ์ปจํŠธ๋กค๋Ÿฌ ๋ฐ ํ™ˆ html package hello.helloSpring.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping("/") public String home() { return "home"; } } Hello Spring ํšŒ์› ๊ธฐ๋Šฅ ํšŒ์› ๊ฐ€์ž… ํšŒ์› ๋ชฉ๋ก *์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ •์  ํŒŒ์ผ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค! ์š”์ฒญ์ด ์˜ค๋ฉด ๋จผ์ € ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์žˆ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ์—†๋Š” ๊ฒฝ์šฐ static ํŒŒ์ผ ๊ฒ€..
์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜ ๋…ธํŠธ ์ •๋ฆฌ (3) : ์Šคํ”„๋ง ๋นˆ๊ณผ ์˜์กด ๊ด€๊ณ„ ์Šคํ”„๋ง ๋นˆ๊ณผ ์˜์กด๊ด€๊ณ„ 1. ์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์˜์กด๊ด€๊ณ„ ์„ค์ • ํšŒ์› ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํšŒ์› ์„œ๋น„์Šค์™€ ํšŒ์› ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์˜์กด๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค๊ณ  ํ‘œํ˜„ - @Controller ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋‹ค๋ฉด, ์Šคํ”„๋ง ๊ตฌ๋™ ์‹œ ๊ทธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉฐ ๊ทธ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค - @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ์„ฑ์ž์— ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง ๊ตฌ๋™ ์‹œ ๊ทธ ์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค, DI ! (์ƒ์„ฑ์ž๊ฐ€ 1๊ฐœ๋งŒ ์žˆ๋‹ค๋ฉด ์ƒ๋žต๊ฐ€๋Šฅ) ~ @Component ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ์Šคํ”„๋ง ๊ตฌ๋™ ์‹œ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋œ๋‹ค (@Controller, @Service, @Repository) ** ์•„๋ฌด ํด๋ž˜์Šค์—์„œ @Component๋ฅผ ๋ถ™์—ฌ๋„..
Spring Data JPA : Auditing & HATEOAS ์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ 1. Auditing @CreatedDate private Date created; @LastModifiedDate private Date updated; @CreatedBy @ManyToOne // ๊ณ„์ • ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค private Account createdBy; @LastModifiedBy @ManyToOne private Account updatedBy; ์ ์šฉ ๋ฐฉ๋ฒ• 1. Applicaton ์ƒ๋‹จ์— @EnableJpaAuditing 2. ์—”ํ‹ฐํ‹ฐ(TimeStamped) ํด๋ž˜์Šค ์œ„์— @EntityListeners(AuditingEntityListener.class) ์ถ”๊ฐ€ cf) @MappedSuperclass : ํ•ด๋‹น ํด๋ž˜์Šค์˜ ํ•„๋“œ๊ฐ’์ด ์ƒ์†๋  ๊ฒฝ์šฐ์— ๊ทธ ํ•„..
T ์•„์นด๋ฐ๋ฏธ : JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ (3) JPA ๋‚ด๋ถ€๊ตฌ์กฐ 1. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ - ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ๋…ผ๋ฆฌ์ ์ธ ๊ฐœ๋…์ด๋‹ค ~ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค -> ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผ ์—”ํ‹ฐํ‹ฐ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ๋น„์˜์† - ์˜์† - ์ค€์˜์† - ์‚ญ์ œ 1) ๋น„์˜์† : ex) ๋ฉค๋ฒ„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ์งํ›„ ~ JPA์™€ ์•„๋ฌด ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค 2) ์˜์† : ex) ๋ฉค๋ฒ„ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜์—ฌ ์˜์†์„ฑ์„ ๋ถ€์—ฌํ•œ ์ƒํƒœ 3) ์ค€์˜์† : ex) ํšŒ์› ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๋ถ„๋ฆฌํ•œ ์ƒํƒœ 4) ์‚ญ์ œ : ex) ๊ฐ์ฒด ์‚ญ์ œ ์™œ ์˜์†์ƒํƒœ๊ฐ€ ํ•„์š”ํ•œ๊ฑธ๊นŒ? ~ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ”๋กœ DB์— ์ €์žฅํ•˜๋ฉด ํšจ์œจ์ ์ผ ํ…๋ฐ? *์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ์žฅ์  1. 1์ฐจ ์บ์‹œ 2. ๋™์ผ์„ฑ ๋ณด์žฅ 3. ํŠธ๋žœ์ ์…˜์„ ๋น„์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ 4. ๋ณ€๊ฒฝ ๊ฐ์ง€(๋”ํ‹ฐ ์ฒดํ‚น) 5. ์ง€์—ฐ ๋กœ๋”ฉ 1์ฐจ ์บ์‹œ ๊ฐ์ฒด์— ์˜์†์„ฑ์„ ๋ถ€์—ฌํ•˜๊ฒŒ..
SpringData ์ฟผ๋ฆฌ์™€ QueryDSL 1. SpringData ์ฟผ๋ฆฌ SpringData Common์˜ CrudRepository์™€ PagingAndSortingRepository ์ฟผ๋ฆฌ๊ธฐ๋Šฅ์„ ์ œ๊ณต ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋˜์–ด ์ œ๊ณต๋˜๋Š” ์ฟผ๋ฆฌ๋ช… ๊ทœ์น™ ๋ฆฌํ„ดํƒ€์ž… {์ ‘๋‘์–ด}{๋„์ž…๋ถ€}By{ํ”„๋กœํผํ‹ฐ ํ‘œํ˜„์‹}(์กฐ๊ฑด์‹)(And|Or){ํ”„๋กœํผํ‹ฐ ํ‘œํ˜„์‹}(์กฐ๊ฑด์‹) (๋งค๊ฐœ๋ณ€์ˆ˜...) ์ ‘๋‘์–ด Find, Get, Query, Count, ... ๋„์ž…๋ถ€ Distinct, First(N), Top(N) ํ”„๋กœํผํ‹ฐ ํ‘œํ˜„์‹ Person.Address.ZipCode => find(Person)ByAddress_ZipCode(...) ์กฐ๊ฑด์‹ IgnoreCase, Between, LessThan, GreaterThan, Like, Contains, ... ์ •๋ ฌ ์กฐ๊ฑด OrderBy{ํ”„๋กœ..
SpringData JPA ํŽ˜์ด์ง•๊ณผ ์ •๋ ฌ ์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ in PagingAndSortingRepository ํŽ˜์ด์ง• ํ”„๋กœ์„ธ์Šค PageRequest ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pageable์— ํŽ˜์ด์ง• ์ •๋ณด๋ฅผ ๋‹ด์•„ ๊ฐ์ฒดํ™” Pageable์„ JpaRepository๊ฐ€ ์ƒ์†๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ์— T(Entity)์™€ ํ•จ๊ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ return ์œผ๋กœ Page๊ฐ€ ์‘๋‹ต ์‘๋‹ต๋œ Page์— ๋‹ด๊ฒจ์ง„ Page ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค. Pageable : ํŽ˜์ด์ง• ์ œ๊ณต ์ธํ„ฐํŽ˜์ด์Šค Pageable ๋งŒ๋“œ๋Š” ๋ฒ• ๋”๋ณด๊ธฐ PageRequest.of(int page, int size) : 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ๊ฐœ์ˆ˜. ์ •๋ ฌ์ด ์ง€์ •๋˜์ง€ ์•Š์Œ PageRequest.of(int page, int size, Sort sort) : ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ๊ฐœ์ˆ˜, ์ •๋ ฌ ๊ด€๋ จ ..

728x90