JPA란 무엇인가?
-JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준이다. JPA는 애플리케이션과 JDBC 사이에서 동작한다.
-자바 ORM 기술에 대한 API 표준 명세다.(인터페이스를 모아둔 것)
-JPA 사용하기 위해서는 JPA를 구현한 하이버네이트,EclipseLink, DataNucleus인 ORM 프레임워크를 선택한다.
-ORM이란 무엇일까?
ORM(object-Relational Mapping)은 이름 그대로 객체와 관계형 데이터베이스를 매핑한다는 뜻이다.
ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 대신 해결해준다. 예를 들어 ORM 프레임워크를 사용하면 객체를 데이터베이스에 저장할 때 INSERT SQL을 직접 작성하는 것이 아니라 객체를 마치 자바 컬렉션에 저장하듯이 ORM 프레임워크에 저장하면 된다. 그러면 ORM 프레임워크가 적절한 INSERT SQL을 생성해서 데이터베이스에 객체를 저장해준다.
->ORM프레임워크가 SQL문을 생성해서 객체를 데이터베이스에 저장해준다.
EJB 3.0에서 하이버네이트(오픈소스 ORM 프레임워크)를 기반으로 새로운 자바 ORM 기술 표준이 만들어졌는데 이것이 바로 JPA이다.
JPA는 자바 ORM 기술에 대한 API 표준 명세다. 쉽게 말해 인터페이스를 모두 모아둔 것이다. JPA를 사용하려면 JPA를 구현한 ORM 프레임워크를 선택해야 한다.
JPA 2.1을 구현한 ORM 프레임워크는 하이버네이트,EclipseLink,DataNucleus가 있는데 이 중에서 하이버티이트가 가장 대중적이다.
-왜 JPA를 사용해야 하는가?
1)생산성
-CRUD용 SQL을 개발자가 직접 작성하지 않아도 된다.
why? JPA가 SQL을 작성하고 JDBC API를 사용하는 일을 대신 처리
-JPA는 DDL문을 자동으로 생성
2)유지보수
-필드를 추가하거나 삭제해도 수정해야 할 코드가 줄어든다.
why? 개발자가 SQL을 직접 다루면 엔티티에 필드를 하나만 추가해도 관련된 등록, 수정,조회 SQL과 결과를 매핑하기 위한 JDBC API 코드를 모두 변경해야하는데 JPA를 사용하여 대신 처리해준다.
3)패러다임의 불일치 해결
-패러다임의 불일치란?
정의한 도메인 모델을 저장할 때 발생(ex) 특정 유저가 시스템에 회원 가입하면 회원이라는 객체 인스턴스를 생성 후에 이 객체를 메모리가 아닌 어딘가에 보관해야함)
비즈니스 요구사항을 정의한 도메인 모델을 객체로 모델링->객체지향 언어가 가진 장점들을 활용(추상화,캡슐화,정보은닉,상속 등)->도메인 모델 정의->부모 객체를 상속받거나 다른 객체를 참조하고 있다면 같이 저장해야 한다 -> 관계형 데이터베이스에 객체를 저장해야함->but 관계형 데이터베이스는 데이터 중심으로 구조화되어 있고 추상화,상속,다형성 같은 개념이 없다.
∴ 객체와 관계형 데이터베이스는 지향하는 목적이 서로 달라 둘의 기능과 표현 방법도 다르다.
-JPA와 상속
예를 들어 Item을 상속한 Album 객체(Class Album extends Item)를 저장하려고 하려면 Item과 Album객체에 대해 JDBC API를 사용해서 SQL을 작성해야 하기 때문에 코드량이 많아진다.
해결책 : JPA를 사용해서 persist()메소드를 사용한다.
jpa.persist(album);
그러면 JPA는 다음 SQL을 실행해서 ITEM, ALBUM 두 테이블에 나누어 저장한다.
INSERT INTO ITEM...
INSERT INTO ALBUM...
-JPA와 연관관계
객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회한다. 반면에 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다.
3-1)객체를 테이블에 맞추어 모델링
테이블 연관관계 기준으로 Member 클래스에 teamId 필드를 추가해준다.
but, 관계형 데이터베이스는 조인이라는 기능이 있으므로 외래 키의 값을 보관하기 때문에 바로 찾을 수 있지만
member.getTeam()을 하면 객체의 참조를 보관되어 있어야 하는데 찾을 수 없다.
class Member{
String id; //MEMBER_ID 컬럼 사용
Long teamId; //TEAM_ID FK 컬럼 사용
String username; //USERNAME 컬럼 사용
}
class Team{
Long id; //TEAM_ID PK 사용
String name; //NAME 컬럼 사용
}
3-2) 객체지향 모델링
객체 연관관계를 기준으로 Member 클래스에 Team 객체 필드를 추가해준다.
but, 회원과 연관된 팀을 조회할 수는 있지만 객체를 테이블에 저장하거나 조회하기가 쉽지 않다.
why? 객체는 team필드로 연관관계를 맺고 참조만 있으면 되지만 테이블은 참조는 필요없고 외래키만 있으면 된다. 개발자가 중간에서 변환 역할해야한다.
class Member{
String id; //MEMBER_ID 컬럼 사용
Team team; //참조로 연관관계를 맺는다.
String username; //USERNAME 컬럼 사용
}
class Team{
Long id; //TEAM_ID PK 사용
String name; //NAME 컬럼 사용
}
해결책 :
개발자는 회원과 팀의 관계를 설정하고 회원 객체를 저장한다.
member.setTeam(team); //회원과 팀 연관관계 설정
jpa.persist(member); //회원과 연관관계 함께 저장
JPA는 team의 참조를 외래 키로 변환해서 적절한 INSERT SQL을 데이터베이스에 전달한다.
'Backend > JPA' 카테고리의 다른 글
[JPA] 여러개의 insert문을 한번에 날릴 수 있을까? (0) | 2022.02.08 |
---|---|
[JPA] 4.엔티티 매핑 (0) | 2021.08.25 |
[JPA] 3. 영속성 관리 (0) | 2021.08.18 |
[JPA] 2-2. 애플리케이션 개발 (0) | 2021.08.04 |
[JPA] 2-1. JPA 시작 (0) | 2021.08.03 |