빙응의 공부 블로그
[Spring] JPA 등장 배경과 SQL 개발의 문제점 본문
📝SQL 개발의 문제점
현재 우리는 관계형 데이터베이스 세상에 살고 있다.
거의 모든 DB는 관계형으로 관리하고 있다.
이러한 관계형 DB를 제어, 관리하는 것이 수많은 SQL 문을 사용해야 한다.
CRUD
INSERT INTO
UPDATE SET
SELECT FROM
DELETE FROM
문제점 1 - 개발 과정의 불편성
한번 예시로 들어보자
public class Member {
private String memberId;
private String name;
}
INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES ...
SELECT MEMBER_ID, NAME FROM MEMBER
UPDATE MEMBER SET ...
이렇게 개발이 완료 되었을 때 하나의 요구사항이 추가 된다고 생각해보자
이때 엄청난 문제가 생긴다.
public class Member {
private String memberId;
private String name;
private String tel;
}
INSERT INTO MEMBER(MEMBER_ID, NAME, TEL) VALUES ...
SELECT MEMBER_ID, NAME, TEL FROM MEMBER
UPDATE MEMBER SET ... WHERE TEL = ???
그동안 지정한 모든 SQL문을 다 수정해야 한다.
그래서 SQL에 의존적인 개발은 이러한 문제를 피할 수 없어 개선책이 필요하다.
문제점 2 - 패러다임의 불일치
객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등의 다양한 장치를 제공한다.
객체를 관계형 데이터베이스에 저장이 가능하지만 모든 객체를 개발자가 SQL 문을 이용해서 매핑해줘야 한다.
1. 상속
위 그림처럼 테이블은 객체와 다르게 상속관계를 사용할 때 참조 즉, 외래키를 이용한 조인 관계가 필요하다.
2. 연관관계
객체는 참조를 사용하여 쉽게 가져온다. member.getTeam()
그러나 테이블은 조인 관계를 이용한 참조를 해야한다.
그래서 객체를 테이블에 맞춰서 모델링을 해줘야한다.
위 그림처럼 Team 객체 대신에 Team의 기본키(Primary Key)를 가지고 있어야 깔끔한 조인을 통한 참조가 가능해진다.
3. 객체 그래프 탐색
객체는 연관관계가 있는 한 자유롭게 모든 곳이 탐색이 가능하다.
즉 member.getItem().getOrder()처럼 점점 늘려가면서 탐색이 가능하다.
그러나 SQL 테이블은 이러한 탐색에 적합하지 않다.
즉 객체답게 모델링 할수록 매핑 작업만 늘어난다.
그렇다면 객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수 없을까?
📝JPA - Java Persistense API
자바 진형의 ORM 표준 진형이다.
ORM?
Object-relational mapping
객체와 관계형 데이터베이스 따로 설계하고 ORM을 통해 중간에서 매핑해주는 기술이다.!
JPA는 자바 ORM 표준으로 오픈 소스에서 출발한 표준이다.
JPA는 표준 명세이다. 쉽게 이야기하면 인터페이스의 모음이다.
JPA의 구현체는 3가지인데
- Hibernate
- EclipseLink
- DataNucleus
보통 하이버네이트를 사용한다.
JPA는 애플리케이션과 DB 사이에서 JDBC를 JPA가 사용하며 매핑해주는 기술이다.
📝JPA 사용 이유
JPA를 사용하면 어떤 장점이 있을까?
JPA는 기본적으로 JDBC를 이용하여 개발자가 편하게 개발할 수 있게 도와준다.
장점
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 유지보수
- 패러다임의 불일치 해결
- 성능
- 데이터 접근 추상화 및 벤더 독립성
- 표준
하나하나씩 살펴보자
생산성
- 저장 : jpa.persist(member)
- 조회 : Member member = jpa.fin(memberId)
- 수정 : member.setName("변경할 이름")
- 삭제 : jpa.remove(member);
원래 SQL 문을 사용하여 CRUD를 구현해야 했지만 자바 컬렉션을 이용한 개발이 가능해진다.
생산성이 월등하게 향상되는 결과가 나온다.
패러다임의 불일치 해결
- 상속
- 연관관계
- 객체 그래프 탐색
성능 최적화 기능
- 1차 캐시와 동일성 보장
- 같은 트랜잭션 안에서는 같은 엔티티를 반환한다. - 약간의 조회 성능 향상
- 즉 같은 트랜잭션 안에서 같은 Id를 가진 엔티티를 조회하면 둘이 같은 엔티티이다.(원래는 다르다고 나옴)
- 같은 트랜잭션 안에서는 같은 엔티티를 반환한다. - 약간의 조회 성능 향상
String memberId = "100";
Member member1 = jpa.fin(member.class, memberId);
Member member2 = jpa.fin(member.class, memberId);
System.out.println(member1 == member2) //true
- 트랜잭션을 지원하는 쓰기 지연
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모으기 가능
- JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송가능
- 네트워크 통신 비용이 매우 절감
- 지연 로딩과 즉시 로딩
- JOIN 관계에서 효율 상승을 위한 로딩 관련 정책이다.
- 지연 로딩 : 객체가 실제 사용될 때 로딩
- 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
'Spring > 인프런_JPA' 카테고리의 다른 글
[Spring]자바 ORM 표준 JPA 프로그래밍 - 다양한 연관관계 (1) | 2024.02.18 |
---|---|
[Spring]자바 ORM 표준 JPA 프로그래밍 - 연관 관계 매핑 (0) | 2024.02.16 |
[Spring]자바 ORM 표준 JPA 프로그래밍 - 엔티티 매핑 (1) | 2024.02.15 |
[Spring]자바 ORM 표준 JPA 프로그래밍 - 영속성 컨텍스트 (0) | 2024.02.14 |
[Spring]자바 ORM 표준 JPA 프로그래밍 - JPA 시작하기 (0) | 2024.02.13 |