-
1. JPA 소개 & JPA 시작하기Spring-Boot/자바 ORM 표준 JPA 프로그래밍 - 기본편 2022. 11. 14. 16:52
목표1 - 객체와 테이블 설계 매핑
- 객체와 테이블을 제대로 설계하고 매핑하는 방법
- 기본 키와 외래 키 매핑
- 1:N, N:1, 1:1, N:M 매핑
- 실무 노하우 + 성능까지 고려
- 어떠한 복잡한 시스템도 JPA로 설계 가능
목표2 - JPA 내부 동작 방식 이해
- JPA의 내부 동작 방식을 이해하지 못하고 사용
- JPA 내부 동작 방식을 그림과 코드로 자세히 설명
- JPA가 어떤 SQL을 만들어 내는지 이해
- JPA가 언제 SQL을 실행하는지 이해
객체와 관계형 데이터베이스의 차이
1. 상속
- 객체 상속관계 VS Table 슈퍼타입 서브타입 관계
2. 연관관계
- 객체는 참조를 사용 : member.getTeam()
ㆍ엔티티신뢰문제 & 모든 객체를 미리 로딩할 수는 없다.
- 테이블은 외래 키를 사용 : JOIN ON M.TEAM_ID = T.TEAM_ID
3. 데이터 타입
4. 데이터 식별 방법
JPA
- Java Persistence API
- 자바 진영의 ORM 기술 표준
ORM
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
JPA를 왜 사용해야 하는가?
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
ㆍ저장: jpa.persist(member)
ㆍ조회: Member member = jpa.find(memberId)
ㆍ수정: member.setName("변경할 이름")
ㆍ삭제: jpa.remove(member)
- 유지보수
ㆍ기존: 필드 변경시 모든 SQL 수정
ㆍJPA: 필드만 추가하면 됨, SQL은 JPA가 처리
- 패러다임의 불일치 해결
ㆍ1.JPA와 상송
ㆍ2.JPA와 연관관계
ㆍ3.JPA와 객체 그래프 탐색
ㆍ4.JPA와 비교하기
- 성능
ㆍ1. 1차 캐시와 동일성(identity) 보장
º 1. 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
º 2. DB Isolation Level이 Read Commit 이어도 애플리케이션에서 Repeatable Read 보장
ㆍ2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
º 1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
º 2. JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
ㆍ3. 지연 로딩(Lazy Loading)
º 지연로딩 : 객체가 실제 사용될 때 로딩
º 즉시로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
- 데이터 접근 추상화와 벤더 독립성
- 표준
데이터베이스 방언
- JPA는 특정 데이터베이스에 종속 X
- 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름
ㆍ가변 문자 : MySQL은 VARCHAR, Oracle은 VARCHAR2
ㆍ문자열을 자르는 함수 : SQL표준은 SUBSTRING(), Oracle은 SUBSTR()
ㆍ페이징 : MySQL은 LIMIT, Oracle은 ROWNUM
- 방언 : SQL표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
- hibernate.dialect 속성에 지정
ㆍH2 : org.hibernate.dialect.H2Dialect
ㆍOracle 10g : org.hibernate.dialect.Oracle10gDialect
ㆍMySQL : org.hibernate.dialect.MySQL5InnoDBDialect
- 하이버네이트는 40가지 이상의 데이터베이스 방언 지원
객체와 테이블을 생성하고 매핑하기
- @Entity : JPA가 관리할 객체
- @Id : 데이터베이스 PK와 매핑
주의
- 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
- 엔티티 매니저는 쓰레드간에 공유X (사용하고 버려야 한다)
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
JPQL
- JPA를 사용하면 엔티티 객체를 중심으로 개발
- 문제는 검색 쿼리
- 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
- 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요
- JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
- SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
- JPQL은 엔티티 객체를 대상으로 쿼리
- SQL은 데이터베이스 테이블을 대상으로 쿼리
- 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
- SQL을 추상화해서 특정 데이터베이스 SQL에 의존X
- JPQL을 한마디로 정의하면 객체 지향 SQL
'Spring-Boot > 자바 ORM 표준 JPA 프로그래밍 - 기본편' 카테고리의 다른 글
6. 고급 매핑 (0) 2022.12.21 5. 다양한 연관관계 매핑 (0) 2022.12.21 4. 연관관계 매핑 기초 (0) 2022.12.20 3. 엔티티 매핑 (0) 2022.11.16 2. 영속성 관리 - 내부 동작 방식 (0) 2022.11.16