ORM
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง์ ๋ฐ๋ผ, ํผ์์คํด์ค์ ๊ด๋ จ๋ ์๊ตฌ์ฌํญ๋ ๋ณต์กํด์ง ==> ๋ ๋ณต์กํ๊ณ ์ ๊ตํ ๊ธฐ๋ฅ์ด ํ์
* ์ง์ฐ ๋ก๋ฉ(lazy loading) : ๊ด๋ จ์ฑ ์๋ ๊ฐ์ฒด ์ ์ฒด๋ฅผ ํ๋ฒ์ ๊ฐ์ ธ์ค๊ณ ์ถ์ง ์์ ๋, ํ์๋ก ํ๋ ์ค์ ๋ฐ์ดํฐ๋ง ๋ถ๋ฌ์ค๋ ๊ธฐ๋ฅ. ex) ๊ฐ์ฒด ์์ ๋ด๋ถ๊ฐ์ฒด๋ ์ ์ธํ๊ณ ๋ถ๋ฌ์ค๊ธฐ
* ์กฐ๊ธฐ ์ธ์ถ(eager fetching) : ์ง์ฐ ๋ก๋ฉ์ ๋ฐ๋ ๊ฐ๋ . ํ๋ฒ์ ์ฟผ๋ฆฌ๋ก ์ ์ฒด ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ // ex) ๋ถ๋ฌ์ค๊ธฐ ํ๋ฒ์ผ๋ก, ๊ฐ์ฒด์ ๋ด๋ถ๊ฐ์ฒด์ ์ ๋ณด๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์ด
* ์บ์ค์ผ์ด๋ฉ(cascading) : ๋๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋ณ๊ฒฝํ์ ๋, ๋ค๋ฅธ ํ ์ด๋ธ์ ๊ฐ๋ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ธฐ๋ฅ // ex) ๊ฐ์ฒดA๋ฅผ ์ญ์ ํ ๋, ์ฐ๊ด๋ B๊ฐ์ฒด๋ ๊ฐ์ด ์ญ์
=> ์ด๋ฌํ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ํ๋ ์ ์ํฌ๋ฅผ '๊ฐ์ฒด ๊ด๊ณ ๋งคํ(ORM, Object-Relational Mapping, ์ดํ ORM)'์ด๋ผ๊ณ ํจ.
=> ์ ํ๋ฆฌ์ผ์ด์ ํผ์์คํด์ค ๊ณ์ธต์ ORM์ด๋ผ๊ณ ํจ. ์ข ๋ฅ๋ก๋ ํ์ด๋ฒ๋ค์ดํธ, iBATIS, myBATIS, JPA๋ฑ์ด ํฌํจ๋๋ค.
* ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ : ์ ์ธ์ ํธ๋์ญ์ ์ ๋ํ ํตํฉ ์ง์, ํฌ๋ช ํ ์์ธ ์ฒ๋ฆฌ, ์ค๋ ๋ ์์ ์ฑ์ ๊ฐ์ถ ๊ฒฝ๋์ ํ ํ๋ฆฟ, DAO ์ง์, ์์ ๊ด๋ฆฌ
์คํ๋ง๊ณผ ํ์ด๋ฒ๋ค์ดํธ ํตํฉ
ํ์ด๋ฒ๋ค์ดํธ : ์คํ์์ค ํผ์์คํด์ค ํ๋ ์์ํฌ, ์ ๋๋ก ๋ ORM์ด ๊ฐ์ถฐ์ผํ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ ๊ณต(์บ์, ์ง์ฐ ๋ก๋ฉ, ์กฐ๊ธฐ ์ธ์ถ, ๋ถ์ฐ ์บ์ ๋ฑ)
ํ์ด๋ฒ๋ค์ดํธ ์ธ์ ํฉํ ๋ฆฌ ์ ์ธ
org..hibernate.Session : ๊ฐ์ฅ ์ค์ฌ์ธ ์ธํฐํ์ด์ค,, ๊ฐ์ฒด๋ฅผ ์ ์ฅ, ์ ๋ฐ์ดํธ, ์ญ์ , ๋ก๋ํ๋ ๊ธฐ๋ณธ์ ์ธ ์ก์ธ์ค ๊ธฐ๋ฅ์ ์ ๊ณต
์คํ๋ง์์ ํ์ด๋ฒ๋ค์ดํธ SessionFactory๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์, ์ธ์ ํฉํ ๋ฆฌ ๋น์ ํตํจ -> org.springframework.orm.hibernate4.LocalSessionFactoryBean (ํ์ด๋ฒ๋ค์ดํธ3์ ์๋ต)
ํ์ด๋ฒ๋ค์ดํธ4๋ฅผ ๊ธฐ์ค์ผ๋ก, 3์ AnnotationSesstionFactoryBean์ ๋งค์์ ๊ณผ ๊ฐ์.
์คํ๋ง์ผ๋ก๋ถํฐ ํด๋ฐฉ๋ ํ์ด๋ฒ๋ค์ดํธ ๊ตฌ์ฑ
ํ์ด๋ฒ๋ค์ด์ค ์ํฉ์ธ์ ์ ์ด์ฉํ์ฌ, HibernateTemplate์ด ํ์ ์์ด, SessionFactory๋ฅผ ์ง์ ์ ์ฅ์์ ์์ด์ด๋ง ํ ์ ์๋ค.
=> sessionFactory ํ๋กํผํฐ์์, SessionFactory๋ฅผ ์๋ ์ฃผ์ ํ ํ, currentSession() ๋ฉ์๋์์ ์ด SessionFactory๋ฅผ ์ด์ฉํด์ ํ์ฌ ํธ๋์ญ์ ์ ์ธ์ ์ ์ป์
=> @Repository ์ ๋ํ ์ด์ ์ ์ ์ฉํ์ฌ, ์ปดํฌ๋ํธ ์ค์บ๋์ ์ค์บ๋จ(HibernateCoffeeRepository ๋น์ด ํ์ ์์), ๋ํ ๋ช ์์ ์ค์ ์ ์ค์ด๋๋ฐ์ ๋์์ ์ค๋ค
* ํ์ด๋ฒ๋ค์ดํธ ํ ํ๋ฆฟ์ด ์๋, ํ์ด๋ฒ๋ค์ดํธ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ์์ธ ๋ณํ์ ์๋์ ๊ฐ์ด ์ด์ฉ ๊ฐ๋ฅํ๋ค
์คํ๋ง๊ณผ ์๋ฐ ํผ์์คํด์ค API
JPA(java persitence API)๋ POJO ๊ธฐ๋ฐ์ ํผ์์คํด์ค ๋ฉ์ปค๋์ฆ,, ์คํ๋ง 2.0๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ํฐํฐ ๊ด๋ฆฌ์ ํฉํ ๋ฆฌ ์ค์
JPA๋ก ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์, EntityManagerFactory์ ๊ตฌํ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์, EntityManager์ ์ธ์คํด์ค๋ฅผ ํ๋ํด์ผํ๋ค.
์ํฐํฐ ๊ด๋ฆฌ์์ ์ข ๋ฅ
์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌํ_Application-managed : ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ํฐํฐ ๊ด๋ฆฌ์ ํฉํ ๋ฆฌ์์ ์ง์ ์์ฒญํ์ฌ, ์์ฑ๋๋ ์ ํ. ์ง์ open๋ถํฐ close๊น์ง ์ ๊ฒฝ์จ์ผํ๋ฏ๋ก , ์๋ฐ EE์ปจํ ์ด๋๊ฐ ์์ด ์คํ๋๋, ๋ ๋ฆฝํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ๋ค.
์ปจํ ์ด๋ ๊ด๋ฆฌํ_container-managed : ์๋ฐ EE ์ปจํ ์ด๋์ ์ํด ์์ฑ๋๊ณ ๊ด๋ฆฌ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์ํฐํฐ๊ด๋ฆฌ์์ ์ํธ์์ฉ ํ์ง ์์. ์ข ์๊ฐ์ฒด ์ฃผ์ ํน์ JNDI๋ฅผ ํตํด ํ๋. ์ด ์ ํ์ ๋จ์ํ persistnece.xml๋ก ์ง์ ํ ๊ฒ ์ด์์ ์๋ฐ EE์ปจํ ์ด๋๋ฅผ ์ ๊ณตํ๊ณ ์ ํ ๋ ์ฌ์ฉ
=> ์คํ๋ง์์๋, ๊ฐ๋ฐ์์๊ฒ๋ ํฐ ์๋ฏธ๊ฐ ์์.. ์ด๋ค ์ ํ์ ์ฌ์ฉํด๋, ์คํ๋ง์ด ๊ด๋ฆฌ๋ฅผ ํด์ค... JpaTemplate์ด ์ธ๋ถ์ฌํญ์ ๊ฐ์ถฐ์ค
์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌํ JPA ๊ตฌ์ฑ
- ๋๋ถ๋ถ persitence.xml ์ค์ ํ์ผ๋ก ๊ฐ์ ธ์ด(classpath:META-INF ๋๋ ํ ๋ฆฌ) -> ํ๋ ์ด์์ ํผ์์คํด์ค ์ ๋(ํ๋์ ๋ฐ์ดํฐ์์ค๋ฅผ ๊ณต์ ํ๋ ํผ์์คํด์ค ํด๋์ค์ ์งํฉ) ์ ์ธ์ด ๋ชฉํ
=> ์ฌ๋ฌ๊ฐ์ ํผ์์คํด์ค ํด๋์ค์, ๋งคํํ์ผ ์ ๋ณด
์์ ํ์ผ์ ๊ฐ์ง๊ณ , LocalEntityManagerFactoryBean์ ์ ์ธํด์ค๋ค.
==> ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌํ์ ๊ฒฝ์ฐ <persistence.xml>์ ํ์ํ ๋ด์ฉ์ ๋ฃ์ด๋์ด์ผ, PersistenceProvider๊ฐ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ์คํ๋ง์ ์ด์ฉํ๋ฉด, JpaTemplate์ด PersistenceProvider์ ์ํธ์์ฉ์ ํ๊ธฐ ๋๋ฌธ์, ์ค์ ๋ก ์ค์ ์ ๋ณด๋ฅผ persistence.xml์ ๋ฃ๋ ๊ฒ์ ํ๋ช ํ์ง ์๋ค.
์ปจํ ์ด๋ ๊ด๋ฆฌํ JPA ๊ตฌ์ฑ
* EntityManagerFactory๋ ์ปจํ ์ด๋(์คํ๋ง)์ด ์ ๊ณตํ๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์์ฑ
* dataSource๋ฅผ ์คํ๋ง ์ปจํ ์คํธ์์ ์ง์ ๊ฐ๋ฅ ํ๋ค
* persistence.xml์ด ํ์๊ฐ ์์
* jpaVendorAdapter์ ๊ฒฝ์ฐ, ํน์ JPA ๊ตฌํ์ฒด์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํจ์ด๋ค. EclipseLinkJpaVendorAdpater, HibernateJpaVendorAdapter, OpenJpaVendorAdapter๊ฐ ์๋ค.
JNDI์์ EntityManagerFactory ๊ฐ์ ธ์ค๊ธฐ
์๋ฒ์ ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ, EntityManagerFactory๋ ์ด๋ฏธ ์์ฑ ๋๊ณ , ๊ฒ์์ ์ํด JNDI์์ ๋๊ธฐ. ์ด ๊ฒฝ์ฐ ์คํ๋ง์ jee ๋ค์์คํ์ด์ค๊ฐ <jee:jndi-lookup> ์์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ์ง๋ค.
์ด๋ฌํ ์ค์ ์ ๊ฐ์ง๊ณ , ๋น์ ์ค์
JPA ๊ธฐ๋ฐ ์ ์ฅ์ ์์ฑ
์คํ๋งJPA ํตํฉ์ , JpaTemplate๊ณผ, JpaDaoSupprotํด๋์ค์ ํฌํจ๋จ. ๊ทธ๋ผ์๋ ํ ํ๋ฆฟ ๊ธฐ๋ฐ์ JPA๋ ์์ JPA ์ ๊ทผ ๋ฐฉ์์ ์ํด ๋ณ๋๋ก ๋จ๊ฒจ๋์๋ค.
์คํ๋ง์ ํด๋ฐฉ๋ JPA
=> ์ด๋ ํ, ์คํ๋ง ํ ํ๋ฆฟ๋ ์ฌ์ฉํ์ง ์์. @PersistencUnit์ผ๋ก, EntityManagerFactory๊ฐ ์ ๋ํ ์ด์ ๋๊ณ , ์คํ๋ง์ ์ด๋ฅผ ์ ์ฅ์์ ์ฃผ์ ํ๋ค. ์ดํ JpaCafeRepository๋ ํด๋น EntityManager๋ฅผ ์์ฑ ํ ์ฌ์ฉํ๋ค.
=> EntityManager๊ฐ ๊ณ์ ์์ฑ๋๋ ๋ฌธ์ ๊ฐ ์์. ์ค๋ ๋ ์ธ์ดํํ์ง ์๊ณ , ์ ์ฅ์์ ๊ฐ์ด ๊ณต์ ์ฑ๊ธํค ๋น์ผ๋ก ์ฃผ์ ๋์ง ์๊ธฐ ๋๋ฌธ..
ํ๋ก์๋ฅผ ๊ฐ์ง๋ ์ ์ฅ์๋ฅผ EntityManager์ ์ฃผ์
* EntityManager์ ์ง์ ์ฃผ์ด์ง๊ธฐ ๋๋ฌธ์, ๊ฐ ๋ฉ์๋๋ฅผ ๊ณ์ ์์ฑํ ํ์๊ฐ ์๋ค.
@PersistenceContext๋ EntityManager๋ฅผ ์ฃผ์ ํ์ง ์๋ ๋์ , ์ ์ฅ์์ ์ค์ EntityManager๋ฅผ ์ฃผ๊ณ , ๊ทธ๊ฒ์ ํ๋ก์๋ฅผ ์ ๊ณตํ๋ค. ์ฐ๊ด๋๊ฑฐ๋ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ์๋ง ์๋ก ์์ฑ => ์ค๋ ๋ ์ธ์ดํ
@PersistenceUnit, @PersistenceContext๋ ๋ชจ๋ JPA์คํ์์ ์ ๊ณต => ์คํ๋ง์ด EntityManagerFactory, EntityManager๋ฅผ ์ดํดํ๊ณ ์ฃผ์ ํ๊ธฐ ์ํด์๋, PersistenceAnnotationBeanPostProcessor๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋ค.
๋ง์ง๋ง์ผ๋ก , ์์ธ ๋ณํ์ ํ๊ธฐ ์ํด์๋ ํ์ด๋ฒ๋ค์ดํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ธ๋ณํ ํด๋์ค๋ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
์คํ๋ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์๋ JPA ์ ์ฅ์
์คํ๋ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ, ๋์ผํ ์ ์ฅ์ ๊ตฌํ์ ์์ ๊ณ ์ ์ฅ์ ์ธํฐํ์ด์ค ์์ฑ์ ๋ฉ์ถ ์ ์๋ค.
ํด๋น ์ธํฐํ์ด์ค๋ JpaRepository๋ฅผ ํ์ฅํ๋ค. ์คํ๋ง ๋ฐ์ดํฐ์์ ์ ์ฅ์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๊ฒฌํ ๋, CafeRepository๊ตฌํ์ ์งํํ๋ค(์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ์ ๋น์ท)
@EnableJpaRepositories() = <jpa:repositories> - ์คํ๋ง๋ฐ์ดํฐ JPA์ ์ฅ์์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ๋ ๊ธฐ๋ณธ ํจํค์ง๋ฅผ ์ค์บํ๋ค.
=> ์ผ๋ฐ JPA๋์์ ์ํ 18๊ฐ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํจ
์ฟผ๋ฆฌ๋ฉ์๋ ์ ๊ณตํ๊ธฐ
์์ 18๊ฐ ๋ฉ์๋ ์ด์ธ์, ๋ ๋ง์ ๋ฉ์๋๊ฐ ํ์ํ ๋... ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค.
์คํ๋ง ๋ฐ์ดํฐ๋ ๋ฉ์๋ ๋ช ์์ - ์ฟผ๋ฆฌ๋์ฌ+๋์+By+์กฐ๊ฑด ์ ํตํด ๋ฉ์๋๋ฅผ ๋ง๋ ๋ค
์ฟผ๋ฆฌ ๋์ฌ - get, read, find, count ํ์ฉ
๋์ - ๋๋ถ๋ถ ๋ฌด์, JpaRespository๋ฅผ ์ด๋ป๊ฒ ํ๋ผ๋ฏธํฐํ ํ๋๋๊ฐ ๋ฌธ์
์กฐ๊ฑด - ๊ฒฐ๊ณผ๋ฅผ ์ ํํ๋ ํ ๊ฐ ์ด์์ ์กฐ๊ฑด์ ์ฐพ์ ์ ์์.
์์ : readByFirstnameOrLastname(String first, String last)
=> Stringํ๋กํผํฐ ์ฌ์ฉ ์, ๋์๋ฌธ์๋ฅผ ์๊ดํ์ง ์๋ IgnoringCase๋ฅผ ํฌํจํ๋ค. readByFirstnameIgnoringCaseOrLastnameIgnoringCase(String first, String last)
* ์ต์ข ์ ์ผ๋ก OrderBy๋ก ์ ๋ ฌ๋ ๊ฐ๋ฅํ๋ค readByFirstnameOrLastnameOrderByLastnameAsc(String first, String last)
==> ์ฌ์ฉ์๊ฐ ์คํ๋ง ๋ฐ์ดํฐ์ ๋ช ๋ช ๊ท์น์ ๋ง์ถฐ์ ๋ฉ์๋์ ํ์ ๋ฆฌ์คํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ.
๋ง์ถคํ ์ฟผ๋ฆฌ ์ ์ธ
* ๋ฐ์ดํฐ ๋ช ๋ช ๊ท์น์ ์ ์ธํ๊ณ , ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํ์ฌ @Query ์ ๋ํ ์ด์ ์ ์ฌ์ฉํ ์ ์๋ค.
=> ํด๋น ์ ๋ํ ์ด์ ์ ํตํด, ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ๊ตฌํ๋ ๊ฐ๋ฅํ๋ค.. ํ์ง๋ง ์์ง์ ๋ฉ์๋ ๊ตฌํ์ ํ ์ ์๋ค. ๋จ์ง ์คํ๋ง ๋ฐ์ดํฐ JPA์ ๋ฉ์๋ ๊ตฌํ์ ๋ํ ํํธ๋ฅผ ์ฃผ๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ฅผ ์ํํ์ ๋ฟ
* ๋ช ๋ช ๊ท์น์ด ๋๋ฌด ๋ณต์กํ๊ฑฐ๋, ๋ช ๋ช ๊ท์น์ผ๋ก ์ํ์ด ๋ถ๊ฐ๋ฅํ ๋ ์ฌ์ฉํ๋ฉด ์ข๋ค.
๋ง์ถคํ ๊ธฐ๋ฅ ํผํฉ
* ๋ช ๋ช ๊ท์น๊ณผ, ๋จ์ผ ์ฟผ๋ฆฌ(@Query)๋ก๋ ํ๋ ์ ์ฅ์์ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ์๋ ๋ฐฉ์์ธ, EntityManager๋ฅผ ์ง์ ์์ฑํด์ผํ ์ ์๋ค ==> ์ค์ ๋ก ์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ํ ์ ์๋ ์ผ์ ํ ๋, ๋ฎ์ ์์ค์์ JPA์ ํจ๊ป ๋์ํ๋๋ก ํด์ผํ๋ค.
=> ์คํ๋ง ๋ฐ์ดํฐ๋ฅผ ์์ ํ ํฌ๊ธฐํ ํ์๋ ์์
์คํ๋ง JPA๋ ์ ์ฅ์ ์ธํฐํ์ด์ค ๊ตฌํ์ ์์ฑ ํ, Impl์ ๋ฏธ์ด๋ฅผ ๊ฐ์ง๋ ํด๋์ค๋ฅผ ์ฐพ์. ํด๋น ํด๋์ค์ JPA์ ์ํด ์์ฑ๋ ๋ฐฉ๋ฒ๊ณผ ๋ณํฉ
=> ๊ธฐ์ฃผ์ ๋, EntityManager๋ฅผ ์ฌ์ฉ. CoffeeRepository๋ฅผ ๊ตฌํํ์ง ์์!..
=> ๋์ค ํ๋์ ๋ฐฉ๋ฒ์ ์ฌ์ฉ
... ๋ฒ์ธ๋ก impl์ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๋ฉด?
=> Postfix๋ฅผ Helper๋ก ์ง์ ํ ์ผ์ด์ค
Last updated
Was this helpful?