[Spring JPA #1] JPA 및 ORM 이란?
- 📚 Spring/Spring JPA
- 2020. 6. 22. 23:48
ORM (Object Relational Mapping)
- ORM은 애플리케이션의 클래스와 SQL 데이터베이스의 테이블 사이의 맵핑 정보를 기술한 메타데이터를 사용하여, 자바 애플리케이션의 객체를 SQL 데이터베이스의 테이블에 자동으로 영속화 해주는 기술이다.
- 객체는 객체대로 설계하고 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다
- ORM프레임워크가 중간에서 매핑해준다
- ORM은 객체와 RDB 두 기둥 위에 있는 기술이다.
JPA(Java Persistent API)
- JPA(Java Persistent API)는 자바의 영속성 관리와 ORM을 위한 표준 기술이다. 기존 EJB ORM이던 Entity Bean을 JPA라 바꿔 체계화한 기술이다.
- ORM(Object Relational Mapping) 이란 RDB 테이블을 객체지향적으로 사용하기 위한 기술이다. 즉, 객체와 RDB의 테이블을 매핑하여 자바 프로그램 코드 상에서 RDB를 객체지향적으로 쓸 수 있게 고려한 기술이라고 생각하면 쉽다.
- 이 JPA를 Spring에서 쓸수 있도록 한 것이 Spring Data JPA 이다.
JDBC 대신 도메인 모델을 사용하려는 이유는?
- 객체 지향 프로그래밍의 장점을 활용하기 좋음
- 코드 재사용
- 각종 디자인 패턴
- 비즈니스 로직 구현 및 테스트가 편함
ORM의 장점
- 객체 지향적으로 데이터를 관리하기 때문에 비즈니스 로직에 집중할 수 있고, 객체지향 개발이 가능하다
- 유지보수성
- 벤더 독립성
ORM의 단점
- 학습 비용이 많다. 어렵다.
- 제대로 사용하지 않으면 성능 이슈가 발생하고 데이터 손실이 발생할 수 있다.
| JPA의 동작과정
- JPA는 애플리케이션과 JDBC 사이에서 동작한다.
- 개발자가 JPA를 사용하면 JPA내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다.
- 개발자가 직접 JDBC API를 쓰는 것이 아니다.
저장과정
조회과정
- JPA
- 1)엔티티의 매핑 정보를 바탕으로 적절한 SELECT SQL을 생성
- 2) JDBC API를 사용하여 SQL을 DB에 날린다.
- 3) DB로부터 결과를 받는다.
- 4) 결과를 객체에 모두 매핑한다.
- 쿼리를 JPA가 만들어 주기 때문에 Object와 RDB간의 패러다임 불일치를 해결 할 수 있다.
JPA를 왜 사용하는가?
- SQL중심적인 개발에서 객체 중심으로 개발
- SQL 중심적인 개발의 문제점[https://gmlwjd9405.github.io/2019/08/03/reason-why-use-jpa.html]
- 생산성
- JPA를 사용하는 것은 마치 Java Collection에서 데이터를 넣었다 빼는 것 처럼 사용할 수 있게 만든 것이다.
- 간단한 CRUD
- 저장 : jpa.persis(member)
- 조회 : Member member - jpa.find(memberId)
- 수정 : member.setName("변경내용")
- 삭제 : jpa.remove(member)
- 객체를 변경하면 그냥 알아서 DB에 UPDATE Query가 나간다.
- 유지보수
- 기존 : 필드 변경 시 모든 SQL을 수정
- JPA ; 필드만 추가하면 된다. 즉, SQL을 건들 것이 없다
- Object와 RDB 간의 패러다임 불일치 해결 [https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html]
- hibernate.dialect 속성 지정을 통해 다양한 데이터베이스 방언을 제공한다.
- JPA는 데이터베이스에 종속적이지 않다. (데이터베이스 마다 SQL문법이 조금씩 다른데 JPA에서는 알아서 변한해 준다.)
- 성능
- JPA는 애플리케이션과 데이터베이스 사이에서 작동한다. 이렇게 사이에 계층이 하나 더 있으면 최적화 관점에서 시도해 볼 수 있는 것들이 많다
String memberId = "hello" Member member1 = jpa.find(memberId); Member member2 = jpa.find(memberId);
- 이 소스를 JDBC API를 사용했다면 데이터베이스와 두 번 통신했을 것이다.
- 근데 JPA를 사용하면 SELECT SQL을 한 번만 데이터베이스에 전달하고 두 번째는 재사용한다.
단점
- JPA는 통계처리와 같이 복잡한 쿼리보다는 실시간 처리용 쿼리에 더 최적화되어 있다. 물론 Native Query를 사용할 수 있지만 미세하게 쿼리 작업을 필요하다면 Mybatis와 같은 Mapper 방식을 사용하는 것이 더 효율적일 수 있다.
- 학습에 어려움이 있고 시간이 걸린다.
'📚 Spring > Spring JPA' 카테고리의 다른 글
[Spring JPA #6] Fetch (0) | 2020.07.15 |
---|---|
[Spring JPA #5] 엔티티 상태와 Cascade (0) | 2020.07.14 |
[Spring JPA #4] 관계 맵핑 (0) | 2020.06.28 |
[Spring JPA #3] Entity 매핑 및 Value 타입 (0) | 2020.06.27 |
[Spring JPA #2] JPA 엔티티 매핑 용어 정리 (0) | 2020.06.27 |