
= 객체와 관계형 데이터베이스를 매핑하는 도구이다.

SQL 쿼리가 아닌, 직관적인 코드(메서드)로 데이터를 조작한다.
SELECT *FROM user; -> user.findAll()
SQL 문을 사용하지 않고 객체 지향적 코드를 작성할 수 있어서 코드의 가독성을 높이고 개발자 편의성을 증대할 수 있다.
DB 연동과 관련된 많은 부분을 자동으로 처리해주므로, 개발자는 더 적은 코드를 작성하고 더 높은 수준의 추상화를 얻는다. 개발 친화적이다.
SQL을 직접 다룸으로 생기는 문제점은 특정 DB에 종속적으로 사용하기 쉽다는 것이다.
테이블마다 비슷한 CRUD SQL은 DAO 개발이 매우 반복되는 작업을 초래한다.
테이블 필드가 변경될 시 , 이와 관련된 모든 DAO의 SQL문, 객체의 필드 등을 수정해야 한다.
코드 상으로 SQL과 JDBC API를 분리했다 하더라도 논리적으로 강한 의존성을 가지고 있다.
SQL을 직접 작성하면 결국 SQL의 의존적인 개발을 할 수 밖에 없는데,
객체 간의 관계는 사라지고 DB에 대한 처리에 집중하게 된다.
즉, 비즈니스 로직 구현보다 데이터베이스 접근 로직 구현에 집중하며 DB에 항상 의존관계를 가질 수 밖에 없다.
하지만 JPA에서는 SQL과 유사한 기술인 JPQL을 지원하고 , SQL 자체 쿼리를 작성할 수 있도록 지원하며 SQL Mapper와도 혼용해서 사용도 가능해서 어느정도 해결 가능하다.
SQL로부터 분리된 설계 즉, DB에 의존하지 않은 상태에서 개발할 경우,
도메인과 비즈니스 로직 구현에 좀 더 집중할 수 있다.
또한 데이터베이스 서버와 의존 관계를 가지지 않는 구현 단계를 거치면서 더 빠른 구현과 테스트 인 피드백 사이클을 돌 수 있으며 요구 사항 변화에 빠르게 대응할 수 있다는 이점이 있다.
Spring Data - 저장소 종류가 달라도 일관된 데이터 처리 방법을 제공한다.
Spring Data JPA = JPA를 위한 저장소(JpaRepository)와 관련 기능을 제공