- CRUD ์ฉ SQL ์์ โ ๋ฐ๋ณต์์ , ๋น์ฆ๋์ค ๋ก์ง ์์ < SQL ์์ฑ ์๊ฐ
- ์ง๋ฃจํ๊ณ ๋น์์ฐ์ ์
- ๊ฐ์ฒด ๋ชจ๋ธ๋ง๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ฌ์ด์ ์ฐจ์ด์ ํด๊ฒฐ
- ์คํ ์์ ์ ์๋์ผ๋ก SQL ๋ง๋ค์ด์ ์คํ โ SQL์ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋ค SQL ์คํ
- ๊ฐ์ฒด ์ค์ฌ์ ๊ฐ๋ฐ โ ์์ฐ์ฑ, ์ ์ง๋ณด์ ๐
- ํ ์คํฌ ์ฉ์ด
์๊ตฌ์ฌํญ : ํ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ โ CRUD ๊ธฐ๋ฅ ๊ฐ๋ฐ
ํ์ ๊ฐ์ฒด(Member)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ DAO ๊ฐ์ฒด
public class Member {
private String memberId;
private String name;
// ..
}
public class MemberDAO {
public Member find(String memberId)
{ ... }
}
1. ํ์ ์กฐํ์ฉ SQL ์์ฑ select member_id, name from member where member_id = ? 2. JDBC API๋ฅผ ์ฌ์ฉํ์ฌ SQL ์คํ ResultSet rs = stmt.excuteQuery(sql); 3. ์ฟผ๋ฆฌ ์กฐํ ๊ฒฐ๊ณผ์ Member ๊ฐ์ฒด ๋งคํ String memberId = rs.getString("member_id"); String name = rs.getString("name");
Member member = new Member(); member.setMemberId(memberId); member.setName(name); // ...
๊ฐ์ฒด๋ฅผ DB์ CRUD๋ฅผ ํ๋ ค๋ฉด ๋๋ฌด ๋ง์ SQL๊ณผ JDBC API๋ฅผ ์ฝ๋๋ก ์์ฑํด์ผํจ
์๊ตฌ ์ฌํญ : ๊ธฐ์กด ํ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ + ํ์ ์ฐ๋ฝ์ฒ ์ ์ฅ ์ถ๊ฐ
public class Member {
private String memberId;
private String name;
private String tel; // ์ถ๊ฐ๋ ํ๋
}
1. ์ฐ๋ฝ์ฒ ์ ์ฅ INSERT SQL ์์ ๋ฐ ๋ฑ๋ก SQL์ ์ ๋ฌ String sql = "insert into member(member_id, name, tel) values (?, ?, ?); psmt.setString(3, member.getTel()); 2. ์กฐํ ์ฝ๋ ๋ณ๊ฒฝ select member_id, name, tel from member where member_id = ? ... String tel = rs.getString("tel"); member.setTel(tel); // ์ถ๊ฐ 3. ์์ ์ฝ๋ ๋ณ๊ฒฝ 4. ์ฐ๊ด ๊ฐ์ฒด Team ๊ฐ์ฒด๊ฐ Member ๊ฐ์ฒด์ ์ถ๊ฐ๋๋ค๋ฉด(์ฐ๊ด๋ ๋) member.getTeam().getTeamName(); โ null ****select m.member_id, m.name, m.tel, m.team_id, t.team_name from member m from member m join team t on m.team_id = t.team_id โ Member ๊ฐ์ฒด๊ฐ ์ฐ๊ด๋ Team ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์์ง ์์์ง๋ ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ SQL์ ๋ฌ๋ ค์๋ค. ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ ์ฌ์ฉํด SQL์ ์จ๊ฒจ๋, ์ด์ฉ ์ ์์ด DAO๋ฅผ ์ด์ด ์ด๋ค SQL์ด ์คํ๋๋์ง ํ์ธ๋์ด์ผํ๋ค.
SQL์ ๋ชจ๋ ๊ฒ์ ์์กดํ๋ ์ํฉ์์, DAO๋ฅผ ์ด์ด ์ด๋ค SQL์ด ์คํ๋๊ณ , ์ด๋ค ๊ฐ์ฒด๋ค์ด ํจ๊ป ์กฐํ๋๋์ง ํ์ธํด์ผ ํ๋ฏ๋ก, ๊ฐ๋ฐ์๋ค์ด ์ํฐํฐ(๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๋ชจ๋ธ๋งํ ๊ฐ์ฒด)๋ฅผ ์ ๋ขฐํ ์ ์๋ค. ์ด ๊ฒ์ ์ง์ ํ ์๋ฏธ์ ๊ณ์ธต ๋ถํ ์ด ์๋๋ค.
- ์ง์ ํ ์๋ฏธ์ ๊ณ์ธต ๋ถํ ์ด ์ด๋ ต๋ค
- ์ํฐํฐ๋ฅผ ์ ๋ขฐํ ์ ์๋ค.
- SQL์ ์์กด์ ์ธ ๊ฐ๋ฐ์ ํผํ ์ ์๋ค.
-
DDD
MDD
Entity โ Id (์๋ณํ ์ ์๋ ๊ฐ์ฒด)
VO โ ์๋ณํ ์ ์์. ๊ณต์ ํ๋ ์ฃผ์
Service โ ํ์ฉ์ฌ? (MVC์ ์๋น์ค์๋ ๋น์ทํ๋ฉด์ ๋ค๋ฅธ?)
Specification(๋ช ์ธ) ?
์ฌ๋์ด ๋ฌธ์ ์ฐ๋ค โ Service : ์ฐ๋ฆฌ ์ง์
๋ช ์ฌ ๋ฌธ class ๋์ฌ
โ open(Person)
CRUD ์์ ์ ํ ๋, ๊ฐ๋ฐ์๊ฐ ์ง์ SQL์ด ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ JPA๊ฐ ์ ๊ณตํ๋ API๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชฉ์ , ๊ธฐ๋ฅ, ํํ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๋ฏ๋ก, ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ํ ์ด๋ธ ๊ตฌ์กฐ์ ์ ์ฅํ๋ ๋ฐ ํ๊ณ๊ฐ ์๋ค.
๋ฌธ์ > ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ์ ์ํ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ธ๋ถ์ ์ ์ฅํ ๋ ๋ฐ์
๊ตฌ์กฐ - ์์ฑ(ํ๋)
, ๊ธฐ๋ฅ(๋ฉ์๋)
๋ฐ์ดํฐ ์ค์ฌ์ผ๋ก ๊ตฌ์กฐํ, ์งํฉ์ ์ฌ๊ณ ์๊ตฌ
๊ฐ์ฒด๋ ์์์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์์ผ๋ ํ ์ด๋ธ์ ์์์ด ์๋ค.
abstract class Item {
Long id;
String name;
int price;
}
class Album extends Item {
String artist;
}
class Movie extends Item {
String director;
String actor;
}
class Book extends Item {
String author;
String isbn;
}
๋ง์ฝ, Album ๊ฐ์ฒด๋ Movie, Book ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ค๋ฉด, Item๊ณผ ์์๋ฐ๋ ๊ฐ์ฒด๋ฅผ ๋ถํดํ์ฌ ๋ SQL์ ๋ง๋ค์ด์ผ ํ๋ค.
insert into item ...
insert into album ...
์กฐํ ์ญ์ item๊ณผ album ํ ์ด๋ธ์ ์กฐ์ธํ์ฌ ์กฐํํ ๋ค์, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํตํด Album ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค. โ ํจ๋ฌ๋ค์ ๋ถ์ผ์น ํด๊ฒฐ์ ์ํด ์๋ชจํ๋ ๋น์ฉ
JPA๋ ์์๊ฐ์ ์์ ๊ด๋ จ ํจ๋ฌ๋ค์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
jpa.persist(album);
persist()
๋ฉ์๋๋ฅผ ์คํํ๋ฉด ์์์์ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ JPA๊ฐ ๋์ ํด์ค๋ค.
๊ฐ์ฒด๋ ์ฐธ์กฐ
๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ด๊ด๊ณ
๋ฅผ ๊ฐ์ง๊ณ , ์ฐธ์กฐ
์ ์ ๊ทผํ์ฌ ์ฐ๊ด๋ ๊ฐ์ฒด
๋ฅผ ์กฐํํ๋ค.
ํ
์ด๋ธ์ ์ธ๋ ํค
๋ฅผ ์ฌ์ฉํด์ ๋ค๋ฅธ ํ
์ด๋ธ๊ณผ ์ฐ๊ด๊ด๊ณ
๋ฅผ ๊ฐ์ง๊ณ , ์กฐ์ธ
์ ์ฌ์ฉํด์ ์ฐ๊ด๋ ํ
์ด๋ธ
์ ์กฐํํ๋ค.
์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฒด์ ์ธ๋ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋, ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ๋ง์ ํฌ๊ธฐํ๊ฒ ๋ง๋ค ์ ๋๋ก ๊ทน๋ณตํ๊ธฐ ์ด๋ ต๋ค.
๊ฐ์ฒด >
Member
์ Member.team
ํ๋์, Team
๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๋ณด๊ดํ์ฌ, Team
๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ๋งบ๋๋ค. ๋ฐ๋ผ์ ์ด ์ฐธ์กฐ ํ๋์ ์ ๊ทผํ๋ฉด Member
์ ์ฐ๊ด๋ Team
์ ์กฐํํ ์ ์๋ค.
ํ ์ด๋ธ >
MEMBER
ํ
์ด๋ธ์ MEMBER.TEAM_ID
์ธ๋ ํค ์ปฌ๋ผ์ ์ฌ์ฉํ์ฌ, TEAM
ํ
์ด๋ธ๊ณผ ๊ด๊ณ๋ฅผ ๋งบ๋๋ค.
์ด ์ธ๋ํค๋ฅผ ์ฌ์ฉํ์ฌ MEMBER
ํ
์ด๋ธ๊ณผ TEAM
ํ
์ด๋ธ์ ์กฐ์ธํ๋ฉด MEMBER
ํ
์ด๋ธ๊ณผ ์ฐ๊ด๋ TEAM
ํ
์ด๋ธ์ ์กฐํํ ์ ์๋ค.
์ฐจ์ด์ >
team.getMember()
๋ ๋ถ๊ฐ๋ฅํ์ง๋ง, ์ธ๋ํค ํ๋๋ก TEAM JOIN MEMBER
๋ ๊ฐ๋ฅํ๋ค.
class Member {
String id;
Long teamId; // TEAM_ID FK
String username;
}
class Team {
Long id;
String name;
}
์์ ๊ฐ์ด ๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ์ ๋ง์ถ์ด ๋ชจ๋ธ๋งํ๋ฉด, ๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ์ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ ๋๋ ํธ๋ฆฌํ์ง๋ง, ๊ฐ์ฒด์งํฅ์ ์ธ ๋ฐฉ๋ฒ์ ์๋๋ค.
๊ฐ์ฒด๋ ์ฐ๊ด๋ ์ฐธ์กฐ๋ฅผ ๋ณด๊ดํด์ผ, ์ฐธ์กฐ๋ฅผ ํตํด ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์๋ค.
Team team = member.getTeam();
์ด๋ฌํ ์ฐธ์กฐ๋ฅผ ํตํ ์กฐํ๊ฐ ๊ฐ์ฅ ๊ฐ์ฒด์งํฅ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
class Member {
String id;
Team team;
String username;
Team getTeam() {
return team;
}
}
class Team {
Long id;
String name;
}
Member.team์ ํ๋๋ ์ธ๋ ํค์ ๊ฐ์ ๊ทธ๋๋ก ๋ณด๊ดํ๋ ๊ฒ์ด ์๋, Team์ ์ฐธ์กฐ๋ฅผ ๋ณด๊ดํ๋ค,
์ด์ฒ๋ผ ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ๋ง์ ์ฌ์ฉํ๋ฉด, ๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ์ ์ ์ฅ or ์กฐํ ํ๋ ๊ฒ์ ์ฝ์ง ์๋ค.
JPA๋ ์ฐ๊ด๊ด๊ณ์ ๊ด๋ จ๋ ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
: ๊ฐ์ฒด์ ์ฐธ์กฐ
โ ์ธ๋ํค
๋ก ๋ณํ
๊ฐ์ฒด ๊ทธ๋ํ ํ์์ด๋?
Team team = member.getTeam();
MemberDAO์์ ํ์๊ณผ ํ์ ๋ํด์๋ง ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๊ฒฝ์ฐ, member.getTeam()์ ๋ํ ์กฐํ๋ ์ฑ๊ณตํ์ง๋ง, member.getOrder()๋ ์คํจํ๋ค.
SQL์ ์ง์ ๋ค๋ฃจ๋ฉด, ์ฒ์ ์คํํ๋ SQL์ ๋ฐ๋ผ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ด๋๊น์ง ํ์ํ ์ ์๋์ง ์ ํด์ง๋ค. โ ๊ฐ์ฒด์งํฅ์์๋ ์ ์ฝ
- ๋น์ฆ๋์ค ๋ก์ง์ ๋ฐ๋ผ ์ฌ์ฉํ๋ ๊ฐ์ฒด ๊ทธ๋ํ๊ฐ ๋ค๋ฆ
- ์ธ์ ๋์ด์ง์ง ๋ชจ๋ฅด๋ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํจ๋ถ๋ก ํ์ํ ์ ์๋ค.
JPA๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์์ ์ ์ ์ ํ SELECT SQL์ ์คํ
- ์ฐ๊ด๋ ๊ฐ์ฒด 1) ์ฆ์ ์กฐํ(Eager Loading), 2) ์ค์ ์ฌ์ฉํ๋ ์์ ์ ์ง์ฐ ์กฐํ(Lazy Loading)ํ ์ง ์ค์ ์ ํตํด ์ ์
DB โ PK๋ฅผ ํตํด ๊ฐ row๊ตฌ๋ถ
๊ฐ์ฒด โ ๋์ผ์ฑ, ๋๋ฑ์ฑ ๋น๊ต
๋์ผ์ฑ ๋น๊ต
๋==
๋น๊ต โ๊ฐ์ฒด ์ธ์คํด์ค ์ฃผ์ ๊ฐ
๋น๊ต๋๋ฑ์ฑ ๋น๊ต
โequals()
๋ฅผ ํตํ๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ
๋น๊ต
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1 โ member2
JPA๋ ๊ฐ์ ํธ๋์ญ์ ์ผ ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์กฐํ๋๋ ๊ฒ์ ๋ณด์ฅ
๋ฐ๋ผ์ member1 = member2
JPA(Java Persistence API)๋ ์๋ฐ์ ORM ๊ธฐ์ ํ์ค์ด๋ค. ORM์, Object-Relational Mapping ์ด๋ฆ ๊ทธ๋๋ก ๊ฐ์ฒด โ RDBMS๋ฅผ ๋งคํํ๋ค๋ ๋ป์ด๋ค. ORM ํ๋ ์์ํฌ๋ ์์ ๊ฐ์ด ๊ฐ์ฒด์ ํ ์ด๋ธ์ ๋งคํํ์ฌ ๋ ์ฌ์ด์ ํจ๋ฌ๋ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ค๋ค.
์๋ฐ ์ง์์ ์คํ์์ค ORM ํ๋ ์์ํฌ
EJB์ ORM์ด์๋ ์ํฐํฐ ๋น๊ณผ ๋น๊ตํ์ ๋, ๊ฐ๋ณ๊ณ ์ค์ฉ์ ์ด๋ฉฐ ๊ธฐ์ ์ฑ์๋๋ ๋์, ์๋ฐ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ ์์ด๋ ๋์
โ EJB 3.0์์ ํ์ด๋ฒ๋ค์ดํธ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ์๋ฐ ORM ํ์ค ํ์ โ JPA!
JPA๋ ์๋ฐ ORM ๊ธฐ์ ์ ๋ํ ํ์ค ๋ช ์ธ
โ ์ธํฐํ์ด์ค๋ฅผ ๋ชจ์๋ ๊ฒ
โ ์ด ์ธํฐํ์ด์ค๋ค์ ๊ตฌํํ ํ๋ ์์ํฌ๊ฐ ํ์ด๋ฒ๋ค์ดํธ
์ง๋ฃจํ๊ณ ๋ฐ๋ณต์ ์ธ ์ฝ๋์ CRUD์ฉ SQL์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํ์ง ์์๋ O
๊ฐ์ฒด ์ค๊ณ ์ค์ฌ์ ๊ฐ๋ฐ ๊ฐ๋ฅ
๊ธฐ์กด์๋ ์ํฐํฐ์ ํ๋ ํ๋๋ง ์ถ๊ฐํด๋ CRUD SQL๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋งคํํ๊ธฐ ์ํ JDBC API ์ฝ๋๋ฅผ ์ ๋ถ ๋ณ๊ฒฝํด์ผ ํ์ง๋ง, JPA๋ ๋์ ์ฒ๋ฆฌํด์ฃผ์ด ์์ ํด์ผํ ์ฝ๋๊ฐ ์ค์ด๋ ๋ค
JPA ์์ด๋ ๊ฐ์ ํธ๋์ญ์ ์์์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ ๋ฒ ์กฐํ ํ์ด์ผ ํ์ง๋ง, JPA๋ฅผ ํตํด ํ ๋ฒ๋ง DB์ ์กฐํํ ๋ค, ๊ทธ ๋ค๋ก๋ ๊ธฐ์กด์ ์กฐํํ ๊ฐ์ฒด ์ฌ์ฉ ๊ฐ๋ฅ
RDBMS๋ ๊ฐ์ ๊ธฐ๋ฅ๋ ๋ฒค๋๋ง๋ค ์ฌ์ฉ๋ฒ์ด ๋ค๋ฅด๋ค.
ํ์ง๋ง JPA๋ ํน์ DB ๊ธฐ์ ์ ์ข ์๋์ง X
๋ฐฉ์ธ ์ค์ ์ ํด์ฃผ๋ฉด ๋๋ค.