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