기억의 저장소
JPA란 뭘까? 왜 나오게 되었을까? 왜 사용할까? 본문
글 작성 이유
JPA가 왜 나오게 되었고 어떻게 발전하여 어떻게 쓰이냐를 정리하려한다
JPA가 왜 나왔는지 알기전에 객체지향 프로그래밍과 관계형 디비의 차이를 알자
객체지향 프로그래밍 VS 관계형 데이터베이스
- 연관관계
- 객체는 참조를 사용하여 연관관계를 표현한다.
- 디비는 외래키를 사용하여 연관관계를 표현한다.
- 연관관계를 표현하는게 달라 디비에 맞춰 연관관계를 모델링하게되었음
- 객체의 장점은 객체 그래프 탐색인데 어디까지 쿼리를 날려야할지 모르므로 이것을 사용하지 못하였다. (엔티티신뢰성이 떨어짐 값이 있나 없나 쿼리를 봐야 알 수 있음)
- 참조객체 사용 > 객체 그래프 탐색 > 예전에 신뢰성문제 해결(여러 테이블이 있을때 조인해서 어디까지 가져온건지에 대한 신뢰)
- 객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는것이다 - 조영호(객체지향의 사실과 오해)
객체가 하나가 있어서 완성되는게 아니라 객체들의 연관관계가 걸려 있어 이를 활용하는것
객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.
- 상속
- 객체는 추상화란것이 있고 상속을 통해 구현할 수 있다. 하지만 RDB에서는 비슷한 슈퍼타입 서브타입 관계 테이블이 있지만 상속이란 개념이 없다. 그래서 만약 데이터를 CRUD하게되면 개발자가 직접 상위하위 모두에 insert하는등의 일을 하므로 복잡하여 디비에 넣는것은 상속을 쓰지 않았다고한다.
- 데이터 식별방법
- JDBC를 이용해 같은 ID의 값을 통해 Member 객체를 가지고오게되면 다른 객체가 나오게 되었다.
- 객체는 컬렉션을 이용해 값을 가져와 비교하면 같은 객체가 나오게된다 예를들어 1번에있는 객체가져오게되면 그대로 두번쨰에해도 같은 객체를 가져오게됨
JPA는 뭐고 왜 나오게 되었을까?
개발자들은 생각했다. 객체답게 개발할 수록 지금의 기술으로는 매핑작업만 늘어나며 좋아지지 않았다.(결국 번거로움과 복잡함에 SQL중심 개발로가게됨)
계속해서 SQL 중심 개발을 하다 문득 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수 는 없을까? 란 생각을 하게 되었다. 이를 바탕으로 개발하게 되었고 JPA가 나오게되었다.
JPA는 Object-relational mapping(객체 관계 매핑)라고 하며 개발자는 객체로 만들어 JPA에게 보내면 JPA가 DB에맞춰 쿼리를 날려주게된다. (매핑이란 중간에서 무언갈 해주는것이라 말한다)
이를 통해 각자의 영역만 바라보면되니 패러다임의 불일치를 해결하여 추상화,캡슐화,정보은닉,상속,다형성등의 객체지향의 장점을 사용할 수 있게되었다. 복잡하고 번거러웠던것들을 중간에서 JPA가 해결해주므로 객체지향적인 개발을 할 수 있게 되었다.
나오게 된 과정
Jdbc(java database connect) > 스프링 JdbcTemplate과 MyBatis 같은 라이브러리로 발전(중복 제거,하지만 sql직접 작성, 개발자 == sql mapper) > JPA (SQL중심에서 > 객체중심(마치 객체를 메모리에 넣듯이 JPA에 집어넣으면 알아서 쿼리생성)
계속해서 발전되어왔지만 JDBC라이브러리를 core로 사용하고 있다. JPA는 애플리케이션과 JDBC 사이에 위치해 필요한 작업을 해준다.
JPA는 왜 사용할까? 장점이 뭐지?
가장 큰것은 SQL중심에서 객체중심 개발이 가능해졌다는것이지만 이외에도 장점이 있다.
- JPA가 필드를 보고 알아서 만들어주는 쿼리덕분에 반복되는 일을 하지 않아 유지보수성과 생산성이 향상 되었다.
- 1차캐시와 동일성 보장
- 같은 트랜잭션안에서는 영속성 컨텍스트에 있다면 디비를 거치지않고 1차캐시에서 값을 가져와 약간의 조회성능이 올라가게 된다. 또한 JPA는 컬렉션에서 같은 인덱스를 가져오게되면 동일한것 처럼 이러한 객체가 동일하다는것을 보장해준다.
- 쓰기지연
- 버퍼라이팅이라고하며 영속성컨텍스트에 모아뒀다가 한번에 SQL을 전송하며 네트워크 통신비용을 줄인다한다.
- 지연로딩
- 지연로딩을 통해 성능 최적화를 나중에 고민해도된다. 모두 지연로딩을 걸어두고 필요에따라 같이 가져오게되면 불필요한 값들을 안가져오게된다.
- 더티체킹
- 더티체킹이란 기술을통해 개발자는 Update에 관하여 신경쓰지 않아도된다.
- JPA에는 영속성컨텍스트란게 있고 값을 조회해오면 영속성 컨텍스트에 있는 1차캐시에 저장된다. 이때 1차캐시에 있는것을 수정하면 flush가 일어날때 원본과 스냅샷을 비교하여 update 쿼리를 만들어 쓰기지연 저장소에 넣게되어 쿼리가 디비에 보내지게 된다. (삭제도 똑같은 방식)
'Spring > JPA' 카테고리의 다른 글
JPQL이란 무엇이고 왜 사용할까? (0) | 2023.07.18 |
---|