DB ๋ฅผ Java ์ฑ๊ณผ ์ฐ๋ํ๊ธฐ ์ํด JDBC ํ์๐
JDBC(Java Database Connectivity)
JDBC Driver๋ ์ฌ๋ฌ ํ์ ์ DB์ ์ฐ๊ฒฐํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต
JDBC Driver Manager๋ ๋ฐํ์ ์์ ์
Connection(์ฐ๊ฒฐ)
์ ์์ฑํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฒญํ ์ ์๋ ์ํ๋ฅผ ๋ง๋ค์ด ์ฃผ๊ณStatement(์ํ)
๋ฅผ ์์ฑํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฒญํ๊ฒ ํด์ฃผ๊ณResultSet(๊ฒฐ๊ณผ ์ )
์ ์์ฑํด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ฌ ์ ์๊ฒ ํด์ค๋ค.- โ ๏ธ ๊ผญ ์ฌ์ฉ ํ์๋
close()
๋ฅผ ํธ์ถํด ์์ ํด์ ๋ฅผ ํด์ค์ผ ํ๋ค. โ ๏ธ
JDBC ์ ์ฌ๋ฌ ๋ฌธ์ ๋ก QueryMapper ํ์ ๐
- JDBC๋ก ์ง์ SQL์ ์์ฑํ์ ๋์ ๋ฌธ์
- SQL ์ฟผ๋ฆฌ ์์ฒญ ์ ์ค๋ณต ์ฝ๋ ๋ฐ์
- DB ๋ณ ์์ธ์ ๋ํ ๊ตฌ๋ถ ์์ด
Checked Exception(SQL Exception)
์ฒ๋ฆฌ - Connection, Statement...๋ฑ ์์ ๊ด๋ฆฌ๋ฅผ ๋ฐ๋ก ํด์ค์ผ ํ๋ค.
- ์ํด์ฃผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฝ ์ฐจ์ ์๋ฒ๊ฐ ์ฃฝ์
- ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฒ์์ผ๋ก
Persistence Framework
๋ฑ์ฅ!Persistence Framework
- SQL Mapper : JDBC Template, MyBatis
- ORM : JPA, Hibernate
- SQL Mapper(Query Mapper)
- SQL โ๏ธ Object
- SQL ๋ฌธ๊ณผ ๊ฐ์ฒด์ ํ๋๋ฅผ ๋งคํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒดํ
JDBC Template
- SQL Mapper ์ฒซ๋ฒ์งธ ์ฃผ์๋ก JDBC Template ํ์
- ์ฟผ๋ฆฌ ์ํ ๊ฒฐ๊ณผ์ ๊ฐ์ฒด ํ๋ ๋งคํ
- RowMapper๋ก ์๋ต ํ๋ ๋งคํ ์ฝ๋ ์ฌ์ฌ์ฉ
- Connection, Statement, ResultSet ๋ฐ๋ณต์ ์ฒ๋ฆฌ๋ฅผ ๋์ ํด์ค๋ค.
- โ ๏ธ BUT, ๊ฒฐ๊ณผ ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค์ ๋งคํํ๋๋ฐ ์ฌ์ ํ ๋ง์ ์ฝ๋๊ฐ ํ์ํ๋ค.
MyBatis
- SQL Mapper ๋๋ฒ์งธ ์ฃผ์๋ก MyBatis ํ์
- ๋ฐ๋ณต์ ์ธ JDBC ํ๋ก๊ทธ๋๋ฐ์ ๋จ์ํ
- SQL ์ฟผ๋ฆฌ๋ค์ XML ํ์ผ์ ์์ฑํ์ฌ ์ฝ๋์ SQL์ ๋ถ๋ฆฌ!
- โ ๏ธ BUT, ๊ฒฐ๊ตญ SQL์ ์ง์ ์์ฑํ๋ ๊ฒ์ ํผ๊ณค,,,, -> DB ๊ธฐ๋ฅ์ ์ข ์์ โ ๏ธ
- โ ๏ธ BUT, ํ ์ด๋ธ๋ง๋ค ๋น์ทํ CRUD ๋ฐ๋ณต, DBํ์ ๋ฐ ํ ์ด๋ธ์ ์ข ์์ โ ๏ธ
QueryMapper์ DB ์์กด์ฑ ๋ฐ ์ค๋ณต ์ฟผ๋ฆฌ ๋ฌธ์ ๋ก ORM ํ์ ๐
- ORM ์ DB์ ์ฃผ๋๊ถ์ ๋บ์ด์๋ค๊ณ ํํํด๋ ๊ณผ์ธ์ด ์๋๋ค.
- ORM ์ DAO ๋๋ Mapper๋ฅผ ํตํด์ ์กฐ์ํ๋ ๊ฒ์ด ์๋๋ผ ํ
์ด๋ธ์ ์์ ํ๋์ ๊ฐ์ฒด์ ๋์์ํจ๋ค.
๋ฆด๋ ์ด์ ์ ๊ฐ์ฒด๋ก ๋งคํํ๋ ค๋ ์ด์ ?
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ฅ์ ์ ํ์ฉํ ์ ์๋ค.
- ์ด๋ฅผ ํตํด, ๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ ๋ฐ ํ ์คํธ ๊ตฌํ์ด ํธ๋ฆฌํ๋ค.
- ๊ฐ์ข ๋์์ธ ํจํด์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ๊ฐ์ ๊ฐ๋ฅ
- ์ฝ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
โ ๏ธ ORM์ด ํด๊ฒฐํด์ผํ๋ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ์ฑ โ ๏ธ
์์์ ๋ฌธ์
- ๊ฐ์ฒด : ๊ฐ์ฒด ๊ฐ์ ๋ฉค๋ฒ ๋ณ์๋ ์์๊ด๊ณ๋ฅผ ๋งบ์ ์ ์๋ค.
- RDB : ํ ์ด๋ธ๋ค์ ์์ ๊ด๊ณ๊ฐ ์๊ณ ๋ชจ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ค.
๐โโ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ : ๋งคํ ์ ๋ณด์ ์์ ์ ๋ณด๋ฅผ ๋ฃ์ด์ค๋ค.(@OneToMany
, @ManyToOne
)
๊ด๊ณ ๋ฌธ์
- ๊ฐ์ฒด : ์ฐธ์กฐ๋ฅผ ํตํด ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ฉฐ ๋ฐฉํฅ์ ๊ฐ์ง๋ค. (๋ค๋๋ค ๊ด๊ณ๋ ์์)
- RDB : ์ธ๋ํค(FK)๋ฅผ ์ค์ ํ์ฌ Join์ผ๋ก ์กฐํ ์์๋ง ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋ค.(์ฆ, ๋ค๋๋ค๋ ๋งคํ ํ ์ด๋ธ ํ์)
๐โโ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ : ๋งคํ ์ ๋ณด์ ๋ฐฉํฅ ์ ๋ณด๋ฅผ ๋ฃ์ด์ค๋ค.(@JoinColumn
,@MappedBy
)
ํ์ ๋ฌธ์
- ๊ฐ์ฒด : ์ฐธ์กฐ๋ฅผ ํตํด ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์์ฐจ์ ํ์์ด ๊ฐ๋ฅํ๋ฉฐ ์ฝ๋ ์ ๋ ์ํํ๋ค.
- RDB : ํ์ ์ ์ฐธ์กฐํ๋ ๋งํผ ์ถ๊ฐ ์ฟผ๋ฆฌ๋, join์ด ๋ฐ์ํ์ฌ ๋นํจ์จ์ ์ด๋ค.
๐โโ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ : ๋งคํ/์กฐํ ์ ๋ณด๋ก ์ฐธ์กฐํ์ ์์ ์ ๊ด๋ฆฌํ๋ค.(@FetchType
, fetchJoin()
)
๋ฐ๋ ๋ฌธ์
- ๊ฐ์ฒด : ๋ฉค๋ฒ ๊ฐ์ฒด ํฌ๊ธฐ๊ฐ ๋งค์ฐ ํด ์ ์๋ค.
- RDB : ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ๋ง ์กด์ฌํ๋ค.
๐โโ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ : ํฌ๊ธฐ๊ฐ ํฐ ๋ฉค๋ฒ ๊ฐ์ฒด๋ ํ
์ด๋ธ์ ๋ถ๋ฆฌํ์ฌ ์์์ผ๋ก ์ฒ๋ฆฌํ๋ค.(@embedded
)
์๋ณ์ฑ ๋ฌธ์
- ๊ฐ์ฒด : ๊ฐ์ฒด์ hashCode ๋๋ ์ ์ํ equals() ๋ฉ์๋๋ฅผ ํตํด ์๋ณ
- RDB : PK๋ก๋ง ์๋ณ
๐โโ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ : PK๋ฅผ ๊ฐ์ฒด id๋ก ์ค์ ํ๊ณ EntityManager๋ ํด๋น ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์๋ณํ์ฌ ๊ด๋ฆฌํ๋ค. (@Id
, @GeneratedValue
)
๋์ ORM์ด ์ป์ ์ต์ ํ ๋ฐฉ๋ฒ
1์ฐจ, 2์ฐจ ์บ์
- 1์ฐจ ์บ์, 2์ฐจ ์บ์๋ฅผ ์กฐํํ ํ ์์ผ๋ฉด DataSource์์ ์กฐํํ๋ค.
- ์บ์ฑ ๊ธฐ๋ฅ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ์ง ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ค.
1์ฐจ ์บ์
- ์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ์๋ ์ํฐํฐ๋ฅผ ๋ณด๊ดํ๋ ์ ์ฅ์๊ฐ ์๋๋ฐ ์ด๋ฅผ 1์ฐจ ์บ์๋ผ๊ณ ํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ํธ๋์ญ์ ์ ์์ํ๊ณ ์ข ๋ฃํ ๋๊น์ง๋ง 1์ฐจ ์บ์๊ฐ ์ ํจํ๋ค.
- 1์ฐจ ์บ์๋ ํ ํธ๋์ญ์ ์์ ๊ณ์ํด์ ์๋ณธ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ค๋ค.
2์ฐจ ์บ์
- ์ ํ๋ฆฌ์ผ์ด์ ๋ฒ์์ ์บ์๋ก, ๊ณต์ ์บ์๋ผ๊ณ ๋ ํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ ๋ ๊น์ง ์บ์๊ฐ ์ ์ง๋๋ค.
- 2์ฐจ ์บ์๋ ์บ์ ํ ๊ฐ์ฒด ์๋ณธ์ ๋๊ฒจ์ฃผ์ง ์๊ณ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ ๋๊ฒจ์ค๋ค.
- ๋ณต์ฌ๋ณธ์ ์ฃผ๋ ์ด์ ๋ ์ฌ๋ฌ ํธ๋์ญ์ ์์ ๋์ผํ ์๋ณธ ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ์ผ์ด ์๋๋ก ํ๊ธฐ ์ํด์์ด๋ค.
- 2์ฐจ ์บ์ ์ ์ฉ๋ฐฉ๋ฒ
- Entity์
@Cacheable
์ ์ฉ ํ ์ค์ ์ถ๊ฐ # application.yml spring.jpa.properties.hibernate.cache.use_second_level_cache: true # 2์ฐจ ์บ์ ํ์ฑํ spring.jpa.properties.hibernate.cache.region.factory_class: XXX # 2์ฐจ ์บ์๋ฅผ ์ฒ๋ฆฌํ ํด๋์ค๋ฅผ ์ง์ spring.jpa.propertie.hibernate.generate_statistics: true # ํ์ด๋ฒ๋ค์ดํธ๊ฐ ์ฌ๋ฌ ํต๊ณ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๊ฒ ํด์ฃผ๋๋ฐ ์บ์ ์ ์ฉ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
sharedCache.mode
์ค์
- Entity์
cache mode ์ข ๋ฅ
์ข ๋ฅ ์ค๋ช ALL ๋ชจ๋ ์ํฐํฐ๋ฅผ ์บ์ NONE ์บ์๋ฅผ ์ฌ์ฉํ์ง ์์ ENABLE_SELECTIVE Cacheable(true)๋ก ์ค์ ๋ ์ํฐํฐ๋ง ์บ์๋ฅผ ์ ์ฉ DISABLE_SELECTIVE ๋ชจ๋ ์ํฐํฐ๋ฅผ ์บ์ํ๋๋ฐ, Cacheable(false)๋ง ์บ์ํ์ง ์์ UNSPECIFIED JPA ๊ตฌํ์ฒด๊ฐ ์ ์ํ ์ค์ ์ ๋ฐ๋ฅธ๋ค. # application.yml spring.jpa.properties.javax.persistence.sharedCache.mode: ENABLE_SELECTIVE
์์์ฑ ์ปจํ ์คํธ(1์ฐจ ์บ์)๋ฅผ ํ์ฉํ ์ฐ๊ธฐ ์ง์ฐ
- ์์์ฑ์ด๋?
๋ฐ์ดํฐ๋ฅผ ์์ฑํ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ด๋ ์ฌ๋ผ์ง์ง ์๋ ๋ฐ์ดํฐ์ ํน์ฑ์ ๋งํ๋ค.
์์์ฑ์ ๊ฐ์ง ์์ผ๋ฉด,๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ์๋ง ์กด์ฌํ๊ฒ ๋๊ณ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ฉด ํด๋น ๋ฐ์ดํฐ๋ ๋ชจ๋ ์ฌ๋ผ์ง๊ฒ ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ผ์ด๋ DB์ ์๊ตฌ ์ ์ฅํจ์ผ๋ก์จ ๋ฐ์ดํฐ์์์์ฑ
์ ๋ถ์ฌํ๋ค.
์์์ฑ 4๊ฐ์ง ์ํ(๋น์์
>์์
>์ค์์
|์ญ์
)
- ๋น์์(new/transient) - ์ํฐํฐ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ ธ์ ์์ง ์ ์ฅ๋์ง ์์ ์ํ๋ก, ์์์ฑ ์ปจํ ์คํธ์ ์ ํ ๊ด๊ณ๊ฐ ์๋ ์ํ
- ์์(managed) - ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์ด, ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ ์ ์๋ ์ํ
- ์ค์์(detached) - ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์ด ์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ๋ก, ์์์ฑ ์ปจํ ์คํธ๊ฐ ๋ ์ด์ ๊ด๋ฆฌํ์ง ์๋ ์ํ
- ์ญ์ (removed) - ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ญ์ ํ๊ฒ ๋ค๊ณ ํ์ํ ์ํ
๊ฐ์ฒด์ ์์์ฑ ์ํ๋
Entity Manager
์ ๋ฉ์๋๋ฅผ ํตํด ์ ํ๋๋ค.Raw JPA ๊ด์
- persist(), merge() >
(์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋ ์ํ)
> flush() >(DB์ ์ฟผ๋ฆฌ๊ฐ ์ ์ก๋ ์ํ)
> commit() >(DB์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์๋ ์ํ)
- persist(), merge() >
์ฐ๊ธฐ ์ง์ฐ์ด ๋ฐ์ํ๋ ์์
- flush() ๋์์ด ๋ฐ์ํ๊ธฐ ์ ๊น์ง ์ต์ ํํ๋ค.
- flush() ๋์์ผ๋ก ์ ์ก๋ ์ฟผ๋ฆฌ๋ ๋ ์ด์ ์ฟผ๋ฆฌ ์ต์ ํ๋ ๋์ง ์๊ณ , ์ดํ commit()์ผ๋ก ๋ฐ์๋ง ๊ฐ๋ฅํ๋ค.
ํจ๊ณผ
- ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ํ ๊ฒฝ์ฐ ๋ชจ์์ ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์ ์กํ๋ค.
- ์์์ฑ ์ํ์ ๊ฐ์ฒด๊ฐ ์์ฑ ๋ฐ ์์ ์ด ์ฌ๋ฌ ๋ฒ ์ผ์ด๋๋๋ผ๋ ํด๋น ํธ๋์ญ์ ์ข ๋ฃ ์ ์ฟผ๋ฆฌ๋ 1๋ฒ๋ง ์ ์ก๋ ์ ์๋ค.
- ์์์ฑ ์ํ์์ ๊ฐ์ฒด๊ฐ ์์ฑ๋์๋ค ์ญ์ ๋์๋ค๋ฉด ์ค์ DB์๋ ์๋ฌด ๋์์ด ์ ์ก๋์ง ์์ ์ ์๋ค.
- ์ฆ, ์ฌ๋ฌ ๊ฐ์ง ๋์์ด ๋ง์ด ๋ฐ์ํ๋๋ผ๋ ์ฟผ๋ฆฌ๋ ํธ๋์ญ์ ๋น ์ต์ ํ๋์ด ์ต์ ์ฟผ๋ฆฌ๋ง ๋ ๋ผ๊ฐ๊ฒ ๋๋ค.
'๋ด์ผ๋ฐฐ์์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA ์ฌํ : Spring Data ๊ตฌ์กฐ ๋ฐ JpaRepository ์๋ฆฌ (0) | 2023.12.27 |
---|---|
JPA ์ฌํ : Raw JPA (0) | 2023.12.26 |
Event-Driven Architecture (0) | 2023.12.12 |
๊น๋ฐฅ ์ฒ๊ตญ ํ๋ก์ ํธ KPT (0) | 2023.12.12 |
์คํ๋ง ์ฌํ 5์ฃผ์ฐจ : Spring AOP (0) | 2023.11.30 |