🔷 JPA(Java Persistence API)
ORM
기술에 대한 API 표준 명세💡 ORM(Object Relational Mapping)
'객체로 연결을 해준다'는 의미로, 어플리케이션과 데이터베이스 연결 시 SQL언어가 아닌 어플리케이션 개발언어로 데이터베이스를 접근할 수 있게 해주는 툴을 뜻한다. ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해준다.
💡 패러다임 불일치
데이터베이스는 데이터 중심으로 구조화되어있어서 객체의 상속, 다형성 같은 개념이없다. 그래서 객체와 데이터베이스가 지향하는 점이 어긋나게 되는데 이것을 객체와 데이터베이스의 패러다임 불일치라고 한다. 주로 상속, 연관관계 등에서 발생한다.
자바 빈즈(EJB)
라는 기술 표준안에 엔티티 빈
이라는 ORM 기술이 있었지만 이는 복잡성과 기술 성숙도의 문제를 야기했다.하이버네이트(hibernate)
의 등장으로 엔티티 빈을 제치자, EJB 3.0에서 하이버네이트를 기반으로 JPA
를 만들었다.💡 그래서인지 JPA를 구현한 ORM 프레임워크 중 하이버네이트가 가장 대중적이다.
🔷 생산성
INSERT INTO users (name, email, age)
VALUES ('박영규', 'dudrb5260@naver.com', 25);
SELECT *
FROM users
WHERE name='박영규';
이런 저장과 조회 쿼리문을
jpa.persist(user); // 저장
User user = jpa.find(name); // 조회
자바 코드로 간단하게 처리해준다.
🔷 유지보수
public class User {
// 필드에 gender 추가
private String name;
private String email;
private Integer age;
private String gender
// 생성자에도 gender 추가
// gender의 getter, setter 추가 등등
...
}
필드가 하나 늘어나버리면
# 성별 추가
INSERT INTO users (name, email, age, gender)
VALUES ('박영규', 'dudrb5260@naver.com', 25, 'male');
이런 쿼리문처럼 JDBC API 코드를 모두 수정해야하지만 JPA는 이를 신경쓸 필요가 없다.
🔷 성능
String userId = "Bzeromo";
User user1 = jpa.find(userId);
User user2 = jpa.find(userId);
하나의 트랜잭션 안에 반복될만한 쿼리 작업들을 넣어두면 JPA를 사용하지 않았을 때 여러 번 통신했을 작업을 한 번으로 끝낼 수 있다. 여기선 같은 유저를 두 번 조회할 때 JPA는 데이터베이스에 한 번의 SELECT 전달 이후, 조회한 유저 객체를 재사용한다.
🔷 데이터 접근 추상화와 벤더 독립성
💡 벤더와 벤더의 독립성
데이터베이스를 만든 회사에 대한 내용. 흔히 산업용어로 벤더는 생산회사를 말한다. 예를 들어 JPA를 통해 페이징 기능을 구현했다면 A데이터베이스를 쓰다가 B데이터베이스로 바꿔도 정상적으로 동작하게 된다. 이를 벤더 독립성이라고 한다.
🤔 현재 진행 중인 프로젝트(아이디어 회의 툴 - good idea)에 적용하는 이유로는 이 안에서 대표적으로 생산성과 성능을 들 수 있겠다. 실시간 작업이 주를 이루는 프로젝트인 만큼 생산성과 성능 면에서 이점을 챙길 수 있는 부분은 최대한 가져가야 하기 때문.