- database-plaform : ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ ๊ฒ์ธ์ง์ ๋ํ ๋ช ์์ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
- open-in-view : true์ด๋ฉด ๋ทฐ ๋ ๋๋ง ์์ ์ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์์ ์ํ์ ๊ฐ์ฒด์ ํ๋ก์๋ฅผ ์ด๊ธฐํํ ์ ์๋ค๋ฉด ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์คํ๋ ์ฑ๋ก ๋ทฐ ๋ ๋๋ง ์์ ๊น์ง ์ ์งํ์ฌ ๋ทฐ ๋ ๋๋ง ์์ ์์๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ค๋ฃฐ ์ ์๊ฒ ๋ค. ์ฆ, ์์ ๋จ์๋ฅผ ์์ฒญ ์์ ์์ ๋ถํฐ ๋ทฐ ๋ ๋๋ง ์๋ฃ ์์ ๊น์ง๋ก ํ์ฅํ๋ค.
- generate-ddl : true์ด๋ฉด ์ต์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์๋ ์์ฑํ๋ค.
- hibernate.show_sql : ํ์ด๋ฒ๋ค์ดํธ๊ฐ ์คํํ SQL์ ์ถ๋ ฅํ๋ค.
- hibernate.format_sql : ํ์ด๋ฒ๋ค์ดํธ๊ฐ ์คํํ SQL์ ์ถ๋ ฅํ ๋ ๋ณด๊ธฐ ์ฝ๊ฒ ์ ๋ ฌํด์ค๋ค.
- hibernate.use_sql_comments : ์ฟผ๋ฆฌ๋ฅผ ์ถ๋ ฅํ ๋ ์ฃผ์๋ ํจ๊ป ์ถ๋ ฅํ๋ค.
- hibernate.id.new_generator_mappings : JPA ํ์ค์ ๋ง์ถ ์๋ก์ด ํค ์์ฑ ์ ๋ต์ ์ฌ์ฉํ๋ค.
- hibernate.ddl-auto
- create : ์ด๊ธฐํ ๊ณผ์ ์์ ํ ์ด๋ธ์ ์์ฑํ๋ค. ๋ง์ฝ ๊ธฐ์กด์ ์์๋ค๋ฉด ์ญ์ ํ ์์ฑํ๋ค.
- create-drop : ์ด๊ธฐํ ๊ณผ์ ์์ ํ ์ด๋ธ์ ์์ฑํ๊ณ , ์ข ๋ฃ ์์ ์ ๋ง๋ค์ด์ง ํ ์ด๋ธ์ ์ญ์ ํ๋ค. Unit Test ์ฉ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ค.
- update : ์ปฌ๋ผ ์ถ๊ฐ/์ญ์ ์ ๊ฐ์ด ํ ์ด๋ธ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด์ ์กฐ์นํ๊ฒ ํ๋ค. ํ ์ด๋ธ ์์ฑ/์ญ์ ๋ ๊ด์ฌํ์ง ์๋๋ค.
- validate : Entity์ Table Mapping ์ค๋ฅ๋ง ์ ๊ฒํ๊ณ , ์ค๋ฅ ๋ฐ๊ฒฌ ์์ Exception์ ๋ฐ์์ํจ๋ค.
- none : none
- hibernate.physical_naming_strategy : Java Code๋ด์ Entity์ Attribute๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ๊ณผ ์ปฌ๋ผ์ผ๋ก Mapping ํ ๋ Naming์ ์ด๋ค ์ ๋ต์ผ๋ก ๋ค๋ฃจ๋ ์ง๋ฅผ ์ค์ ํ๋ค. ๊ฐ์ ๋ฐ๋ก ์ง์ ํ์ง ์์ผ๋ฉด ์ ์ฒด ์๋ฌธ์ + Under Score๋ก ๋จ์ด๊ฐ ์ด์ด์ง๋ Snake-case๊ฐ ์ ์ฉ๋๋ฉฐ ์ด๋ ์ฌ์ฉ๋๋ ๊ตฌํ์ฒด๋ org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy ์ด๋ค. org.hibernate.boot.model.naming.PhysicalNamingStrategyStadardImpl์ Snake-case๋ก ๋ณํ ์์ด Namingํ๊ฒ ๋๋ค.
import javax.persistence.*;
import java.util.List;
public class JpaMain {
public static void main(String[] args) {
//[์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ] - ์์ฑ
EntityManagerFactory emf = Persistence.createEntityManagerFactory("project name");
//[์ํฐํฐ ๋งค๋์ ] - ์์ฑ
EntityManager em = emf.createEntityManager();
//[ํธ๋์ญ์
] - ํ๋
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); //[ํธ๋์ญ์
] - ์์
logic(em); //๋น์ฆ๋์ค ๋ก์ง ์คํ
tx.commit(); //[ํธ๋์ญ์
] - ์ปค๋ฐ
} catch (Exception e) {
tx.rollback(); //[ํธ๋์ญ์
] - ๋กค๋ฐฑ
} finally {
em.close(); //[์ํฐํฐ ๋งค๋์ ] - ์ข
๋ฃ
}
emf.close(); //[์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ] - ์ข
๋ฃ
}
private static void logi(EntityManager em) {...}
}
์ฝ๋๋ ํฌ๊ฒ 3๊ฐ์ง๋ก ๋๋์ด ์๋ค.
- ์ํฐํฐ ๋งค๋์ ์ค์
- ํธ๋์ญ์ ๊ด๋ฆฌ
- ๋น์ฆ๋์ค ๋ก์ง
-
์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ ์์ฑ spring boot๋ผ๋ฉด application.yml์ ์ค์ ์ ๋ณด๋ฅผ ํตํด ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ฅผ ์์ฑํ๋ค. ์ค์ ์ ๋ณด๋ฅผ ํตํด JPA๋ฅผ ๋์์ํค๊ธฐ ์ํ ๊ธฐ๋ฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ JPA ๊ตฌํ์ฒด ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ํ๋ ์์ฑํ๋ฏ๋ก ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋น์ฉ์ด ์์ฃผ ํฌ๋ค. ๋ฐ๋ผ์ย ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ํ ๋ฒ๋ง ์์ฑํ๊ณ ๊ณต์ ํด์ ์ฌ์ฉํด์ผ ํ๋ค.
-
์ํฐํฐ ๋งค๋์ ์์ฑ ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ์์ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์์ฑํ๋ค. ์ํฐํฐ ๋งค๋์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ํฐํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ CRUDํ ์ ์๋ค. ์ํฐํฐ ๋งค๋์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ๊ณผ ๋ฐ์ ํ ๊ด๊ณ๊ฐ ์์ผ๋ฏ๋ก ์ค๋ ๋ ๊ฐ์ ๊ณต์ ํ๊ฑฐ๋ ์ฌ์ฌ์ฉํ๋ฉด ์ ๋๋ค.
-
์ข ๋ฃ ์ฌ์ฉ์ด ๋๋ ์ํฐํฐ ๋งค๋์ ์ ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ ๋ฐ๋์ ์ข ๋ฃํด์ผ ํ๋ค.
JPA๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ํญ์ ํธ๋์ญ์ ์์์ ์ด๋ค์ ธ์ผ ํ๋ค. ์ํฐํฐ ๋ฉ๋์ ์์ ํธ๋์ญ์ API๋ฅผ ๋ฐ์์์ ์ฌ์ฉํ๋ค.
EntityTransaction tx = em.getTransaction(); //ํธ๋์ญ์
API
try {
tx.begin(); //ํธ๋์ญ์
์์
logic(em); //๋น์ฆ๋์ค ๋ก์ง ์คํ
tx.commit(); //ํธ๋์ญ์
์ปค๋ฐ
} catch (Exception e) {
tx.rollback(); //์์ธ ๋ฐ์ ์ ํธ๋์ญ์
๋กค๋ฐฑ
}
private static void logic(EntityManager em) {
String id = "id";
Member member = new Member();
member.setId(id);
member.setUsername("์ฌ๋");
member.setAge(31);
//๋ฑ๋ก
em.persist(member);
//์์
member.setAge(20);
//ํ ๊ฑด ์กฐํ
Member findMember = em.find(Member.class, id);
System.out.println("name = " + member.getUserName() + " age = " + memger.getAge());
//๋ชฉ๋ก ์กฐํ
String sql = "select m from Member m";
List<Member> memberList = em.createQuery(sql, Member.class).getResultList();
System.out.println("member size = " + memberList.size());
//์ญ์
em.remove(member);
}
-
๋ฑ๋ก ํ์ ์ํฐํฐ ์์ฑ ํย
em.persist(member);
ย ๋ฅผ ์คํํ์ฌ ์ํฐํฐ๋ฅผ ์ ์ฅํ๋ค. JPA๋ ํ์ ์ํฐํฐ ๋งคํ ์ ๋ณด(์ด๋ ธํ ์ด์ )์ ๋ถ์ํด (1์ฐจ ์บ์์ ์๋ค๋ฉด) ์๋ SQL์ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ๋ค.INSERT INTO MEMBER (ID, NAME, AGE) VALUES ('id', '์ฌ๋', '31');
-
์์ JPA๋ ์ด๋ค ์ํฐํฐ๊ฐ ๋ณ๊ฒฝ๋์๋์ง ์ถ์ ํ๋ ๊ธฐ๋ฅ์ด ์์ด, ๊ธฐ์กด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ผ๋ฉด ์๋์ ๊ฐ์ ์์ SQL์ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ๋ค.
UPDATE MEMBER SET AGE=20 WHERE ID = 'id';
-
์ญ์ ์ํฐํฐ๋ฅผ ์ญ์ ํ๋ ค๋ฉด ์ํฐํฐ ๋งค๋์ ์ remove() ๋ฉ์๋๋ฅผ ์คํํ๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ฉด JPA๋ ์ญ์ SQL์ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ๋ค.
DELETE FROM MEMGER WHERE ID = 'id';
-
ํ ๊ฑด ์กฐํ find() ๋ฉ์๋๋ฅผ ์คํํ๋ฉด JPA์์๋ ์กฐํํ ์ํฐํฐ ํ์ ๊ณผ @Id ์ด๋ ธํ ์ด์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค์ ๋งคํํ ์๋ณ์ ๊ฐ์ ์ฐพ์ (1์ฐจ ์บ์์ ํด๋น ๊ฐ์ด ์๋ค๋ฉด) ํ๋์ ์ํฐํฐ๋ฅผ ์กฐํํ๋ SQL์ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์กฐํํ ๊ฒฐ๊ณผ ๊ฐ์ผ๋ก ์ํฐํฐ๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๋ค.
-
๋ชฉ๋ก ์กฐํ JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ ์ํฐํฐ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฒ๋ฆฌ๋ JPA์ ๋งก๊ฒจ์ผ ํ๋ค. ์ ๊ธฐ๋ฅ๋ค์ ๋ชจ๋ SQL์ ์ฌ์ฉํ์ง ์์์ผ๋, ๋ชฉ๋ก ์กฐํ์ ๊ฐ์ ๊ฒ์ ์ฟผ๋ฆฌ๋ ๋ชจ๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ฒ์ํด์ผ ํ๋๋ฐ SQL์ ํ ์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ํ๋ค. ์ด ๋ JPQL์ ์ฌ์ฉํด์ผ ํ๋ค.
-
JPQL(Java Persistence Query Language) SQL์ ์ถ์ํํ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ก์จ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ค. ์ฆ, ํด๋์ค์ ํ๋๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ค.
- ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ, ๊น์ํ