본 포스팅은 인프런 - 자바 ORM 표준 JPA 프로그래밍 (기본편) 을 강의를 바탕으로 공부하고 정리한 글입니다.
JPA 사용 이전의 문제점
SQL 중심적인 개발의 문제
객체를 보관해야 할 때 관계형 데이터베이스를 주로 사용한다.
객체를 만들고 그것을 데이터베이스에 저장하기 위해서는 관계형 데이터 베이스가 알아들을 수 있는 수 많은 SQL문을 작성해야할 것이다.
여기서 SQL 중심적인 개발이 된다는 점이 문제다.
CRUD에 관한 SQL을 무한 반복으로 짜야하기 때문에 굉장히 지루한 개발이 된다.
만약 수정사항이라도 생긴다면, SQL문을 모두 뜯어 고쳐야 한다.
수 많은 SQL문을 수정하는 과정에서 오타나 데이터를 빼먹는 일은 다반사일 것이다...^^
결국 관계형 데이터베이스를 상황에서는 SQL에 의존적인 개발을 피하기 어렵다.
패러다임의 불일치 문제
또한 애초에 관계형 데이터베이스가 나온 사상과 객체 지향이 나온 사상과 완전히 다르다는 패러다임의 불일치라는 문제가 있다.
관계형 데이터베이스는 데이터를 잘 정규화해서 보관을 하는 것이 목표고, 객체라는 것은 속성과 기능을 묶어서 잘 캡슐화해서 쓰느 것이 목표인데, 이러한 객체를 관계형 데이터베이스에 넣으려고 하니까 문제가 발생한다는 것이다.
💡 객체와 관계형 데이터베이스의 차이
객체 | 관계형 데이터베이스 | |
상속 | 있음 | 없음 |
연관관계 | 참조를 사용 ex) member.getTeam() |
외래 키를 사용 (PK, FK로 JOIN을 해서 찾아옴) ex) JOIN ON M.TEAM_ID = T.TEAM_ID |
결론적으로 객체를 데이터베이스에 넣으려면 SQL로 변환해야 하는데 이 작업을 누가하느냐?
바로 개발자가 하기 때문에 업무의 대부분의 시간을 SQL문을 작성하는 SQL 매퍼가 된것과 다름이 없는 것이다.
ORM
- Object-Relational-Mapping (객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재한다.
JPA
- Java Persistance API
- JPA 2.1 표준 명세를 구현한 3가지 구현체
- 하이버네이트, EclipseLink, DataNucleus
- JPA는 인터페이스의 모음이라고 생각하면 된다.
- JPA는 Application과 JDBC 사이에서 동작한다.
- 개발자가 직접 JDBC API를 쓰는 것이 아니라 JPA에게 명령을 하면 JPA가 JDBC API를 사용해 SQL을 만들어서 DB에 보내고 그 결과를 받아서 동작
JPA의 동작 방식
- 저장하고 싶은 객체를 JPA에게 보내면 JPA가 객체에 대해 분석한다.
- JPA가 적절한 INSERT 쿼리를 생성해 JDBC API를 통해 DB에 저장한다.
- JPA가 적절한 SELECT 쿼리를 생성해 JDBC API 통해 DB에 보내고 결과를 받은 다음에 객체에 매핑을 해준다.
- 여기서 중요한 점은 패러다임의 불일치를 해결해준다는 것이다.
JPA를 왜 사용해야 하나?
- SQL 중심적인 개발에서 객체 중심적인 개발이 가능
- 생산성 증가
- 저장 : jpa.persist(member)
- 조회 : jpa.find(memberId)
- 수정 : member.setName("newName")
- 삭제 : jpa.remove(member)
- 유지보수 용이
- 기존 : 필드 변경시 모든 SQL 수정 필요
- JPA : 필드만 추가하면된, SQL은 JPA가 처리
- 패러다임의 불일치 해결
- 성능 향상
- 1차 캐시와 동일성(identity) 보장
: 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
: 트랜잭션을 커밋할 때까지 INSERT SQL을 모으고, JDBC BATCH SQL 기능을 사용해 한번에 SQL을 전송 - 지연 로딩(Lazy Loading)
: 객체가 실제 사용될 때 로딩
- 1차 캐시와 동일성(identity) 보장
'🌱 Spring > JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑(1) : 단방향 매핑 (0) | 2022.10.06 |
---|---|
[JPA] 데이터베이스 스키마 자동 생성 : DDL AUTO (0) | 2022.09.30 |
[JPA] 엔티티 매핑(2) - 기본 키 매핑 전략 (1) | 2022.09.30 |
[JPA] 엔티티 매핑(1) - 객체와 테이블, 필드와 컬럼 매핑 (0) | 2022.09.30 |
[JPA] 영속성 관리 (0) | 2022.09.29 |
[JPA] JPQL : 객체 지향 쿼리 언어 (0) | 2022.09.29 |
[JPA] 엔티티 변경 - 변경감지(Dirty Checking)와 병합(Merge) (0) | 2022.06.10 |
[JPA] 엔티티 설계시 주의점 (0) | 2022.06.04 |