JDBC -> Mybatis, JdbcTemplate -> JPA는 훨씬 간단해지고 있다. 

 

2015년부터 jpa는 전세계 뿐만 아니라 국내 시장에서도 꾸준히 사용량이 높아지고 있다. 

우아한 형제들, 쿠팡, 카카오, 네이버 등에서 사용하고
조 단위의 거래금액이 발생하는 다양한 서비스에서 사용한다!

 

 

지금 시대는 객체를 관계형 DB에 관리하는 시대이다.

문제는 관계형 db가 알아들을 수 있는 sql을 알아야한다.

그러면 지루한 CRUD를 계속 해야한다.(insert into, update, select, delete ...)

테이블이 10개면 10번 해야되고......

자바 객체를 sql로, sql을 자바 객체로 무한 반복해야한다.

 

 

public class Member {
 private String memberId;
 private String name;
 private String tel; //갑자기 이 컬럼이 생기면 아래의 insert,select, update 다 수정해야된다.
 ...
}



INSERT INTO MEMBER(MEMBER_ID, NAME, TEL) VALUES
SELECT MEMBER_ID, NAME, TEL FROM MEMBER M
UPDATE MEMBER SET … TEL = ?

 

-> SQL에 의존적인 개발을 피하기 어렵다.

 

 

 

 

## 패러다임의 불일치 

객체 vs 관계형DB

 

객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.

객체는 rdb, nosql, file, ..등으로 저장할 수 있다.

근데 현실적으로 객체를 관계형 데이터베이스에 저장한다.

 

객체 => sql 변환 -> rdb에 저장

개발자는 그럼 거의 SQL 매퍼가 된다.

 

 

 

객체와 rdb의 차이

 

그나마 유사한거는 

객체 상속관계를 table의 슈퍼타입 서브타입 관계로 나타낼수 있다.

 

 

DB를 상속관계로 나타낸다면

insert할때나 조회할때 어려움이 생긴다.

ex) 각각의 테이블에 따른 조인 SQL 작성... 2. 각각의 객체 생성... 3. 상상만 해도 복잡 4. 더 이상의 설명은 생략한다

DB에 저장할 객체에는 상속 관계 안쓴다

 

db가 아니라 자바 컬렉션에 저장하면?

 

list.add(album);c

Album album = list.get(albumId);

Item item = list.get(albumId)

 

 

 

 

 

## 연관관계

 

객체는 참조를 사용: 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 컬럼 사용
}

INSERT INTO MEMBER(MEMBER_ID, TEAM_ID, USERNAME) VALUES …

 

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 컬럼 사용
}



member.getTeam().getId();
INSERT INTO MEMBER(MEMBER_ID, TEAM_ID, USERNAME) VALUES …



근데 문제는 조회할때
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;
}

 

 

객체 모델링, 자바 컬렉션에 관리

list.add(member);

Member member = list.get(memberId);

Team team = member.getTeam();

 

 

 

 

 

 

##엔티티 신뢰 문제

 

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

member.~~ 가  안될수도 있다.(처음 sql문을 어떻게 정의했는지에 따라)

모든 객체를 미리 로딩할 수는 없다.

 

 

 

String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1 == member2; //다르다.
class MemberDAO {
 
 public Member getMember(String memberId) {
 String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = ?";
 ...
 //JDBC API, SQL 실행
 return new Member(...);
 }
}
String memberId = "100";
Member member1 = list.get(memberId);
Member member2 = list.get(memberId);
member1 == member2; //자바 컬렉션에서는 같다.

 

 

 

 

 

 

즉,, 객체답게 모델링 할수록 매핑 작업만 늘어난다.

 

객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수는 없을까?  ->>>> JPA의 등장

'BackEnd > JPA' 카테고리의 다른 글

Exception in thread "main" java.lang.NoClassDefFoundError 오류  (0) 2022.03.14
엔티티 매핑  (0) 2022.03.13
영속성 컨텍스트  (0) 2022.03.13
JPQL  (0) 2022.03.13
jpa 기초  (0) 2022.03.13

+ Recent posts