2021-03-25(Thu)

ํ•ญ๋ชฉ

๋‚ด์šฉ

ํ•™์Šต ๋‚ ์งœ

2021-03-25(๋ชฉ)

ํ•™์Šต ์‹œ๊ฐ„

11:00~23:00

ํ•™์Šต ๋ฒ”์œ„ ๋ฐ ์ฃผ์ œ

์Šคํ”„๋ง๋ถ€ํŠธ

ํ•™์Šต ๋ชฉํ‘œ

์Šคํ”„๋ง๋ถ€ํŠธ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ํ•™์Šตํ•œ๋‹ค.

๋™๋ฃŒ ํ•™์Šต ๋ฐฉ๋ฒ•

-

์ƒ์„ธ ํ•™์Šต ๋‚ด์šฉ

JPA?

ํ˜„๋Œ€์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDB, Relational Database)๋Š” ๋น ์งˆ ์ˆ˜ ์—†๋Š” ์š”์†Œ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ๊ฐ์ฒด๋ฅผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡๋ณด๋‹ค ์ค‘์š”ํ•˜๋‹ค.

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ณ„์™ํ•ด์„œ ์›น ์„œ๋น„์Šค์˜ ์ค‘์‹ฌ์ด ๋˜๋ฉด์„œ ๋ชจ๋“  ์ฝ”๋“œ๋Š” SQL ์ค‘์‹ฌ์ด ๋˜์–ด๊ฐ€๋ฉฐ, ํ˜„์—… ํ”„๋กœ์ ํŠธ ๋Œ€๋ถ€๋ถ„์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ณด๋‹ค SQL๋กœ ๊ฐ€๋“ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ SQL๋งŒ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ๊ทธ๋ž˜์„œ ๊ฐ ํ…Œ์ด๋ธ”๋งˆ๋‹ค ๊ธฐ๋ณธ์ ์ธ CRUD SQL์„ ๋งค๋ฒˆ ์ƒ์„ฑํ•ด์•ผ ํ–ˆ๋‹ค. ์•„๋ฌด๋ฆฌ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์•„๋ฆ„๋‹ต๊ฒŒ ์„ค๊ณ„๋ฅผ ํ•ด๋„ SQL์„ ํ”ผํ•  ์ˆ˜ ์—†๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋‹ค์Œ ๋‘ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  1. ๋ฐ˜๋ณต ์ž‘์—…

    ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ์žˆ๋Š”๋ฐ ์ด ํ…Œ์ด๋ธ”์˜ ๋ช‡ ๋ฐฐ์˜ SQL์„ ๋งŒ๋“ค๊ณ  ์œ ์ง€๋ณด์ˆ˜ ํ•ด์•ผํ•˜๋งŒ ํ•œ๋‹ค.

  2. ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜

    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ์ง€์— ์ดˆ์ ์ด ๋งž์ถฐ์ง„ ๊ธฐ์ˆ ์ด๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธฐ๋Šฅ๊ณผ ์†์„ฑ์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ƒ์†, 1:N ๋“ฑ ๋‹ค์–‘ํ•œ ๊ฐ์ฒด ๋ชจ๋ธ๋ง์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋Š” ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์€ ์ ์  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง์—๋งŒ ์ง‘์ค‘ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  SQL์— ์ข…์†์ ์ธ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

JPA๋Š” ์œ„ ๋‘ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ๋‹ค. 1) ๋ฐ˜๋ณต์„ ์ค„์ด๊ณ  2) ์ค‘๊ฐ„์—์„œ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ผ์น˜๋ฅผ ์‹œ์ผœ์ค€๋‹ค.

Spring Data JPA

JPA๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ์„œ ์ž๋ฐ” ํ‘œ์ค€๋ช…์„ธ์„œ์ด๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์ธ JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Hibernate, Eclipse Link ๋“ฑ์ด ์žˆ์ง€๋งŒ, Spring์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ด ๊ตฌํ˜„์ฒด๋“ค์„ ์ง์ ‘ ๋‹ค๋ฃจ์ง„ ์•Š๋Š”๋‹ค. ๊ตฌํ˜„์ฒด๋“ค์„ ํ•œ๋ฒˆ ๋” ์ถ”์ƒํ™”์‹œํ‚จ Spring Data JPA๋ผ๋Š” ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด์„œ JPA ๊ธฐ์ˆ ์„ ๋‹ค๋ฃฌ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์•„๋ž˜ ๋‘ ์ด์ ์„ ๊ฐ€์ง„๋‹ค.

  • ๊ตฌํ˜„์ฒด ๊ต์ฒด์˜ ์šฉ์ด์„ฑ ex) Redis ํด๋ผ์ด์–ธํŠธ๋ฅผ Jedis์—์„œ Lettuce๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ

  • ์ €์žฅ์†Œ ๊ต์ฒด์˜ ์šฉ์ด์„ฑ(๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์™ธ์— ๋‹ค๋ฅธ ์ €์žฅ์†Œ๋กœ ์‰ฝ๊ฒŒ ๊ต์ฒด) ex) ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์•„์ ธ์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋Š” ๊ฐ๋‹น์ด ๋˜์ง€ ์•Š์„ ๋•Œ MongoDB๋กœ ๊ต์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด Spring Data JPA์—์„œ Spring Data MongoDB๋กœ ์˜์กด์„ฑ๋งŒ ๊ต์ฒดํ•˜๋ฉด ๋จ.

์‹ค๋ฌด์—์„œ์˜ JPA

์‹ค๋ฌด์—์„œ๋Š” ๋†’์€ ๋Ÿฌ๋‹ ์ปค๋ธŒ ๋•Œ๋ฌธ์— JPA๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณค ํ•œ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‘˜ ๋‹ค ์ดํ•ดํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์†๋„ ์ด์Šˆ๋Š” ํ•ด๊ฒฐ์ฑ…์ด ๋งŽ์•„์„œ ์ž˜ ์“ฐ๋ฉด ์ถฉ๋ถ„ํžˆ ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ๋งŒํผ์˜ ํผํฌ๋จผ์Šค๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

Repository

Respository๋Š” ibatis๋‚˜ MyBatis ๋“ฑ์—์„œ๋Š” Dao๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” DB Layer ์ ‘๊ทผ์ž์ด๋‹ค. JPA์—์„  Repository๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹จ์ˆœํžˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑ ํ›„, JpaRepository<Entity ํด๋ž˜์Šค, PK ํƒ€์ž…>์„ ์ƒ์†ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์ธ CRUD ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

์ฃผ์˜ ํ• ์ 

  • @Repository๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๋„ ์—†๋‹ค.

  • Entity ํด๋ž˜์Šค์™€ ๊ธฐ๋ณธ Entity Repository๋Š” ํ•จ๊ป˜ ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค. Entity ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ Repository ์—†์ด๋Š” ์ œ๋Œ€๋กœ ์—ญํ• ์„ ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

์ƒ์„ฑ์ž vs ๋นŒ๋” ํด๋ž˜์Šค

๋นŒ๋” ํด๋ž˜์Šค๋Š” @Builder๋ฅผ ํ†ตํ•ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ์„ฑ์ž๋‚˜ ๋นŒ๋”๋‚˜ ์ƒ์„ฑ ์‹œ์ ์— ๊ฐ’์„ ์ฑ„์›Œ์ฃผ๋Š” ์—ญํ• ์€ ๋˜‘๊ฐ™๋‹ค. ๋‹ค๋งŒ, ์ƒ์„œ์ž๋Š” ์ง€๊ธˆ ์ฑ„์›Œ์•ผ ํ•  ํ•„๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํžˆ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋ฐ˜๋ฉด ๋นŒ๋”๋Š” ์–ด๋Š ํ•„๋“œ์— ์–ด๋–ค ๊ฐ’์„ ์ฑ„์›Œ์•ผํ• ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ณผ ๋”ํ‹ฐ ์ฒดํ‚น

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ์ด๋‹ค. ์ผ์ข…์˜ ๋…ผ๋ฆฌ์  ๊ฐœ๋…์ด๋ฉฐ, JPA์˜ ํ•ต์‹ฌ ๋‚ด์šฉ์€ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ํฌํ•จ๋˜์–ด ์žˆ๋ƒ ์•„๋‹ˆ๋ƒ๋กœ ๊ฐˆ๋ฆฐ๋‹ค. JPA์˜ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ(Spring Data JPA๋ฅผ ์“ด๋‹ค๋ฉด ๊ธฐ๋ณธ ์˜ต์…˜์ž„) ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์ด ๋ฐ์ดํ„ฐ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์œ ์ง€๋œ ์ƒํƒœ์ด๋‹ค.

์ด ์ƒํƒœ์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๋Š” ์‹œ์ ์— ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋ณ€๊ฒฝ๋ถ„์„ ๋ฐ˜์˜ํ•œ๋‹ค. ์ฆ‰, Entity ๊ฐ์ฒด์˜ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ณ„๋„๋กœ Update ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆด ํ•„์š”๊ฐ€ ์—…๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ฐœ๋…์„ ๋”ํ‹ฐ ์ฒดํ‚น(Dirty Checking)์ด๋ผ๊ณ  ํ•œ๋‹ค.

JPA Auditing์œผ๋กœ ์ƒ์„ฑ์‹œ๊ฐ„/์ˆ˜์ •์‹œ๊ฐ„ ์ž๋™ํ™”ํ•˜๊ธฐ

๋ณดํ†ต ์—”ํ‹ฐํ‹ฐ์—๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ์ƒ์„ฑ์‹œ๊ฐ„๊ณผ ์ˆ˜์ •์‹œ๊ฐ„์„ ํฌํ•จํ•œ๋‹ค. ์œ ์ง€๋ณด์ˆ˜์— ์œ ์šฉํ•œ ์ •๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฌธ์ œ๋Š” ๋งค๋ฒˆ DB์— ์‚ฝ์ž…ํ•˜๊ธฐ ์ „, ๊ฐฑ์‹ ํ•˜๊ธฐ ์ „์— ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋ฅผ ๋“ฑ๋ก/์ˆ˜์ •ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์ €๊ธฐ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

public void savePosts() {
  ...
  posts.setCreateDate(new LocalDate());
  postsRepository.save(posts);
  ...
}

์ด๋Ÿฐ ์ค‘๋ณต์€ JPA Auditing์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

LocalDate ์‚ฌ์šฉ

Java8๋ถ€ํ„ฐ LocalDate์™€ LocalDateTime์ด ๋“ฑ์žฅํ–ˆ๋‹ค. ๊ธฐ์กด Date ํƒ€์ž…์˜ ๋ฌธ์ œ์ ์„ ๊ณ ์นœ ํƒ€์ž…์ด๋ผ Java8์ด๋ฉด ๋ฌด์กฐ๊ฑด ์จ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์ฐธ๊ณ ๋กœ ๊ธฐ์กด Date ํƒ€์ž…์˜ ๋ฌธ์ œ์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ๋ถˆ๋ณ€(๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ) ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค.

    ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์–ธ์ œ๋“  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. Calendar๋Š” ์›”(Month) ๊ฐ’ ์„ค๊ณ„๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค.

    10์›”์„ ๋‚˜ํƒ€๋‚ด๋Š” Calendar.OCTOBER์˜ ์ˆซ์ž ๊ฐ’์€ '9'์ด๋‹ค.

Spring ์›น ๊ณ„์ธต์— ๋Œ€ํ•ด

Spring์€ ์•„๋ž˜ 5๊ฐ€์ง€ ๊ณ„์ธต์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

  • Web Layer

    • ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ JSP/Freemarker ๋“ฑ์˜ ๋ทฐ ํ…œํ”Œ๋ฆฟ ์˜์—ญ์ด๋‹ค.

    • ์ด์™ธ์—๋„ ํ•„ํ„ฐ, ์ธํ„ฐ์…‰ํ„ฐ, ์ปจํŠธ๋กค๋Ÿฌ ์–ด๋“œ๋ฐ”์ด์Šค ๋“ฑ ์™ธ๋ถ€ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์˜์—ญ์„ ๋‹ค๋ฃฌ๋‹ค.

  • Service Layer

    • @Service์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค ์˜์—ญ์ด๋‹ค.

    • ์ผ๋ฐ˜์ ์œผ๋กœ Controller์™€ Dao์˜ ์ค‘๊ฐ„ ์˜์—ญ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

    • @Transactional์ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์˜์—ญ์ด๊ธฐ๋„ ํ•œ๋‹ค.

  • Repository Layer

    • Database์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•˜๋Š” ์˜์—ญ์ด๋‹ค.

  • Dtos

    • Dto(Data Transfer Object) ๊ณ„์ธต ๊ฐ„์— ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ ๊ฐ์ฒด๋ฅผ ์ด์•ผ๊ธฐํ•œ๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด ๋ทฐ ํ…œํ”Œ๋ฆฟ ์—”์ง„์—์„œ ์‚ฌ์šฉ๋  ๊ฐ์ฒด๋‚˜ Repository Layer์—์„œ ๊ฒฐ๊ณผ๋กœ ๋„˜๊ฒจ์ค€ ๊ฐ์ฒด ๋“ฑ์ด ์ด๋“ค์„ ์ด์•ผ๊ธฐํ•œ๋‹ค.

  • Domain model Layer

    • ๋„๋ฉ”์ธ์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๊ฐœ๋ฐœ ๋Œ€์ƒ์„ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋™์ผํ•œ ๊ด€์ ์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ์ˆœํ™”์‹œํ‚จ ๊ฒƒ์„ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ด์•ผํ•  ๊ณณ์ด๋‹ค.

์ฐธ๊ณ 

Entity ํด๋ž˜์Šค๋ฅผ Request/Response ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ์™ค๊นŒ? Entity ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋งž๋‹ฟ์€ ํ•ต์‹ฌ ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Entity ํด๋ž˜์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜๊ณ , ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค. ํ™”๋ฉด ๋ณ€๊ฒฝ์€ ์•„์ฃผ ์‚ฌ์†Œํ•œ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์ธ๋ฐ, ์ด๋ฅผ ์œ„ํ•ด ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋œ Entity ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ํฐ ๋ณ€๊ฒฝ์ด๋‹ค. ๋ฐ˜๋ฉด Request์™€ Response์šฉ Dto๋Š” View๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค๋ผ ์ •๋ง ์ž์ฃผ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค.

์„œ๋ฒ„ ํ…œํ”Œ๋ฆฟ ์—”์ง„๊ณผ ๋จธ์Šคํ…Œ์น˜(Mustache)

์›น ๊ฐœ๋ฐœ์—์„œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋ž€, ์ง€์ •๋œ ํ…œํ”Œ๋ฆฟ ์–‘์‹๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ฉ์ณ์ ธ HTML ๋ฌธ์„œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ด์•ผ๊ธฐํ•œ๋‹ค. JSP, Freemarker ๋“ฑ์˜ ์„œ๋ฒ„ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋‚˜ ๋ฆฌ์•กํŠธ, ๋ทฐ์˜ View ํŒŒ์ผ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ํ…œํ”Œ๋ฆฟ ์—”์ง„๋“ค์ด ์—ฌ๊ธฐ์— ์†ํ•œ๋‹ค.

๋‘˜ ๋ชจ๋‘ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ง€์ •๋œ ํ…œํ”Œ๋ฆฟ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ HTML์„ ์ƒ์„ฑํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋‹ค.

์„œ๋ฒ„ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์ด์šฉํ•ด์„œ ํ™”๋ฉด์„ ์ƒ์„ฑํ•œ๋‹ค๋ฉด, ์„œ๋ฒ„์—์„œ Java ์ฝ”๋“œ๋กœ ๋ฌธ์ž์—ด์„ ๋งŒ๋“  ๋’ค ์ด ๋ฌธ์ž์—ด์„ HTML๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด HTML์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ System.out.println("test"); ๋ฅผ ์‹คํ–‰ํ•  ๋ฟ์ด๋‹ค. ์ด ๋•Œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด์ผ ๋ฟ์ด๋‹ค.

<script type="text/javascript">
โ€‹
$(document).ready(function() {
  if(a=="1") {
    <%
      System.out.println("test");
    %>
  }
}

๋ฐ˜๋ฉด์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ € ์œ„์—์„œ ์ž‘๋™ํ•œ๋‹ค. ์•ž์—์„œ ์ž‘์„ฑ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์žฅ์†Œ๋Š” ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ๋ธŒ๋ผ์šฐ์ €์ด๋‹ค. ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™๋  ๋•Œ๋Š” ์„œ๋ฒ„ ํ…œํ”Œ๋ฆฟ ์—”์ง„์˜ ์†์„ ๋ฒ—์–ด๋‚˜ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค.

๋จธ์Šคํ…Œ์น˜๋Š” ์ˆ˜๋งŽ์€ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฐ€์žฅ ์‹ฌํ”Œํ•œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋‹ค.

  • JSP, Velocity: ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋‹ค.

  • Freemarker: ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ๋Š” ๋„ˆ๋ฌด ๊ณผํ•˜๊ฒŒ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค. ๋•Œ๋ฌธ์— ์ˆ™๋ จ๋„๊ฐ€ ๋‚ฎ์œผ๋ฉด Freemarker ์•ˆ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ถ”๊ฐ€๋  ํ™•๋ฅ ์ด ๋†’๋‹ค.

  • Thymeleaf: ์Šคํ”„๋ง ์ง„์˜์—์„œ ์ ๊ทน์ ์œผ๋กœ ๋ฐ€๊ณ  ์žˆ์ง€๋งŒ ๋ฌธ๋ฒ•์ด ์–ด๋ ต๋‹ค.

  • ๋จธ์Šคํ…Œ์น˜: ๋ฌธ๋ฒ•์ด ๋‹ค๋ฅธ ํ…œํ”Œ๋ฆฟ ์—”๋นˆ๋ณด๋‹ค ์‹ฌํ”Œํ•˜๊ณ , ๋กœ์ง์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์„œ View์˜ ์—ญํ• ๊ณผ ์„œ๋ฒ„์˜ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋œ๋‹ค.

์ฐธ๊ณ 

๊ทœ๋ชจ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ์˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ๋Š” FK์˜ ์กฐ์ธ, ๋ณต์žกํ•œ ์กฐ๊ฑด ๋“ฑ์œผ๋กœ ์ธํ•ด ์ด๋Ÿฐ Entity ํด๋ž˜์Šค๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ ์กฐํšŒ์šฉ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ querydsl, jooq, MyBatis ๋“ฑ์ด ์žˆ๋”ฐ. ์กฐํšŒ๋Š” ์ด 3๊ฐ€์ง€ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด ์กฐํšŒํ•˜๊ณ , ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ ๋“ฑ์€ SpringDataJpa๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ํ•œ๋‹ค.

์ด ์ค‘ ์•„๋ž˜ ์ด์œ ์—์„œ Querydsl์„ ์ถ”์ฒœํ•œ๋‹ค.

  1. ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค.

    ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฉ”์†Œ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜คํƒ€๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ปฌ๋Ÿผ๋ช…์„ ๋ช…์‹œํ•  ๊ฒฝ์šฐ IDE์—์„œ ์ž๋™์œผ๋กœ ๊ฒ€์ถœ๋œ๋‹ค. ์ด ์žฅ์ ์€ Jooq์—์„œ๋„ ์ง€์›ํ•˜์ง€๋งŒ, MyBatis์—์„œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  2. ๊ตญ๋‚ด ๋งŽ์€ ํšŒ์‚ฌ์—์„œ ์‚ฌ์šฉ ์ค‘์ด๋‹ค.

    ์ฟ ํŒก, ๋ฐฐ๋ฏผ ๋“ฑ JPA๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํšŒ์‚ฌ์—์„œ๋Š” Querydsl์„ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉ ์ค‘์ด๋‹ค.

  3. ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งŽ๋‹ค.

    2๋ฒˆ ์žฅ์ ๊ณผ ์ด์–ด์ง€๋Š” ๊ฒƒ.

ํ•™์Šต ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ์ดํ‰

์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ํ•™์Šตํ•˜์ง€ ์•Š๊ณ , ์ž๋ฐ”๋ฅผ ํ•™์Šตํ•˜์ง€ ์•Š๊ณ  ์ฑ…์„ ๋”ฐ๋ผ์น˜๋Š”๋ฐ๋„ ์ƒ๊ฐ๋ณด๋‹ค ์ž˜ ์ดํ•ด๊ฐ€ ๋œ๋‹ค. ๊ทธ๊ฐ„ ํ•™์Šตํ•œ ๊ฒƒ ๋•๋ถ„์— ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๊ธด ํ–ˆ๋‚˜๋ณด๋‹ค.

๋”๋ถˆ์–ด์„œ ์Šคํ”„๋ง์„ ์“ฐ๋Š” ๊ณณ์—๋Š” ๋‹น์žฅ ์ทจ์—…ํ•  ์ˆ˜๋Š” ์—†๊ฒ ๋‹ค๋Š” ์˜ˆ๊ฐ์ด ๊ฐ•ํ•˜๊ฒŒ ๋“ค์—ˆ๋‹ค. ์ผ๋‹จ ๋กœ๊ทธ๋ฅผ ์ฝ๋Š” ๊ฒƒ๋„ ์–ด๋ ต๊ตฌ๋งŒ, ๋ ˆ์ผ์ฆˆ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์นœ์ ˆํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์˜€๋Š”์ง€ ๋‹ค์‹œ๊ธˆ ๋Š๋‚€๋‹ค.

๋‹ค์Œ ํ•™์Šต ๊ณ„ํš

  • ์Šคํ”„๋ง๋ถ€ํŠธ ํ•™์Šต

Last updated