JPA는 모던 자바 데이터 저장기술
현대에 애플리케이션을 만들땐 "객체 지향 언어"를 사용한다.
거기에 관계형 DB도 함꼐 사용하는데
지금 시대는 객체를 관계형 DB에 넣어서 관리하는 시대이다.
이때 관계형 DB는 SQL만을 알아들을수 있다.
SQL 중심적인 개발의 문제점
1.CRUD의 무한반복 , 지루한 코드
이에 따른 객체 CRUD의 예
VO
public class Member {
private String memberID;
private String name;
}
sql
INSERT INTO MEMBER (member_id , name) VALUES~
SELECT MEMBER_Id , NAME FROM MEMBER m ~
UPDATE MEMBER SET~
문제점.
개발이후 추가 컬럼이 생기면 VO와 쿼리 모두를 수정해야한다 .수정하지않으면 오류를 반환
이런 현상은 sql에 의존적인 개발을 피하기 어렵다,
2.패러다임의 불일치
객체지향과 관계형 DB는 발생한 사상자체가 다르다.
관계형 DB는 데이터를 잘 정규화 해서 잘 보관하는게 목표고
객체는 속성과 기능 , 필드와 메서드가 묶여서 캡슐화 하는게 목표다.
객체지향 프로그래밍은 추상화 , 캡슐화 , 정보은닉 , 상속 , 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
그럼 객체를 DB에 저장한다면 어떤 DB에 넣어도 되지만 현실적인 대안은 관계형 DB이다.
즉 문제는 객체를 SQL화 하여 넣는게 문제다.
보통은 개발자가 SQL을 작성한다.
3.객체와 관계형 DB의 차이
상속이란 개념이 객체엔 있고 관계엔 없다
연관관계 , 객체엔 참조가 있고 , 관계는 PK나 FK로 조인하는등 이런 관계를 DB에 넣어야 한다.
그나마 유사한게 DB에 table 슈퍼타입 , 서브타입 관계가 있다,
예를 들어 ITEM의 파생 Album , Movie , Book가 있다고 할때
insert를 Item에도 한번 하위 객체들에도 각각 한번씩 해주어야 한다.(상속이 없기 때문)
여기서 문제는 데이터를 조회할때 부모자식을 조합식에 맞게 계속 JOIN해 주어야한다.
이 과정이 너무 복잡해서 DB저장엔 객체의 상속관계를 사용하지 않는다.
그런데 이 복잡한걸 DB가 아니라 자바 Collection에 저장한다면 복잡하지 않아진다.
추가 : list.add(album)
조회 : Album album = list.get(albumId);
부모타입으로 조회
Item item = list.get(albumId);
연관관계
객체는 연관관계에 참조를 사용한다 . member.geteam(); 후에 설명
테이블은 연관관계에 외래키(FK)를 사용 , JOIN ON M.TEAM_ID = T.TEAM_ID 후에 설명
그런데 여기서 객체는 A에서 get한 B데이터를 다시 A로 보낼수는 없다. 이를 단방향이라 하고
하지만 관계형은 A에서 일치한 B를 가져왔다가 반대로 A가 B를 JOIN할수도 있다 . 이를 양방향이라 한다.
객체는 단방향 , 관계는 양방향이라 한다.
그래서 보통 객체를 테이블에 맞춰서 모델링한다.
class Member{
String id; //Member_id 컬럼 사용(PK)
Long teamId; // Team__ID FK 컬럼 사용(FK)
String username; //username 컬럼 사용
}
class team{
Long id; //Team_id PK 사용(FK)
String name; //name 컬럼 사용
}
이걸 저장시
INSERT INTO MEMBER (member_id , Team_id , username) values~
의 쿼리가 발생한다,
그런데 이것을 객체답게 모델링 하면 자식이 FK를 가질 필요 없이
부모가 다 가지고 있으면 안될까?
class member{
String id; //member_ID 컬럼 사용
Team team ; // 참조 로 연관관계를 맺는다 .// 위 와의 차이점은 여기 ID가 아닌 team 객체를 가진다는점이 차이점!!
String username// username 컬럼 사용
}
Team getTeam(){
return team;
}
class team{
Long id; //team_ID PK 사용
String name ; //name 컬럼 사용
}
이걸 이제 insert하려면
INSERT INTO MEMBER (member_id , team_id , username) values~
이때 Insert에 사용할 team_Id가 없기 때문에 번거롭지만 team 객체에서 getTeam().getID()로 pk값을 가져와 넘겨주어야 한다.
이렇게 하면 조회만 하였는데도 많이 번거로운데
JOIN하고 연관관계를 손수 설정해 줘야 한다.
객체 지향 방식은 collection에 넣을때만 유리하다.
List.add(member) // 이때 Team도 필드값으로 들어가서 이미 참조되어 있다.
member member = List.get(memberId);
Team team = member.getTeam();
대신 이방법은 DB에 넣기가 힘들다!
'JPA' 카테고리의 다른 글
1월4일 JPA JPA와 연관관계 , 객체 그래프 탐색 (0) | 2023.01.04 |
---|---|
1월 4일 JPA 유지보수 패러다임의 불일치 해결 (0) | 2023.01.04 |
1월 3일 JPA , Java Persistence API (0) | 2023.01.03 |
1월 3일 객체 그래프 탐색 (JPA 사용 이유 포함.) (0) | 2023.01.03 |
1월 3일 JPA기본 (0) | 2023.01.03 |