JAVA/JPA

[JPAκ°•μ˜] 1-2) JPA μ†Œκ°œ

λ°°κ³ νŒŒμš” 2022. 8. 16. 20:07
728x90

 

 


 

πŸ“ JPA ?

  • Java Persistence API
  • μžλ°” μ§„μ˜μ˜ ORM 기술 ν‘œμ€€
    • ORM?
      • Object-relational mapping(객체 관계 λ§€ν•‘)
      • κ°μ²΄λŠ” κ°μ²΄λŒ€λ‘œ 섀계
      • κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŒ€λ‘œ 섀계
      • ORM ν”„λ ˆμž„μ›Œν¬κ°€ μ€‘κ°„μ—μ„œ λ§€ν•‘
      • λŒ€μ€‘μ μΈ μ–Έμ–΄μ—λŠ” λŒ€λΆ€λΆ„ ORM 기술이 μ‘΄μž¬ν•¨.
      •  
  • JPA λŠ” ν‘œμ€€λͺ…μ„Έ
  • JPA λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨μŒ.
  •  
  • JPAλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό JDBC μ‚¬μ΄μ—μ„œ λ™μž‘ν•¨.

 

  • JPA의 역사?
    •   "EJB (μ—”ν‹°ν‹° 빈 (μžλ°”ν‘œμ€€))"   μ—μ„œ μ‹œμž‘ --> λˆ„κ΅°κ°€κ°€ λΆˆνŽΈν•΄μ„œ λ§Œλ“  것이    "ν•˜μ΄λ²„λ„€μ΄νŠΈ"    (이건 μ˜€ν”ˆμ†ŒμŠ€.) --> 이 ν•˜μ΄λ²„λ„€μ΄νŠΈλ₯Ό 보닀 λ‹€λ“¬μ–΄μ„œ λ§Œλ“  것이 ν˜„μž¬μ˜   "JPA"  

 

 

 

 

 

πŸ“ JPAλ₯Ό μ™œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” μ§€ ?

  • 1. SQL 쀑심적인 개발 -> 객체 μ€‘μ‹¬μœΌλ‘œ 개발
  • 2. 생산성 _ JPA와 CRUD 
    • μ €μž₯ : jpa.persist(member);
    • 쑰회 : Member member = jpa.find(memberId);
    • μˆ˜μ • : member.setName("λ³€κ²½ν•  이름");
    • μ‚­μ œ : jpa.remove(member);
    • JPAκ°€ μžλ°” μ»¬λ ‰μ…˜μ„ μ΄μš©ν•˜λŠ” 것 같이. κ·Έ 과정을 λ‹€ ν•΄μ£Όκ³ , DB에 μ €μž₯ν•΄μ£ΌλŠ” 일을 함.
  • 3. μœ μ§€λ³΄μˆ˜ 
    • λ§Œμ•½ 컬럼이 μΆ”κ°€ λœλ‹€λ©΄,
    • κΈ°μ‘΄ JDBC의 경우,
public Class Member{

    String id;
    String name;
    String email;
}

Insert문
INSERT INTO MEMBER (ID, NAME, EMAIL) 
VALUES('gloria', 'κΈ€λ‘œλ¦¬μ•„', 'gloria94682015@tistory.com');

SELECT문
SELECT ID, NAME, EMAIL
FROM MEMBER;

μ˜€ν”ˆ 직전에 TEL을 넣어달라고 ν•˜λ©΄?

public Class Member{
	
    String id;
    String name;
    String email;
    // μ˜€ν”ˆ 직전에 tel 을 μΆ”κ°€ 해달라고 ν•˜λ©΄?
    String tel;
}

Insert문
INSERT INTO MEMBER (ID, NAME, EMAIL, TEL) 
VALUES('gloria', 'κΈ€λ‘œλ¦¬μ•„', 'gloria94682015@tistory.com', '010123456789');

SELECT문
SELECT ID, NAME, EMAIL, TEL 
FROM MEMBER;
  •  
    • μ˜€ν”ˆ 직전에 TEL이 λ“€μ–΄κ°€μ•Όν•˜λŠ” λͺ¨λ“  쿼리λ₯Ό μ „λΆ€ λ‹€ μˆ˜μ •ν•΄μ€˜μ•Όν•¨.
    •  
    • JPA 의 경우
public Class Member{
    private String id;
    private String email;
    // μ˜€ν”ˆ 직전에 tel 을 μΆ”κ°€ 해달라고 ν•˜λ©΄?
    private String tel; // κ·Έλƒ₯ ν•„λ“œλ§Œ μΆ”κ°€ν•΄μ£Όλ©΄ 됨.,
}
  •   
    • μ΄λ ‡κ²Œ ν•„λ“œλ§Œ μΆ”κ°€ν•˜λ©΄ 됨, SQL 은 JPA κ°€ μ•Œμ•„μ„œ μ²˜λ¦¬ν•΄μ€€λ‹€.
  • 4. νŒ¨λŸ¬λ‹€μž„μ˜ 뢈일치 ν•΄κ²°
    • JPA와 상속 

  •  
    •  https://gloria94682015.tistory.com/74   λ―Έλ¦¬ κ³΅λΆ€ν•œ λ‚΄μš©,
    • JPA κ°€ μ•Œμ•„μ„œ   INSERT INTO ELECS   와   INSERT INTO CELLPHONE   μœΌλ‘œ λ‚˜λˆ μ„œ 쿼리λ₯Ό 돌림.
  •  
    • JPA와 연관관계
//JPA와 연관관계
member.setTeam(team);
jpa.persist(member);
  •  
  •  
    • JPA와 객체 κ·Έλž˜ν”„ 탐색
//JPA와 객체 κ·Έλž˜ν”„ 탐색
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
  •  
    • μ—”ν‹°ν‹°λ₯Ό μ‹ λ’°ν•  수 μžˆλ‹€.
      • 이유 : JPA λŠ”   "μ§€μ—°λ‘œλ”©"    μ΄λΌλŠ” κΈ°λŠ₯이 있음.
      • member.getTeam() μ΄λ‚˜ member.getOrder().getDelivery() λ₯Ό ν•΄μ„œ 
      • μ‹€μ œλ‘œ 이 객체λ₯Ό μ‘°νšŒν•΄μ„œ μ‚¬μš©ν•˜λŠ” μ‹œμ μ— 쿼리가 λŒμ•„μ„œ 객체에 μ±„μ›Œμ§.

 

// JPA λ₯Ό μ‚¬μš©ν•˜λ©΄, μ—”ν‹°ν‹°λ₯Ό μ‹ λ’°ν•  수 있음.
class MemberService {
	public void process(){
    	Member member = memberDAO.find(memberId);
        member.getTeam(); // 자유둭게 객체 κ·Έλž˜ν”„λ₯Ό 탐색할 수 있음.
        member.getOrder().getDelivery();
    }
}

 

  •  
  •     
    • JPA와 λΉ„κ΅ν•˜κΈ°
      • λ™μΌν•œ νŠΈλžœμž­μ…˜μ—μ„œ μ‘°νšŒν•œ μ—”ν‹°ν‹°λŠ” κ°™μŒμ„ 보μž₯ν•΄μ€Œ.
  •  
  • 6. μ„±λŠ₯ μ΅œμ ν™” κΈ°λŠ₯
    • 1) 1μ°¨ μΊμ‹œμ™€ 동일성 보μž₯
      • 1️⃣ 같은 νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œλŠ” 같은 μ—”ν‹°ν‹°λ₯Ό λ°˜ν™˜ν•¨. --> ( μ•½κ°„μ˜ 쑰회 μ„±λŠ₯ ν–₯상 )
      • 2️⃣ DB Isolation Level 이 Read Commit 이어도 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ Repeatable Read  λ³΄μž₯.
        • λ­”κ°€ 되게 μ΄ν•΄ν•˜κΈ° μ–΄λ €μ›Œμ„œ,,, 일단, κ±΄λ„ˆλœ€. γ…Žγ…Ž;;...
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); // SQL
Member m2 = jpa.find(Member.class, memberId); // μΊμ‹œ

// m1 == m2

// SQL 을 1번만 싀행함.
  •     이 λ•Œμ˜ μΊμ‹œλŠ”, 기쑴에 μ•Œκ³  있던 μΊμ‹œμ™€λŠ” μ’€ 닀름.
    • ν•œ νŠΈλžœμ μ…˜μ˜ μ‹œμž‘ ~ 끝 μ‚¬μ΄μ—μ˜ 동일성을 보μž₯ν•˜λŠ” κ²ƒμœΌλ‘œ, μ•„μ£Ό 짧은 μΊμ‹œ 처리.
    •  
    • 2) νŠΈλžœμž­μ…˜μ„ μ§€μ›ν•˜λŠ” μ“°κΈ° μ§€μ—° - INSERT
      • 1️⃣ νŠΈλžœμž­μ…˜μ„ 컀밋할 λ•ŒκΉŒμ§€ INSERT SQL 을 λͺ¨μŒ.
      • 2️⃣ JDBC BATCH SQL κΈ°λŠ₯을 μ‚¬μš©ν•΄μ„œ ν•œλ²ˆμ— SQL 전솑.
      • μ˜΅μ…˜ ν•˜λ‚˜λ§Œ 켜주게 되면, νŽΈν•˜κ²Œ κ°€λŠ₯.
transaction.begin(); // νŠΈλžœμ μ…˜ μ‹œμž‘.

em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//persist둜 μ €μž₯을 ν•œλ‹€κ³  해도, λ°”λ‘œ INSERT SQL 을 DB에 보내지 μ•ŠμŒ.

// 컀밋을 ν•˜λŠ” μˆœκ°„, μŒ“μ•„λ‘μ—ˆλ˜ INSERT SQL을 DB에 λͺ¨μ•„μ„œ 보냄.
transaction.commit(); // νŠΈλžœμ μ…˜ 컀밋.
    • 2) νŠΈλžœμž­μ…˜μ„ μ§€μ›ν•˜λŠ” μ“°κΈ° μ§€μ—° - UPDATE
      • 1️⃣ UPDATE, DELETE 둜 μΈν•œ  λ‘œμš°(ROW)락 μ‹œκ°„ μ΅œμ†Œν™”
      • 2️⃣ νŠΈλžœμ μ…˜ 컀밋 μ‹œ UPDATE, DELETE SQL μ‹€ν–‰ν•˜κ³ , λ°”λ‘œ 컀밋.
      • LOCK ?
        • λ°μ΄ν„°μ˜ 일관성을 보μž₯ν•˜κΈ° μœ„ν•œ 방법.
      • ROW LOCK ? 
        • ν–‰ μˆ˜μ€€μ˜ 락은 1개의 행을 κΈ°μ€€μœΌλ‘œ 락 섀정을 함.
        • DML에 λŒ€ν•œ 락으둜 κ°€μž₯ 일반적으둜 μ‚¬μš©ν•˜λŠ” 락이라고 함.
transaction.begin(); // νŠΈλžœμ μ…˜ μ‹œμž‘.

changeMember(memberA);
deleteMember(memberB);
λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μˆ˜ν–‰(); // λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μˆ˜ν–‰ λ™μ•ˆ DB 둜우 락이 걸리지 μ•ŠμŒ.
//persist둜 μ €μž₯을 ν•œλ‹€κ³  해도, λ°”λ‘œ INSERT SQL 을 DB에 보내지 μ•ŠμŒ.

// 컀밋을 ν•˜λŠ” μˆœκ°„, μŒ“μ•„λ‘μ—ˆλ˜ UPDATE, DELETE SQL을 DB에 λͺ¨μ•„μ„œ 보냄.
transaction.commit(); // νŠΈλžœμ μ…˜ 컀밋.
  •  
    • 3) μ§€μ—°λ‘œλ”©
      • μ§€μ—° λ‘œλ”© : 객체가 μ‹€μ œ μ‚¬μš©λ  λ•Œ λ‘œλ”©.
      • μ¦‰μ‹œ λ‘œλ”© : JOIN SQL 둜 ν•œλ²ˆμ— μ—°κ΄€λœ κ°μ²΄κΉŒμ§€ 미리 쑰회.
      • JPA 에 μ˜΅μ…˜μ΄ 있음. 멀버λ₯Ό κ°€μ Έμ˜¬ λ•Œ, λŒ€λΆ€λΆ„ νŒ€μ„ κ°€μ Έμ˜¨λ‹€κ³  ν•˜λ©΄ μ¦‰μ‹œ λ‘œλ”©μ΄ μœ λ¦¬ν•˜λ‹ˆκΉŒ, 
      • μ˜΅μ„ μ„ μ£Όλ©΄ 됨.
// μ§€μ—°λ‘œλ”©
Member member = memberDAO.find(memberId); // select * from member
Team team = member.getTeam();
String teamName = team.getName(); // select * from team


// μ¦‰μ‹œ λ‘œλ”©
Member member = memberDAO.find(memberId); // select m.*, t.* from member join team on m.teamId = t.id
Team team = member.getTeam();
String teamName = team.getName();
  • 7. 데이터 μ ‘κ·Ό 좔상화와 벀더 독립성
  • 8. ν‘œμ€€

 

 

 

 

 

 

 

πŸ“ ?

  • γ…‡γ…‡

 

 

 


개발 곡뢀λ₯Ό μœ„ν•œ λΈ”λ‘œκ·Έ μž…λ‹ˆλ‹€. 

였λ₯˜κ°€ μžˆλ‹€λ©΄ λŒ“κΈ€λ‘œ μ•Œλ €μ£Όμ„Έμš”! 

κ°μ‚¬ν•©λ‹ˆλ‹€.

728x90