2021-05-25(Tue)

Facts (์‚ฌ์‹ค, ๊ฐ๊ด€)

์ฝ”๋“œ์ˆจ 4์ฃผ์ฐจ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜์˜€๋‹ค.

Feelings (๋Š๋‚Œ, ์ฃผ๊ด€)

์ด์ „์— ์œค์„ ํŠธ๋ ˆ์ด๋„ˆ๋‹˜ ๋•์— repository ๊ฐ์ฒด๋กœ ๊ด€์‹ฌ์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ˆ˜์ค€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฐœ์ „ ์‹œ์ผฐ๋Š”๋ฐ, ์•„์ƒฌ๋‹˜์ด ๊ฐ•์˜์—์„œ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ๊ตฌํ˜„ํ•˜์‹œ๋Š”๊ฑธ ๋ณด๊ณ  ๊ดœํžˆ ๋ฟŒ๋“ฏํ–ˆ๋‹ค.

ํ•œํŽธ ๋‚ด๊ฐ€ ์•„์ง ์ƒ์†๊ณผ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ๋ถ€์กฑํ•œ ๊ฒƒ์„ ๋Š๊ผˆ๋‹ค. CrudRepository์™€ TaskRepository๋ฅผ ๋ชจ๋‘ ์ƒ์†ํ•œ JpaTaskRepository๋ฅผ InMemoryTaskRepository์— ๊ตฌํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ํ˜ผ๋ž€์ด ์ฐพ์•„์™”๋‹ค.

๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ˆ, ๋‘ ์ธํ„ฐํŽ˜์ด์Šค์— ์†ํ•œ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™์€๋ฐ, ๊ฐ•์˜์—์„œ๋Š” ์ผ๋ถ€๋งŒ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ  ์•„๋งˆ ๋‚ด๊ฐ€ ์ฐฉ๊ฐํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ, ๋‚ด์ผ ๋ณต์Šตํ•ด๋ด์•ผ๊ฒ ๋‹ค.

JPA๊ฐ€ ๋Šฅ์ˆ™ํ•˜์ง€ ์•Š์€๋ฐ, ์ด๋ฒˆ ์ฃผ์— ๋งŽ์ด ๋ฐฐ์›Œ์•ผ๊ฒ ๋‹ค.

Findings (๋ฐฐ์šด ์ )

์˜ค๋ฒ„๋ผ์ด๋”ฉ์— ๋Œ€ํ•œ ์˜คํ•ด

์•„์ƒฌ๋‹˜์ด Iterable์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ List๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋ฉฐ ๋‚ด๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ์ œ๋Œ€๋กœ ๋ชจ๋ฅด๋Š” ๊ฒƒ์„ ๋Š๊ปด์„œ ๋‹ค์‹œ ํ›‘์–ด๋ณด์•˜๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์— ๋Œ€ํ•ด์„œ ์˜คํ•ดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋˜์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

์ž์† ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€

  • ์ด๋ฆ„์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

  • ๋ฐ˜ํ™˜ํƒ€์ž…์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ JDK1.5๋ถ€ํ„ฐ๋Š” '๊ณต๋ณ€ ๋ฐ˜ํ™˜ํƒ€์ž…(covariant return type)'์ด ์ถ”๊ฐ€๋˜์–ด, ๋ฐ˜ํ™˜ํƒ€์ž…์„ ์ž์† ํด๋ž˜์Šค์˜ ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์กฐ๊ฑด์ด ์™„ํ™” ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜

image

์œ„ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๊ด€์‹ฌ์‚ฌ์— ๋”ฐ๋ผ layer๋ฅผ ๋‚˜๋ˆ„์—ˆ๋‹ค. ์˜์กด์„ฑ์˜ ๋ฐฉํ–ฅ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์˜์กด์„ฑ์ด ๋ฐ”๊นฅ ์›์—์„œ ์•ˆ์œผ๋กœ ํ–ฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ๋„๋ฉ”์ธ layer๋Š” ์œ„ ๊ทธ๋ฆผ์˜ ์—”ํ‹ฐํ‹ฐ์— ํ•ด๋‹นํ•œ๋‹ค.

์˜์กด ๋ฐฉํ–ฅ์„ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๋Š” ํ…Œํฌ๋‹‰์„ ๋ฐฐ์› ๋‹ค.

์ฐธ๊ณ 

JPA

Jav์˜ ORM ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ, ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ์ด๋‹ค. Spring data ํ”„๋กœ์ ํŠธ ์ค‘ JPA๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ์ธ Spring data JPA๋ฅผ ํ•™์Šตํ–ˆ๋‹ค. JPA์˜ ์—”ํ‹ฐํ‹ฐ๋Š” DB์˜ ์—”ํ‹ฐํ‹ฐ์™€ ์œ ์‚ฌํ•˜๋‹ค. ๋ณดํ†ต ํ…Œ์ด๋ธ” ํ•˜๋‚˜๊ฐ€ ๊ฐ์ฒด ํ•˜๋‚˜์™€ ๋Œ€์‘๋˜๋Š” ํ˜•ํƒœ๋‹ค.

์ฐธ๊ณ 

ํ…Œ์ŠคํŠธ๋Š”?

@DataJpaTest ๋กœ ์‹ค์ œ JPA์— ์—ฐ๊ฒฐ์‹œํ‚ค๊ฑฐ๋‚˜, ๋ชฉํ‚นํ•˜๋ฉด ๋œ๋‹ค.

ํ•œํŽธ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, save๊ฐ€ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ task์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ TaskService๊ฐ€ ์•„๋‹ˆ๋ผ Respository ํด๋ž˜์Šค์˜ ํ…Œ์ŠคํŠธ์—์„œ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•œํŽธ resources ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— application.yml ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ DB ์—ฐ๊ฒฐ์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

Affimation (์ž๊ธฐ ์„ ์–ธ)

  • ๋‚˜๋Š” ํ•˜๋ฃจํ•˜๋ฃจ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋‹ค.

Last updated