객체를 자바 컬랙션에 저장 하듯이 DB에 저장할 수는 없을까?에 대한 고민으로 나온 것이 바로 JPA다.
나온 과정 : EJB - 엔티티 빈(자바 표준) --> 하이버네이트(오픈 소스) --> JPA(자바 표준)
사용 이유 : SQL 중심적인 개발에서 객체 중심 개발, 생산성, 유지보수, 패러다임의 불일치 해결, 성능, 데이터 접근 추상화와 벤더 독립성
Java Persistence API로 자바의 ORM 기술 표준임
JPA는 인터페이스의 모음으로, JPA 2.1 표준 명세를 구현한 3가지 구현체가 Hibernate, EclipseLink, DataNucleus임
Object-relational mapping(객체 관계 매핑)으로 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계함
ORM 프레임워크가 중간에 이 둘을 매핑해줌
-> JPA는 자바 어플리케이션과 JDBC 사이에서 동작함
간략하게 살펴보면,
저장 : jpa.persist(member)
조회 : Member member = jpa.find(memberId)
수정 : member.setName("변경할 이름")
삭제 : jpa.remove(member)
기존에는 필드 변경 시 사용한 모든 SQL을 수정해야 했지만, JPA 사용 시 필드만 추가해주면 됨. SQL은 JPA가 처리해줌
지연 로딩 & 즉시 로딩 -> JPA에서 중요한 부분 중 하나로, 실제로 접하게 될 경우가 다수 존재함! 각자의 상황에 따라 필요한 것 사용하기!
Member member = memberDAO.find(memberId); //SELECT * FROM MEMBER
Team team = member.getTeam();
String teamName = team.getName(); //SELECT * FROM TEAM
-> 위의 코드에서 Member 객체를 반환할 때 Member에 대해서만 쿼리가 수행되고, 그 후 Team 객체의 값에 접근할 때 Team에 대한 쿼리를 수행하게 됨
-> 2번의 쿼리가 필요함
Member member = memberDAO.find(memberId); //SELECT * FROM M.*, T.* FROM MEMBER JOIN TEAM . . .
Team team = member.getTeam();
String teamName = team.getName();
-> 어플리케이션에서 Member를 조회할 때 대부분 Team도 같이 사용하게 된다면, JOIN을 하여 1번의 쿼리로 두 객체를 모두 가져오는 것이 효율적임
-> JPA에서 제공해주는 옵션을 사용하여 수행 가능함
하지만 JPA만 알아서는 좋은 개발을 할 수 없다! 객체와 관계형데이터베이스에 대해서 잘 알아두기!! 명심하기!