인프런 김영한 강사님의 자바 ORM 표준 JPA 프로그래밍 - 기본편을 정리할 예정입니다. 해당 강의는 JPA 에 대한 소개와 원리에 대한 강의입니다.
객체지향 프로그래밍은 다형성, 상속 등을 활용하여 매우 유연성 높은 프로그래밍을 가능케한다.
관계형 데이터베이스는 데이터의 무결성과 일관성을 보장하며, Join 을 통해 복잡한 쿼리를 가능케하는 장점이 있다.
현대 개발은 주로 객체지향 방식으로 개발을 해서 이를 관계형 DB에 저장하고 관리하는 것이 보편적이다.
String sql = "INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES(?,?)";
pstmt.setString(1, member.getMemberId());
pstmt.setString(2, member.getName());
pstmt.excuteUpdate(sql);
순수 JDBC를 사용하여 member 객체를 MEMBER 테이블에 삽입하는 과정이다. 작성한 쿼리문에 모든 객체의 필드를 대입한 뒤 실행한다.
public class Member {
private String memberId;
private String name;
private String tel; // 추가됨
}
String sql = "INSERT INTO MEMBER(MEMBER_ID, NAME, TEL) VALUES(?,?,?)";
Member 의 필드에 tel 이 추가되었다고 가정하자. SQL 을 변경하는 것은 물론, SQL에 객체의 필드를 대입해주는 부분도 개발자가 일일이 수정해야할 것이다. 즉 객체를 수정할 때마다 SQL도 수정하게되어 SQL 에 의존적인 개발을 하게된다.
public class Member {
private String memberId;
private Team team;
private Order order;
}
String sql = "SELECT M.*, T.* FROM MEMBER M JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID"
Member.getOrder(); ??
Member 객체의 필드로 Team 객체와 Order 객체가 있다고 가정하자. 이때 SQL 문의 Join 문으로 필드의 Team 객체를 함께 가져와서 Member 객체에 넣어줬다. 그런데 Order 문과는 Join 을 하지 않았기에 getOrder 시 Null이 조회될 것이다.
즉 조회한 엔티티의 필드 범위가 SQL에 의해 결정되기에, 엔티티의 필드값을 신뢰할 수 없게된다.
JPA 는 자바 진영의 ORM 기술 표준이다. ORM 이란 객체 관계 매핑을 말하는데. 객체와 관계형 데이터베이스의 중간에서 매핑시켜주는 프레임워크를 말한다. 정확히는 JAVA 어플리케이션과 JDBC 사이에서 동작한다. JPA 는 인터페이스의 모음이며, 구현체로는 주로 Hibernate 를 사용한다.
1. 생산성
저장 : em.persist(객체)
조회 : em.find(타입, PK값)
수정 : 조회한 객체 수정하면 자동 flush
삭제 : em.remove(객체)
-> SQL 직접 짤 필요없이 JPA가 CRUD 를 자동제공한다. 생산성이 증대.
2. 유지보수
객체의 필드가 변경되어도 쿼리문을 JPA가 짜므로 일일이 SQL을 수정할 필요가 없다. JPA가 자동으로 반영해서 수정한 SQL문을 생성한다.
3. JPA와 패러다임 불일치 해결
4. 성능 개선
기존 JDBC 방식은 객체를 수정해도 SQL문 까지 모두 수정해야하는 SQL 의존 개발이 이루어진다. JPA 는 객체<->테이블의 SQL 문을 자동으로 생성해주므로 생산성이 향상되고 유지보수가 용이하다.