๐Ÿ“š [JPA] #1. JPA ์†Œ๊ฐœ

์ด๊ฐ€์€ยท2024๋…„ 5์›” 9์ผ
0

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
7/13
post-thumbnail

โœ” ๊ณผ๊ฑฐ์—๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋ ค๋ฉด ๋ณต์žกํ•œ JDBC API์™€ SQL์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ ์–ด์•ผ ํ–ˆ๋‹ค.
โœ” JdbcTemplate์ด๋‚˜ MyBatis ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฐœ๋ฐœ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์ค„์—ˆ์ง€๋งŒ SQL์€ ํ•˜๋‚˜ํ•˜๋‚˜ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋‹ค.
โœ” JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SQL ์กฐ์ฐจ๋„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. JPA๊ฐ€ ์ ์ ˆํ•œ SQL์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‹คํ–‰ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋œ๋‹ค.

๐Ÿ“• SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์˜ ๋ฌธ์ œ์ 

1. ๋ฌดํ•œ ๋ฐ˜๋ณต, ์ง€๋ฃจํ•œ ์ฝ”๋“œ
โ—พ CRUD ์ฟผ๋ฆฌ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•ด์•ผ๋œ๋‹ค. ๊ฐ์ฒด์— ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ์ฟผ๋ฆฌ๋“ค์— ํ•˜๋‚˜์”ฉ ์ผ์ผ์ด ๋‹ค ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
โ—พ ๊ด€๊ณ„ํ˜• DB(Oracle, MySQL)์—์„œ๋Š” SQL๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ SQL ์˜์กด์ ์ธ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

2. ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ (๊ฐ์ฒด vs ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)
โ—พ ๊ด€๊ณ„ํ˜• DB๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ •๊ตํ™”ํ•ด์„œ ์ €์žฅํ•˜๋Š”๊ฒŒ ๋ชฉ์ ์ด๊ณ , ๊ฐ์ฒด๋Š” ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ ๊ฐ™์€๊ฒŒ ๋ฌถ์—ฌ์„œ ์บก์Аํ™”ํ•ด์„œ ์“ฐ๋Š”๊ฒŒ ๋ชฉ์ ์ด๋‹ค.
โ—พ ๊ด€๊ณ„ํ˜• DB์˜ ๋ชฉ์ ๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ชฉ์ ์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํ˜„์‹ค์ ์ธ ๋ฐฉ์•ˆ์€ ๊ด€๊ณ„ํ˜• DB์ด๋‹ค.
โ—พ ๊ด€๊ณ„ํ˜• DB๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ SQL๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ Object๋ฅผ SQL๋กœ ์งœ์•ผํ•œ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์ด์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ์ฝ”๋“œ๋ฅผ ์†Œ๋น„ํ•œ๋‹ค๋Š” ๊ฒŒ ๋ฌธ์ œ๋‹ค.

๐Ÿ“– ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฐจ์ด

1. ์ƒ์†

โœ” ๊ฐ์ฒด์—๋Š” ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์žˆ์ง€๋งŒ, ๊ด€๊ณ„ํ˜• DB์—๋Š” ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค. ์Šˆํผํƒ€์ž… ์„œ๋ธŒํƒ€์ž… ๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ์ƒ์†๊ณผ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋กœ ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Album์„ DB์— ์ €์žฅํ•  ๊ฒฝ์šฐ
โ—ฝ ๊ฐ์ฒด๋ฅผ ๋ถ„ํ•ดํ•˜์—ฌ ITEM ํ…Œ์ด๋ธ” ์‚ฝ์ž… SQL๊ณผ ALBUM ํ…Œ์ด๋ธ” ์‚ฝ์ž… SQL, ์ด 2๊ฐœ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

Album์„ DB์—์„œ ์กฐํšŒํ•  ๊ฒฝ์šฐ
โ—ฝ ๊ฐ ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•˜๋Š” Join SQL์„ ์ž‘์„ฑํ•˜๊ณ  ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ, ๋‚˜์˜จ ๊ฐ’์„ ์ผ์ผ์ด ๊ฐ์ฒด์— ๋„ฃ๊ณ  ๊ทธ๋Ÿฐ ๋ณต์žกํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ DB์— ์ €์žฅํ•  ๊ฐ์ฒด์—๋Š” ์ƒ์† ๊ด€๊ณ„๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

Album์„ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์— ์ €์žฅํ•  ๊ฒฝ์šฐ

list.add(album);

Album์„ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์—์„œ ์กฐํšŒํ•  ๊ฒฝ์šฐ

Album album = list.get(albumId);

//๋ถ€๋ชจ ํƒ€์ž…์œผ๋กœ ์กฐํšŒ ํ›„ ๋‹คํ˜•์„ฑ ํ™œ์šฉ
Item item = list.get(albumId);

2. ์—ฐ๊ด€๊ด€๊ณ„

โœ” ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๊ณ , ํ…Œ์ด๋ธ”์€ PK, FK๋ฅผ ์‚ฌ์šฉํ•ด์„œ join์„ ํ†ตํ•ด ์—ฐ๊ด€๋œ ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•œ๋‹ค.

โ—ฝ ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉ : member.getTeam()
โ—ฝ ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ํ‚ค๋ฅผ ์‚ฌ์šฉ : JOIN ON M.TEAM_ID = T.TEAM_ID

๐ŸŽˆ ๊ฐ์ฒด๋ฅผ ํ…Œ์ด๋ธ”์— ๋งž์ถ”์–ด ๋ชจ๋ธ๋ง

class Member {
	String id; //MEMBER_ID ์ปฌ๋Ÿผ ์‚ฌ์šฉ
	Long teamId; //TEAM_ID FK ์ปฌ๋Ÿผ ์‚ฌ์šฉ
    String username; //USERNAME ์ปฌ๋Ÿผ ์‚ฌ์šฉ
}

class Team {
	Long id; //TEAM_ID PK ์‚ฌ์šฉ
	String name; //NAME ์ปฌ๋Ÿผ ์‚ฌ์šฉ
}

โ—ฝ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Join์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ž˜ํ‚ค์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ณด๊ด€ํ•ด๋„ ๋œ๋‹ค.
โ—ฝ ํ•˜์ง€๋งŒ ๊ฐ์ฒด๋Š” ์—ฐ๊ด€๋œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๋ณด๊ด€ํ•ด์•ผ ํ•œ๋‹ค.

๐ŸŽˆ ๊ฐ์ฒด๋‹ค์šด ๋ชจ๋ธ๋ง

class Member {
	String id; //MEMBER_ID ์ปฌ๋Ÿผ ์‚ฌ์šฉ
	Team team; //์ฐธ์กฐ๋กœ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค
    String username; //USERNAME ์ปฌ๋Ÿผ ์‚ฌ์šฉ
    
    Team getTeam() {
        return team;
    }
}

class Team {
	Long id; //TEAM_ID PK ์‚ฌ์šฉ
	String name; //NAME ์ปฌ๋Ÿผ ์‚ฌ์šฉ
}

โ—ฝ ์™ธ๋ž˜ ํ‚ค์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฐ๊ด€๋œ Team์˜ ์ฐธ์กฐ๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค.

๐ŸŽˆ ๊ฐ์ฒด ๋ชจ๋ธ๋ง ์กฐํšŒ

SELECT M.*, T.* FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
  
public Member find(String memberId) {
	//SQL ์‹คํ–‰ ...
    Member member = new Member();
    //๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•œ ํšŒ์› ๊ด€๋ จ ์ •๋ณด ์ž…๋ ฅ
    Team team = new Team();
    //๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•œ ํŒ€ ๊ด€๋ จ ์ •๋ณด ์ž…๋ ฅ
    
    //ํšŒ์›๊ณผ ํŒ€ ๊ด€๊ณ„ ์„ค์ •
    member.setTeam(team);
    return member;
}

โ—ฝ ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด๋‹ค์šด ๋ชจ๋ธ๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
โ—ฝ ์ด๋Ÿฌํ•œ ๊ณผ์ •๋“ค์€ ๋ชจ๋‘ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์†Œ๋ชจํ•˜๋Š” ๋น„์šฉ์ด๋‹ค. ๋งŒ์•ฝ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์— ํšŒ์› ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค๋ฉด ์ด๋Ÿฐ ๋น„์šฉ์ด ์ „ํ˜€๋“ค์ง€ ์•Š๋Š”๋‹ค.

๐ŸŽˆ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰
โ—ฝ ๊ฐ์ฒด๋Š” ์ž์œ ๋กญ๊ฒŒ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋Š” SQL์— ๋”ฐ๋ผ ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์—์„œ๋Š” ๊ทธ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๐ŸŽˆ ์—”ํ‹ฐํ‹ฐ ์‹ ๋ขฐ ๋ฌธ์ œ

class MemberService {
	public void process() {
        Member member = memberDAO.find(memberId);
        member.getTeam(); //???
        member.getOrder().getDelivery(); //???
    }
}

โ—ฝ getTeam()์™€ getOrder().getDelicery()๊ฐ€ null์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ์ด ์ฝ”๋“œ๋งŒ ๋ณด๊ณ ๋Š” ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.
โ—ฝ SQL์—์„œ ํƒ์ƒ‰๋œ ๊ฐ์ฒด ์ด์™ธ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋‹ค.
โ—ฝ ๊ณ„์ธต ์•„ํ‚คํ…์ณ์—์„œ๋Š” ์ด์ „ ๊ณ„์ธต์—์„œ ๋„˜์–ด์˜จ ๋‚ด์šฉ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์—์„œ๋Š” ๊ทธ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๊ฐ์ฒด๊ฐ€ SQL์— ์˜์กดํ•œ๋‹ค.

memberDAO.getMember(); //Member๋งŒ ์กฐํšŒ 

memberDAO.getMemberWithTeam(); //Member์™€ Team ์กฐํšŒ
 
//Member,Order,Delivery
memberDAO.getMemberWithOrderWithDelivery();

โ—ฝ ๊ทธ๋ ‡๋‹ค๊ณ  ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•  ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋™์ผํ•œ ํšŒ์› ์กฐํšŒ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๋ฒŒ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
โ—ฝ ์ฆ‰, ์ง„์ •ํ•œ ์˜๋ฏธ์˜ ๊ณ„์ธต ๋ถ„ํ• ์ด ์–ด๋ ต๋‹ค. ๋˜ํ•œ, ๊ฐ์ฒด๋‹ต๊ฒŒ ๋ชจ๋ธ๋ง ํ• ์ˆ˜๋ก ๋งคํ•‘ ์ž‘์—…๋งŒ ๋Š˜์–ด๋‚œ๋‹ค.

โ“ ๊ฐ์ฒด๋ฅผ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์— ์ €์žฅํ•˜๋“ฏ์ด DB์— ์ €์žฅํ•  ์ˆ˜๋Š” ์—†์„๊นŒ? ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ JPA(Java Persistence API)์ด๋‹ค.

3. ๋ฐ์ดํ„ฐ ํƒ€์ž…

4. ๋ฐ์ดํ„ฐ ์‹๋ณ„ ๋ฐฉ๋ฒ•

๐Ÿ“™ JPA ์†Œ๊ฐœ

๐Ÿ“– JPA๋ž€?

โ—ฝ Java Persistence API
โ—ฝ ์ž๋ฐ” ์ง„์˜์˜ ORM ๊ธฐ์ˆ  ํ‘œ์ค€

๐Ÿ“– ORM์ด๋ž€?

โ—ฝ Object-relational mapping(๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘)
โ—ฝ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด๋Œ€๋กœ ์„ค๊ณ„ํ•˜๊ณ , ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Œ€๋กœ ์„ค๊ณ„ํ•˜๊ณ , ORM ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ค‘๊ฐ„์—์„œ ๋งคํ•‘์„ ํ•ด์ค€๋‹ค.
โ—ฝ ๋Œ€์ค‘์ ์ธ ์–ธ์–ด์—๋Š” ๋Œ€๋ถ€๋ถ„ ORM ๊ธฐ์ˆ ์ด ์กด์žฌ

๐Ÿ“– JPA๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ JDBC ์‚ฌ์ด์—์„œ ๋™์ž‘

โ—ฝ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ JDBC API๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์•„๋‹Œ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JPA๊ฐ€ JDBC API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

JPA ๋™์ž‘ - ์ €์žฅ

โ—ฝ JPA์—๊ฒŒ MemberDAO์—์„œ Member ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹คํ•˜๋ฉด JPA๊ฐ€ Entity๋ฅผ ๋ถ„์„ ํ›„ Insert SQL ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  JDBC API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DB์— SQL์„ ๋ณด๋‚ธ๋‹ค.
โ—ฝ ์ฟผ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“œ๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  JPA๊ฐ€ ๋งŒ๋“ค์–ด์ค€๋‹ค.
โ—ฝ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•ด์ค€๋‹ค.

JPA ๋™์ž‘ - ์กฐํšŒ

โ—ฝ JPA์—๊ฒŒ MemberId 10๋ฒˆ์„ ์ฐพ์•„๋‹ฌ๋ผ๊ณ  ํ•˜๋ฉด JPA๊ฐ€ Member ๊ฐ์ฒด๋ฅผ ๋ณด๊ณ  ์ ์ ˆํ•œ ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  JDBC API๋ฅผ ํ†ตํ•ด DB๋กœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค. ๊ทธ๋ž˜์„œ ResultSet ๋งคํ•‘์„ ์ˆ˜ํ–‰ ํ›„ Entity Object๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
โ—ฝ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•ด์ค€๋‹ค.

JPA๋Š” ํ‘œ์ค€ ๋ช…์„ธ

โ—ฝ JPA๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ
โ—ฝ JPA 2.1 ํ‘œ์ค€ ๋ช…์„ธ๋ฅผ ๊ตฌํ˜„ํ•œ 3๊ฐ€์ง€ ๊ตฌํ˜„์ฒด : ํ•˜์ด๋ฒ„๋„ค์ดํŠธ, EclipseLink, DataNucleus

๐Ÿ“– JPA๋ฅผ ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

1. SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์—์„œ ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ

2. ์ƒ์‚ฐ์„ฑ - JPA์™€ CRUD

โœ” ํ•œ ์ค„๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋˜๊ธฐ์— ์ข‹์€ ์ƒ์‚ฐ์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋กœ ์ธํ•ด ์ปฌ๋ ‰์…˜์—์„œ ๋‹จ์ˆœํ•˜๊ฒŒ ์กฐํšŒ ํ›„ setName๋งŒ ํ˜ธ์ถœํ•˜์—ฌ update ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ €์žฅ: jpa.persist(member)
์กฐํšŒ: Member member = jpa.find(memberId)
์ˆ˜์ •: member.setName(โ€œ๋ณ€๊ฒฝํ•  ์ด๋ฆ„โ€)
์‚ญ์ œ: jpa.remove(member)

3. ์œ ์ง€๋ณด์ˆ˜ - ๊ธฐ์กด: ํ•„๋“œ ๋ณ€๊ฒฝ์‹œ ๋ชจ๋“  SQL ์ˆ˜์ •

โœ” ๊ธฐ์กด์—๋Š” ํ•„๋“œ ๋ณ€๊ฒฝ์‹œ ๋ชจ๋“  SQL ๋ฌธ์„ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ์ง€๋งŒ, JPA์—์„œ๋Š” ํ•„๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด SQL์€ JPA๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.

4. JPA์™€ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ

โœ” JPA์™€ ์ƒ์† : ํŠน์ • ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ๊ฒฝ์šฐ ์ƒ์† ๊ด€๊ณ„๋ฅผ JPA๊ฐ€ ๋ถ„์„ํ•˜์—ฌ ํ•„์š”ํ•œ ์ฟผ๋ฆฌ๋ฅผ JPA๊ฐ€ ์ƒ์„ฑํ•œ๋‹ค.
โœ” JPA์™€ ์—ฐ๊ด€๊ด€๊ณ„, JPA์™€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ : ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ, ๊ณ„์ธต์„ ์ œ๊ณตํ•œ๋‹ค.
โœ” JPA์™€ ๋น„๊ตํ•˜๊ธฐ : ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๋Š” ๊ฐ™์Œ์„ ๋ณด์žฅํ•œ๋‹ค.

5. JPA์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋Šฅ

๐ŸŽˆ 1์ฐจ ์บ์‹œ์™€ ๋™์ผ์„ฑ(identity) ๋ณด์žฅ
โ—ฝ ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ๋Š” ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ -> ์•ฝ๊ฐ„์˜ ์กฐํšŒ ์„ฑ๋Šฅ ํ–ฅ์ƒ
โ—ฝ DB Isolation Level์ด Read Commit์ด์–ด๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Repeatable Read ๋ณด์žฅ

๐ŸŽˆ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ(transactional write-behind)
โ—ฝ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•  ๋•Œ๊นŒ์ง€ INSERT SQL์„ ๋ชจ์Œ
โ—ฝ JDBC BATCH SQL ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ๋ฒˆ์— SQL ์ „์†ก
โ—ฝ UPDATE, DELETE๋กœ ์ธํ•œ ๋กœ์šฐ(ROW)๋ฝ ์‹œ๊ฐ„ ์ตœ์†Œํ™”
โ—ฝ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ UPDATE, DELETE SQL ์‹คํ–‰ํ•˜๊ณ , ๋ฐ”๋กœ ์ปค๋ฐ‹

๐ŸŽˆ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)๊ณผ ์ฆ‰์‹œ ๋กœ๋”ฉ(Eager Loading)

โ—ฝ ์ง€์—ฐ ๋กœ๋”ฉ: ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ ๋กœ๋”ฉ
-> ์‹ค์ œ Team ๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ ์ ‘๊ทผํ•  ๋•Œ Team ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ์˜ ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์–ด์˜ด
โ—ฝ ์ฆ‰์‹œ ๋กœ๋”ฉ: JOIN SQL๋กœ ํ•œ๋ฒˆ์— ์—ฐ๊ด€๋œ ๊ฐ์ฒด๊นŒ์ง€ ๋ฏธ๋ฆฌ ์กฐํšŒ
-> ํ•œ ๋ฒˆ์— join์„ ํ™œ์šฉํ•˜์—ฌ ์—ฐ๊ด€๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์–ด์˜ด

๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ

profile
๊ฐ€๋ฟก์ด์˜ ๊ณต๋ถ€ ์ƒ์ž๐Ÿ“ฆ

0๊ฐœ์˜ ๋Œ“๊ธ€