금오공대 김성렬 교수님의 "스프링과 JPA를 이용한 웹개발" 강의 학습 기록입니다.
http://www.kocw.net/home/cview.do?cid=5e6aec4a9ae2dd45
ORM (Object Relational Mapping)
- 데이터베이스는 객체 지향적 개념이 없다. 따라서 데이터베이스를 자바에서 조작하려다 보면 객체 지향적 철학이 손실될 수 있다. 이를 방지하고자 나온 기술.
- 자바 클래스와 데이터베이스 table을 매핑.
JPA (Java Persistence API)
- 자바 진영의 표준 ORM
- 자바에서 관계형 데이터베이스를 사용하는 방법을 정의한 인터페이스 -> 인터페이스므로 구현체가 존재해야 한다.
- 구현체 종류 : Hibernate(대부분), EclipseLink, DataNucleus
- JPA는 코드 생산성이 높다. -> JDBC 로 구현을 한다면, 기본적인 CRUD와 비즈니스 로직을 위한 SQL문을 다 작성해야 한다.
- JPA 도 결국 JDBC 를 사용한다. JPA 가 RDBMS 별로 JDBC Driver 를 제공하므로 어떤 RDBMS 든 자유롭게 사용할 수 있다.
장점
- CRUD 자동 생성 및 실행
- 저장 : EntityManager의 persist() 메서드 사용 -> INSERT문 실행
- 조회 : EnitiyManager의 find() 메서드 사용 -> SELECT문 실행
- 수정 : 특정 메서드 없이 자동으로 변경 감지 후 UDPATE문 실행 -> Dirty Checking(persist 되어 있는 entity가 변경이 있는지 아닌 지 계속 감시하고 있다가, 트랜잭션이 끝났을 때 변경된 부분만 UPDATE 하게 됨.)
- 삭제 : remove()
- DB 벤더에 따른 SQL 생성(=방언) : Dialect라는 추상화된 방언 클래스와 각각의 구현체 제공
- Auto DDL 기능
- SQL을 모아서 트랜잭션이 끝나는 시점에 한번에 DB에 보내므로 성능 상 이점.
- 응용 레벨에서 Repeatable Read 수준의 격리레벨 제공.
단점
- 객체의 응집력을 약화시킴
- 테이블에 매핑된 엔티티와 별개로 DTO 추가 정의 필요
- 의도하지 않은 SQL 발생 가능
Spring Data JPA
- JPA 를 좀 더 스프링에서 편하게 사용하도록 만든 모듈
- JPA(Hibernate)를 사용할 때 발생하는 보일러 플레이트 코드를 제거.
- JPA 사용 시 발생하는 관습적인 코드 제거 (Ex. findById 같은 함수는 당연히 있어야할 것으로 예상되는 코드)
- JpaRepository 를 상속하는 인터페이스만 정의하면 된다.
추가 내용
- N+1 문제
- JPA 성능 튜닝에서 가장 중요한 개념
- JPQL
- JPA 의 기본 CRUD 외에, 통계성 쿼리 등 복잡한 쿼리를 위해
- JPQL은 트랜잭션 내에서 곧바로 실행되는 특성이 있고 이는 N+1 문제와 연관이 있음
- QueryDSL
- 문자열의 덧셈 연산을 통한 쿼리 작성은 1) 불편하고 2) 오류 가능성이 높음
- 문자열의 덧셈 연산은 특히 동적 쿼리 작성 시 주로 사용
- 동적 쿼리 작성을 간편하게 하고 재사용성이 높은 코드를 만들기 위해 QueryDSL 을 사용
'Spring > Spring Data JPA' 카테고리의 다른 글
JPA, JDBC, SPRING, TRANSACTION (0) | 2023.02.19 |
---|---|
[JPA] 즉시로딩과 지연로딩(FetchType.LAZY or EAGER) (0) | 2023.02.19 |