본문 바로가기
Backend - Java Spring/JPA 기초와 원리

[JPA] JPA

by VictorMeredith 2024. 2. 21.

1. JPA

- JAVA 진영의 ORM 표준

- SQL이 아닌 객체중심의 코드로 개발이 가능

- DB를 변경하기가 쉬워짐

 

2. SQL을 직접 다룰 때 발생하는 문제

- JDBC API를 사용해서 SQL을 DB에 전달하는데, 반복이 너무 많음

- SQL과 JDBC API를 DAO로 만들어 코드 내에 많이 작성해야함

- 뭐 하나 추가되면 DAO내의 SQL을 다 확인하고 수정해야함

- 객체가 사용할 수 있을지 없을지는 사용하는 SQL에 달려있다.

- SQL에 의존적이 되는 상황에서는 엔티티를 신뢰할 수 없다.

 

3. JPA와 문제 해결

- jpa.persist(member); : persist() 를 통해 객체를 DB에 저장한다.

- JPA가 객체와 매핑정보를 보고 적절한 INSERT SQL을 생성해서 DB에 전달한다.

- jpa.find(Member.class, memberId); : 조회

- Member member = jpa.find(Member.class, memberId); -> member.setName("이름변경"); : 수정

- Team team = member.getTeam(); : 연관된 객체를 마음껏 조회할 수 있다.

 

4. 패러다임 불일치

- 객체지향프로그래밍의 JAVA와 데이터중심의 RDB와의 패러다임 차이가 있다.

- 상속 : 테이블은 상속이 없다. 따라서 TYPE 컬럼을 사용해서 관계매핑이 가능하다. 

- JPA는 이 문제를 해결해준다.

- 따라서 개발자는 자바 컬렉션이 객체를 저장하듯이 JPA에게 객체를 저장하면 된다.

- 즉, 알아서 나눠서 저장하고 알아서 join해서 가져온다.

- 연관관계 : 테이블은 FK를 사용해서 다른 테이블과 연관관계를 가지고 join을 사용해서 연관 테이블을 조회한다.

- 한계 : SQL을 직접 다뤄서 매핑하면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다.

- JPA를 사용하면 객체 그래프를 마음껏 탐색할 수 있다.

- JPA는 연관된 객체를 사용하는 시점에 적절한 SELECT SQL을 실행하기 때문이다. : 지연로딩이라고 한다.

- 한번에 조회하는 것이 효과적인 경우도 많다. 이럴 때에는 함께 조회하겠다고 간단한 설정을 적용하면 된다.

- 동일성 비교 : == 객체 인스턴스의 주소값을 비교한다.

- 동등성 비교 : equals() 메서드는 객체 내부의 값을 비교한다.

- JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다.

빨간 것은 무시

 

- 정리하자면 객체모델과 관계형DB 모델은 지향하는 패러다임이 다르다. 하지만 이 패러다임 차이의 극복을 개발자가 아닌 JPA가 불일치를 해결해주고 정교한 객체 모델링을 할 수 있도록 도와준다.

 

5. JPA란 ? 

- 자바진영의 ORM 기술 표준이며, 앱과 JDBC 사이에서 동작한다.

- 객체를 마치 자바 컬렉션에 저장하듯이 ORM 프레임워크에 저장하면 알아서 SQL을 생성해서 객체에 저장해준다.

- 매핑 방법만 ORM에게 잘 알려주면 된다.

- JPA는 자바 ORM 기술에 대한 API 표준 명세다. 인터페이스의 모음인 것.

- 하이버네이트는 이를 구현한 구현체다.

- JPA는 앱과 DB 사이에서 다양한 성능 최적화의 기회를 제공한다.

  : 예를들어 같은 회원을 조회할 경우 JPA는 SELECT SQL 을 한 번만 DB에 전달하고 두 번째는 조회한 회원 객체를 재사용한다.

- 데이터 접근 추상화와 벤더 독립성 : 추상화된 데이터 접근 계층을 제공하므로 특정 DB의 기술에 종속되지 않도록 해준다.

- 즉, 로컬에서 개발 시에는 H2를 사용하고 개발이나 상용 환경은 MySQL, 오라클 등을 사용할 수 있다.

 

'Backend - Java Spring > JPA 기초와 원리' 카테고리의 다른 글

[JPA] 실습  (0) 2024.02.21

댓글