[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๋ฅผ ๊ณต๋ถํ๊ณ ๊ณ์ ๋ถ๋ค์ด๋ผ๋ฉด ๊ผญ ์ฌ์ฉํด๋ณด์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Data] @Transactional ์ด๋ ธํ ์ด์ ์ผ๋ก ๋ณด๋ Spring์ ํธ๋์ญ์ ์ด์ผ๊ธฐ (1) | 2022.05.05 |
---|---|
[Spring boot] Axon Framework๋ก ์์ํ๋ CQRS ๊ธฐ์ด (0) | 2022.02.21 |
[Spring Data] Spring Data JDBC๋ฅผ ์ด์ฉํ DB ์ฐ๋ (์์ฉํธ) (0) | 2021.06.19 |
[Spring Data] Spring Data JDBC๋ฅผ ์ด์ฉํ DB ์ฐ๋ (๊ธฐ๋ณธํธ) (0) | 2021.06.05 |
[Spring Data] Spring Data module (0) | 2021.05.29 |