[Spring Data] Spring Data JDBC๋ฅผ ์ด์šฉํ•œ ๋‹ค์–‘ํ•œ ID ์ „๋žต๊ณผ ์ˆ˜๋™ ID ์ „๋žต ๊ตฌํ˜„์‹œ ์ฃผ์˜์ 

๋ฐ˜์‘ํ˜•

์ตœ๊ทผ Kotlin + Spring Boot + Spring Data JDBC ์กฐํ•ฉ์œผ๋กœ ํ•ด๋‹น ๊ธฐ์ˆ  ์Šคํƒ์„ ์ด์šฉํ•ด DDD ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์— ๋Œ€ํ•ด ๋ณต์Šตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์—…์—์„œ Python์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ Spring์— ๋Œ€ํ•œ ์ง€์‹์ด ๋งŽ์ด ๋–จ์–ด์กŒ๋‹ค๋Š” ๊ฒƒ์„ ๋Š๊ผˆ๋Š”๋ฐ์š”.

 

ํ‰์†Œ Spring Data JPA๋ผ๋Š” ORM์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ธฐ๋ฐ˜์˜ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์—ˆ์—ˆ๋Š”๋ฐ, DDD๋ฅผ ์ ‘ํ•˜๊ฒŒ ๋˜๋ฉด์„œ Command์™€ Query ๋ถ„๋ฆฌ์— ๋Œ€ํ•œ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ซ๊ณ  ORM์ด ์•„๋‹Œ ๊ฐ€๊ธ‰์  JDBC์™€ ๊ฐ™์€ DB API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žฆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ JPA๊ฐ€ ์•„๋‹Œ Spring Data JDBC๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋ฉด ๊ฐ Row์— ํ•ด๋‹นํ•˜๋Š” ๊ณ ์œ ๊ฐ’์ธ ID๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต์ด๋ผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” Auto Increment ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ฒ ์ง€๋งŒ ๋‚ด๊ฐ€ ์ง์ ‘ ๊ณ ์œ ์˜ ID๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์‹ถ์€ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์ง์ ‘ ์ด ๋งค์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์„œ ์ ์šฉํ•˜์˜€๋Š”๋ฐ, ๊ณต๊ต๋กญ๊ฒŒ๋„ Spring Data์—์„œ ์ œ๊ณตํ•˜๋Š” Auditing๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ๊ฒ€์ƒ‰์„ ํ•˜๋˜ ์ค‘ ์ด๋ช…ํ—Œ๋‹˜์˜ ์šฐ์•„ํ•œ ํ…Œํฌ ์„ธ๋ฏธ๋‚˜ ๋ฅผ ๋ณด๊ฒŒ๋œ ๋’ค ์ด ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ID ์ „๋žต

Hibernate, JPA์™€ ๊ฐ™์€ ORM์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด @GeneratedValue๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” IDENTITY๋‚˜ Sequence ๋“ฑ์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ € ๋˜ํ•œ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉ์„ ํ–ˆ์—ˆ๊ณ , ๊ฐ€์žฅ ๊ฐ„ํŽธํ•˜๋ฉด์„œ ์ ‘๊ทผํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. 

 

์ด์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ–‰(row)์˜ ๊ณ ์œ  ๊ฐ’์„ ์šฐ๋ฆฌ๋Š” ID๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ID๋Š” Auto-increment์ฒ˜๋Ÿผ ํŠน์ • ์ˆซ์ž์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ํŠน์ • ๊ฐ’๋งŒํผ ์ฆ๊ฐ€ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด ์™ธ์—๋„ ์ˆซ์ž๋งŒ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ๋ถ€์กฑํ•œ ๋ฐ์ดํ„ฐ๋Ÿ‰์ด๊ฑฐ๋‚˜ ์ˆœ์„œ์Œ์„ ๊ฐ€์ง€์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋กœ ๋ณด์กดํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ, UUID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ผ๋ฐ˜ ์ˆซ์ž๋งŒ์œผ๋ก  ๋ฐ์ดํ„ฐ๋Ÿ‰์ด ๋ชจ์ž๋ผ์ง€๋งŒ ์ˆœ์„œ์Œ์„ ๋ณด์กดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด UULD๋ฅผ ์ด์šฉํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ID๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ  ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ID ์ „๋žต์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

Spring Data JDBC์—์„œ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ID ์ „๋žต

๊ณต๊ต๋กญ๊ฒŒ๋„ Spring Data JDBC์—์„œ๋Š” @GeneratedValue ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GeneratedValue๋Š” ORM์—์„œ DDL์„ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

Auto-increment

์•ž์„œ ์—ฌ๋Ÿฌ๋ฒˆ ๋งํ–ˆ๋“ฏ, Auto-increment๋Š” DB ํ•„๋“œ์— auto increment๋ฅผ ๊ฑธ์–ด๋‘๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค. ์ด ์ „๋žต์„ ์ด์šฉํ•  ๋•Œ๋Š” Spring์˜ init sql์ด๋‚˜ Flyway, Lighthouse์™€ ๊ฐ™์€ DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด DDL์— auto increment sql์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

Spring์—์„œ ์ œ๊ณตํ•˜๋Š” init mode๋Š” Spring Application์ด Load๋˜์—ˆ์„ ๋•Œ SQL ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์„ค์ • ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•œ ํ›„ 

classpath:resources/sql/schema.sql ๊ฒฝ๋กœ์— DDL SQL ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด DDL ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

์ด ์ฝ”๋“œ๋Š” PostgreSQL์„ ์˜ˆ์‹œ๋กœ ํ•˜์—ฌ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. schema.sql์—๋Š” DDL ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ , Application์„ ์‹คํ–‰ํ•˜๋ฉด ์ด์ œ Auto-increment๋กœ post ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ ๊ฐ’์ด ๋งค๊ฒจ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

Entity ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” DDL ์ฝ”๋“œ์—์„œ ์ •์˜ํ•œ ์ปฌ๋Ÿผ ์ด๋ฆ„์„ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด์ค๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ @Column ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด์„œ ์—ฐ๊ฒฐํ•  ์ปฌ๋Ÿผ ์ด๋ฆ„์„ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

UUID Generate ๋ฐ ์ˆ˜๋™ ์ „๋žต

Hibernate์—์„œ๋Š” org.hibernate.id.UUIDGenerator ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ Insert ๋ฐœ์ƒ์‹œ ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ UUID๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Spring Data JDBC์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”?

 

๊ฐ„๋‹จํ•˜๊ฒŒ UUID๋Š” Java์—์„œ ์ œ๊ณตํ•˜๋Š” UUID ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. UUID ํด๋ž˜์Šค์˜ ์ •์  ๋ฉ”์„œ๋“œ์ธ randomUUID๋ฅผ Entity ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ๋„ฃ์–ด์ค˜๋„ ๊ฐ์ฒด ์ƒ์„ฑ ๋•Œ ID๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์–ด์ฐŒ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์œ„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด ๋ฐ์ดํ„ฐ์— Spring Data์˜ @CreatedDate๋‚˜ @LastModifiedDate์™€ ๊ฐ™์€ Audit์„ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์œ„์ฒ˜๋Ÿผ createdAt๊ณผ updatedAt๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, ์ฟผ๋ฆฌ๋Š” UPDATE ์ฟผ๋ฆฌ๋กœ ๋™์ž‘ํ•˜๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. save ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋ฟ์ธ๋ฐ INSERT ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹Œ UPDATE ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค ์™œ ๊ทธ๋Ÿฐ ๊ฒƒ์ผ๊นŒ์š”?

 

 

 

Spring Data JDBC Persistable ์ธํ„ฐํŽ˜์ด์Šค

์—ฌ๊ธฐ์„œ Spring Data JDBC์—์„œ ์ œ๊ณตํ•˜๋Š” save, insert, update ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. insert์™€ update๋Š” ๊ฐ๊ฐ ์ฟผ๋ฆฌ๋ฅผ INSERT ์ฟผ๋ฆฌ๋ฅผ, UPDATE ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ง€๋งŒ save ๋ฉ”์„œ๋“œ๋Š” ID ๊ฐ’๊ณผ Persistable์˜ isNew ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

 

์œ„ ์ฝ”๋“œ๋Š” JDBC์˜ CrudRepository์˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ ์ค‘ save ๋ฉ”์„œ๋“œ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. JDBC์˜ CrudRepository๋Š” JdbcAggregateTemplate ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ save ๋ฉ”์„œ๋“œ๋Š” Entity์˜ isNew ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ INSERT ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ• ์ง€, UPDATE ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ• ์ง€๋ฅผ ์„ ํƒํ•˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์–ด? ๊ทธ๋Ÿฌ๋ฉด save ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , insert ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ๋˜์ง€ ์•Š๋‚˜์š”?

 

๊ทธ๋ž˜์„œ ์ง์ ‘ insert ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ ๋ฐ์ดํ„ฐ๋Š” ์ถ”๊ฐ€๋˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, created_at์—๋Š” ๋‚ ์งœ๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ isNew์˜ ์˜ํ–ฅ์ด์ง€ ์•Š๋‚˜ ์‹ถ๋„ค์š”.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด isNew ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?

 

Spring Data์—๋Š” IsNewStrategy๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด Entity ๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด์ฃผ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์˜์† ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌํ˜„์ฒด๋กœ PersistenceEntityIsNewStrategy ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ , ์ด ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” isNew์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

 

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, isNew๋Š” valueLookup.apply ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Id ์–ด๋…ธํ…Œ์ด์…˜์„ ์ง€์ •ํ•œ ํ•„๋“œ์˜ ๊ฐ’์„ ๊ฒ€์‚ฌํ•˜๋ฉฐ ์ด ๊ฐ’์ด null์ธ ๊ฒฝ์šฐ์—๋งŒ isNew๋ฅผ true๋กœ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์šฐ๋ฆฌ๋Š” ์—ฌํƒœ๊นŒ์ง€ ์ƒ์„ฑ์ž์— Id๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— INSERT ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹Œ UPDATE ์ฟผ๋ฆฌ๋กœ ๋™์ž‘ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ Entity ์ƒ์„ฑ์‹œ, ํ•ด๋‹น Entity๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ์ƒ์„ฑ์ž์— ๋„ฃ๋„๋กํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Persistable ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ญํ• ์ž…๋‹ˆ๋‹ค. Persistable์€ PersistenceEntityIsNewStrategy์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ IsNewStrategy ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”์ƒ์ฒด๋กœ ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” PersistableIsNewStrategy๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

PersistableIsNewStrategy๋Š” ์ฃผ์–ด์ง„ entity ์ธ์Šคํ„ด์Šค๊ฐ€ Persistable ์ธ์Šคํ„ด์Šค์ธ์ง€ ๊ฒ€์‚ฌํ•œ ํ›„, ๊ตฌํ˜„๋œ isNew ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ๋‚˜๋ฉด ์ด๋ ‡๊ฒŒ created_at์—๋„ Auditing์ด ์ ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

BeforeSaveCallback (Lifecycle event)

isNew๋ฅผ entity ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๋งˆ๋‹ค ์ค€๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ๋Š” save ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ID๋ฅผ ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Spring Data JDBC์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ CRUD๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” Event-callback ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ save ๋“ฑ์˜ ๋ฉ”์„œ๋“œ ๋ฐœ์ƒ์‹œ์— ID๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ๋œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Entity ์ƒ์„ฑ์ž์—๋Š” Id๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๊ทธ Id๋Š” ๋‚˜์ค‘์— ์ดˆ๊ธฐํ™” ํ•œ๋‹ค๋Š” lateinit ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , ๋งŒ๋“ค์–ด์ค€ Callback ํด๋ž˜์Šค๋ฅผ Bean์— ๋“ฑ๋กํ•ด์ค๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณ„๋„์˜ Configuration ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  Import ํ•˜์‹œ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

 

์ดํ›„ ๋ ˆ์ฝ”๋“œ ๋˜ํ•œ ์ž˜ ์‚ฝ์ž…๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๋งˆ์น˜๋ฉฐ...

Spring Data JDBC๋ฅผ ์ด์šฉํ•ด์„œ ์ˆ˜๋™์œผ๋กœ ID ์ „๋žต์„ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„์‹œ ์ฐธ๊ณ ํ•ด์•ผ ํ•  ๊ฒƒ์€ ์–ด๋–ค ๋ถ€๋ถ„์ธ์ง€ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. 

 

์ฒ˜์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ–ˆ์„ ๋• ๋„๋ฉ”์ธ ๋ชจ๋ธ์—์„œ ์ง์ ‘ ID๋ฅผ Generateํ•˜์—ฌ ์ด๋ฅผ Entity ์ธ์Šคํ„ด์Šค์— ์˜ฎ๊ธฐ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ CRUD๋ฅผ ์ง„ํ–‰ํ–ˆ์—ˆ๊ณ , save ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ UPDATE ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ insert ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ์ด ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ Auditing ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™” ํ•˜๋ฉด์„œ created_at์ด ์ •์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์„ ์ฐธ๊ณ ํ–ˆ๊ณ , ๊ทธ๋Ÿฌ๋˜ ์ค‘ ์šฐ์•„ํ•œ ํ…Œํฌ ์„ธ๋ฏธ๋‚˜ ์ปจํ…์ธ ๋ฅผ ์ฐพ์•„ ์†”๋ฃจ์…˜์„ ๋„์ถœํ•ด๋‚ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

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

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments