JPA란 무엇인가?
JPA(Java Persisitence API)는 자바 진영의 ORM 기술 표준
.
어플리케이션과 JDBC 사이에서 동작

ORM (Object Relational Mapping)
객체와 테이블을 매핑해서 패러다임의 불일치를 개발자 대신 해결
해준다.
즉, 평상시에는 Mybatis(ibatis)를 사용하고 VO(DTO)를 제작해서 DB와 JAVA를 연결 해 주었었다.
private String name;
private String dept;
위와같이 VO와 getter, setter를 만들어서 DB랑 연결해서 썼었다.
만약 예약어 (NEW, SET..등) 때문에 이름을 사용할 수 없다면
resultMap 으로 별칭을 만들어서 연결을 해 주었었다!!
JPA는 그러한 불편함을 해결하기 위해 등장하였음..
객체를 저장하는 코드
jpa.persist(member);

객체를 조회하는 코드
Member member = jpa.find(memberId);

JPA의 장점
- 개발이 편리하다
- 웹 애플리케이션에서 반복적으로 작성하는 기본적인 CRUD용 SQL을 직접 작성하지 않아도 된다.
- 데이터베이스에 독립적인 개발이 가능하다.
- JPA는 특정 데이터베이스에 종속적이지 않기 때문에 데이터베이스와 관계없이 개발 할 수 있다.
- DB가 변경되더라도 JPA가 해당 DB에 맞는 쿼리를 생성 해줌.
- 유지보수가 쉽다
- Mybatis와 같은 매퍼 프레임워크를 사용해서 데이터베이스 중심의 개발을 하면 테이블이 변경될 경우 관련된 코드를 모두 변경해야 한다.
- 그렇지만 JPA를 사용하면 객체(JPA의 엔티티)만 수정하면 된다.
JPA의 단점
- 학습곡선(learning curve)이 크다
- 기존의 데이터베이스 위주의 개발방식에 비해서 배워야 할 것들이 많다.
- 또한 SQL을 직접적으로 작성하지 않기 때문에 튜닝 등을 할 때도 어려움을 겪는다.
- 특정 데이터베이스의 기능을 사용할 수 없다.
- JPA를 사용할 때 특정 데이터베이스에 종속적인 기능은 쓰지 않는 것이 좋다.
- 특히 오라클은 강력한 함수를 많이 제공하는데, 이와 같은 데이터베이스에 종속적인 기능을 사용할 경우 데이터베이스에 독립적인 개발이 불가능 해 진다.
- 이 경우 데이터베이스에 독립적인 개발이 가능한 JPA의 장점을 잃는다.
- 객체지향 설계가 필요하다.
- 데이터베이스 중심의 개발에서도 객체지향적 설계가 필요하다.
- 그렇지만 객체 위주의 설계보다 데이터베이스의 테이블을 설계하고 그에 맞춰서 객체 및 비즈니스 로직이 설계, 개발되기 때문에 객체지향적인 설계가 어려울 수 있다.
Spring DATA JPA 란?
스프링 데이터 JPA란 JPA를 스프링에서 쉽게 사용할 수 있도록 해 주는 라이브러리 이다.
스프링 데이터 JPA는 Repository라는 인터페이스를 상속받아 정해진 규칙에 맞게 메서드를 작성하면 개발자가 작성해야 할 코드가 완성 된다.
그리고 내부적으로는 실제 기능을 담당하는 JPA의 구현체인 JPA 프로바이더로 하이버네이트를 사용한다.
하이버네이트를 모르더라도 프레임워크가 하이버네이트를 이용해서 적절한 코드를 생성하기 때문에 JPA를 쉽게 사용할 수 있다.