ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

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

  1. ๋ฐ˜๋ณต์ ์ธ CRUD ์ฟผ๋ฆฌ ์ž‘์„ฑ ๋ฐ ์ˆ˜์ •
    • ์ง€์†์ ์œผ๋กœ CRUD ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.
  2. ์ž๋ฐ” ๊ฐ์ฒด์™€ SQL ๊ฐ„์˜ ๋ณ€ํ™˜
    • ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ SQL ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , SQL ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ณผ์ •์ด ๋ฐ˜๋ณต๋œ๋‹ค.

๐Ÿ’ป  ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜

  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฐจ์ด
    • ์ƒ์†
    • ์—ฐ๊ด€๊ด€๊ณ„
    • ๋ฐ์ดํ„ฐ ํƒ€์ž…
    • ๋ฐ์ดํ„ฐ ์‹๋ณ„ ๋ฐฉ๋ฒ•

1. ์ƒ์†

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

๋ฌธ์ œ ๋ฐœ์ƒ

  • Album ๊ฐ์ฒด ์ €์žฅ: Album ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด, Album๊ณผ ์ƒ์œ„ ํด๋ž˜์Šค์ธ Item์œผ๋กœ ๋ถ„ํ•ดํ•˜์—ฌ ๋‘ ๊ฐœ์˜ INSERT ๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • Album ๊ฐ์ฒด ์กฐํšŒ: Album ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด, Item๊ณผ Album ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๋Š” SQL์„ ์ž‘์„ฑํ•˜๊ณ , ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” Movie์™€ Book ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

JPA๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

  • ์ €์žฅ: JPA๋Š” ํ•˜์œ„ ํƒ€์ž…์„ ์ €์žฅํ•  ๋•Œ ์ƒ์œ„ ๋ฐ ํ•˜์œ„ ํƒ€์ž…์— ํ•ด๋‹นํ•˜๋Š” INSERT ๋ฌธ์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํžˆ ๋ถ„ํ•  ์ €์žฅํ•œ๋‹ค.

  • ์กฐํšŒ: ์กฐํšŒ ์‹œ์—๋Š” ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

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

  • ๊ฐ์ฒด: ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค.
  • ํ…Œ์ด๋ธ”: ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค.

๋ฌธ์ œ ๋ฐœ์ƒ

  • ํ…Œ์ด๋ธ” ์ค‘์‹ฌ ๋ชจ๋ธ๋ง: ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ ํ‚ค ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๊ณ„๋ฅผ ๋งบ์ง€๋งŒ, ์ด๋กœ ์ธํ•ด ๊ฐ์ฒด ๊ฐ„ ์ฐธ์กฐ๊ฐ€ ์—†์–ด member.getTeam()์„ ํ†ตํ•œ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    class Member {
        String id; //MEMBER_ID ์ปฌ๋Ÿผ ์‚ฌ์šฉ
        Long teamId; //TEAM_ID FK ์ปฌ๋Ÿผ ์‚ฌ์šฉ //**
        String username;//USERNAME ์ปฌ๋Ÿผ ์‚ฌ์šฉ
    }
    class Team {
        Long id; //TEAM_ID PK ์‚ฌ์šฉ
        String name; //NAME ์ปฌ๋Ÿผ ์‚ฌ์šฉ
    }
  • ๊ฐ์ฒด์ง€ํ–ฅ ๋ชจ๋ธ๋ง: ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ†ตํ•œ ๋ชจ๋ธ๋ง์€ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‚˜, ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ SQL ๋ณ€ํ™˜ ์ž‘์—…์ด ๋ณต์žกํ•ด์ง„๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— INSERT ํ•˜๊ธฐ ์œ„ํ•ด์„  member.getTeam().getId()๋ฅผ ํ•ด์•ผํ•œ๋‹ค.
    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 ์ปฌ๋Ÿผ ์‚ฌ์šฉ
    }

JPA๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

  • JPA๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ์ฐธ์กฐ๋ฅผ ์™ธ๋ž˜ ํ‚ค๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ SQL ์ž‘์„ฑ์„ ์ž๋™ํ™”ํ•˜๊ณ , ์กฐํšŒ ์‹œ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ฐ์ฒด ์ฐธ์กฐ๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค.

3. ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

  • ๊ฐ์ฒด๋Š” ์ž์œ ๋กญ๊ฒŒ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๊ฐ์ฒด์—์„œ ์†Œ์†๋œ ํŒ€์„ ์กฐํšŒํ•˜๋ ค๋ฉด ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ์—ฐ๊ด€๋œ ํŒ€์„ ์ฐพ๋Š”๋‹ค.

๋ฌธ์ œ ๋ฐœ์ƒ

  • SQL์„ ์ง์ ‘ ๋‹ค๋ฃฐ ๊ฒฝ์šฐ, ์ฒ˜์Œ ์‹คํ–‰ํ•œ SQL์— ๋”ฐ๋ผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„์˜ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Member์™€ Team๋งŒ ์กฐ์ธํ•œ SQL์—์„œ๋Š” member.getTeam()์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฐ์ฒด ํƒ์ƒ‰์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
SELECT M.*, T.* 
   FROM MEMBER M
   JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
   
   
member.getTeam(); //OK 
member.getOrder(); //null
  • ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋™์ผํ•œ ํšŒ์› ์กฐํšŒ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๋ฒŒ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. --> ์ผ€์ด์Šค๊ฐ€ ํ•œ๋‘๊ฐœ๊ฐ€ ์•„๋‹˜ --> ์ง„์ •ํ•œ ์˜๋ฏธ์˜ ๊ณ„์ธต ๋ถ„ํ• ์ด ์–ด๋ ค์›Œ์ง

JPA๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

  • JPA๋Š” ์‹ค์ œ ๊ฐ์ฒด ์‚ฌ์šฉ ์‹œ์ ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ๋ฏธ๋ฃจ๋Š” ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ํ•„์š”ํ•  ๋•Œ ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

4. ๋น„๊ต

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: ๊ฐ ๋กœ์šฐ(row)๋Š” ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.
  • ๊ฐ์ฒด: ๊ฐ์ฒด๋Š” ์ฃผ์†Œ ๊ฐ’(๋™์ผ์„ฑ ==)๊ณผ ๋‚ด๋ถ€ ๊ฐ’(๋™๋“ฑ์„ฑ equals())์œผ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ œ ๋ฐœ์ƒ

  • ๊ฐ™์€ ํ‚ค์˜ Member ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์กฐํšŒํ•˜๋ฉด, ๊ฐ ์กฐํšŒ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋น„๊ต ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);

member1 == member2; //๋‹ค๋ฅด๋‹ค.

JPA๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

  • JPA๋Š” ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋™์ผํ•œ ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•œ ์กฐํšŒ ์‹œ ๊ฐ™์€ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•จ์„ ๋ณด์žฅํ•œ๋‹ค. ์ด๋กœ์จ ๊ฐ์ฒด ๋น„๊ต์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’กJPA์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋Šฅ

1. 1์ฐจ ์บ์‹œ์™€ ๋™์ผ์„ฑ ๋ณด์žฅ

  • ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ๋Š” ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. -> ์•ฝ๊ฐ„์˜ ์กฐํšŒ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • DB Isolation Level์ด Read Commit์ด์–ด๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Repeatable Read ๋ณด์žฅ

๊ฐ™์€ ๋ฉค๋ฒ„๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋˜๋ฉด ์ฒ˜์Œ์—๋Š” SQL ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜๊ฐ€๊ฒŒ ๋˜๊ณ , ๊ทธ ๋‹ค์Œ์œผ๋กœ๋Š” JPA๊ฐ€ SQL์„ ๋‚ ๋ฆฌ์ง€ ์•Š๊ณ  JPA๊ฐ€ ๋“ค๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ๋“ค๊ณ  ์™€์„œ ๋ฐ˜ํ™˜์„ ํ•ด์ค€๋‹ค. ์ฆ‰, SQL์€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰์ด ๋œ๋‹ค.

 

2. ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ

INSERT

  • ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•  ๋•Œ๊นŒ์ง€ INSERT SQL์„ ๋ชจ์€๋‹ค.
  • JDBC BATCH SQL ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ ๋ฒˆ์— SQL์„ ์ „์†กํ•œ๋‹ค.

 

 UPDATE

  • UPDATE, DELETE๋กœ ์ธํ•œ ๋กœ์šฐ(ROW)๋ฝ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•œ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ UPDATE, DELETE SQL์„ ์‹คํ–‰ํ•˜๊ณ , ๋ฐ”๋กœ ์ปค๋ฐ‹ํ•œ๋‹ค.

 

3. ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)

  • ์ง€์—ฐ ๋กœ๋”ฉ: ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ ๋กœ๋”ฉ๋œ๋‹ค. (ex. ๋ฉค๋ฒ„๋ฅผ ์กฐํšŒํ•  ๋•Œ ํŒ€์€ ์ž˜ ์กฐํšŒ๋ฅผ ์•ˆํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋‹จ ๋ฉค๋ฒ„๋งŒ ๋จผ์ € ์กฐํšŒํ•˜๊ณ , ํŒ€์ด ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ ์กฐํšŒ)
  • ์ฆ‰์‹œ ๋กœ๋”ฉ: JOIN SQL๋กœ ํ•œ๋ฒˆ์— ์—ฐ๊ด€๋œ ๊ฐ์ฒด๊นŒ์ง€ ๋ฏธ๋ฆฌ ์กฐํšŒ (ex. ๋ฉค๋ฒ„๋ž‘ ํŒ€์€ ๊ฑฐ์˜ ๋ฌด์กฐ๊ฑด ๊ฐ™์ด ์“ฐ๋Š” ๊ฒฝ์šฐ ๋ฉค๋ฒ„๋ฅผ ์กฐํšŒํ•˜๋Š” ์ˆœ๊ฐ„ ํŒ€๋„ ๊ฐ™์ด ์กฐํšŒ)

 

JPA ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ๋ณดํ†ต ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์ซ™ ์„ธํŒ…์„ ํ•ด๋†“๋‹ค๊ฐ€, ๋‚˜์ค‘์— ์„ฑ๋Šฅ์„ ๋ณด๊ณ  ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๋กœ ํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹คํ•˜๋ฉด ๊ฑฐ๊ธฐ๋งŒ ์ฆ‰์‹œ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •ํ•ด์ค˜์„œ ์ตœ์ ํ™”๋ฅผ ํ•œ๋‹ค.