DB >>> ORM >>> JPA > SpringData JPA 순으로 탄생하였기 때문에 기존 회사들에서 JPA가 적용되어 있지 않은 프로젝트들이 많이 존재한다고 한다.
1. DB 탄생 후 Java 앱과 연동을 위해 JDBC 이 탄생
JDBC
- Java Database Connectivity
- Java 앱과 DB 를 연결시켜주기 위해 만들어진 기술
- JPA 도 이 기술을 사용하여 구현되어 있다.
-> JDBC에 대해서는 내배캠에서 초반에만 살짝 다루었기 때문에 조금 더 공부할 필요성이 있음.
- JDBC Driver 는 여러타입의 DB 와 연결할 수 있는 기능을 제공

- JDBC Driver는 각각의 DB에 맞게끔 설정되어있고, 그것을 Java Application에서 사용할 수 있도록 하는 것이며, JDBC Driver manager는 그러한 Driver들을 관리하는 것으로 생각하면 될듯
- JDBC Driver Manager 는 런타임 시점에
- Connection(연결) 을 생성하여 쿼리를 요청할 수 있는 상태를 만들어주고
- Statement(상태) 를 생성하여 쿼리를 요청하게 해주고
- ResultSet(결과셋) 을 생성해 쿼리 결과를 받아올 수 있게 해줍니다.
- 🚫 꼭 사용후에는 각각 close() 를 호출해서 자원 해제를 시켜줘야 합니다! 🚫
-> 해당 과정에서 리소스가 많이 들기 때문에 자원해제를 해주지 않으면 자원 누수 현상이 일어나서 프로그램에 좋지 않고, 다른 기능이 실행되지 않을 수 있으니 주의하자.

- 위의 과정을 따르는데
- Driver Manager가 getConnection()을 사용해서 connection을 만들고
- connection에서 createStatement()를 사용, 해당 상태 (state)를 만들어준다.
- 해당 statement에서 executeQuery()를 사용, 쿼리가 날라가며 실행됨.
- close해주는 것은 역순으로 resultset > statement > connection 순으로 하면 됨
2. JDBC 의 여러 문제로 QueryMapper 이 탄생
- JDBC로 직접 SQL을 작성했을때의 문제
- SQL 쿼리 요청시 중복 코드 발생
-> 쿼리를 계속 작성해주거나, 혹은 집어넣어 주어야하는 문제가 발생한다.
- DB별 예외에 대한 구분 없이 Checked Exception (SQL Exception) 처리
- Connection, Statement 등.. 자원 관리를 따로 해줘야함
- 안해주면 메모리 꽉차서 서버가 죽음
-> 위에서 언급했었던 close 관련 문제
- 이 문제 해결을 위해 처음으로 Persistence Framework 등장!
- Persistence Framework 는 2가지가 있다.
- SQL Mapper : JDBC Template, MyBatis 👈 요게 먼저나옴
- ORM : JPA, Hibernate
- SQL Mapper (QueryMapper)
- SQL ↔ Object
- SQL 문과 객체(Object)의 필드를 매핑하여 데이터를 객채화
-> 자바 코드로 구성된 Entity랑 DB의 테이블이랑 매핑했다고 보면 될듯
JDBC Template
- SQL Mapper 첫번째 주자로 JDBCTemplate 탄생
- 쿼리 수행 결과와 객채 필드 매핑
- RowMapper 로 응답필드 매핑코드 재사용
- Connection, Statement, ResultSet 반복적 처리 대신 해줌
- But, 결과값을 객체 인스턴스에 매핑하는데 여전히 많은 코드가 필요함

MyBatis
- SQL Mapper 두번째 주자로 MyBatis 탄생
- 반복적인 JDBC 프로그래밍을 단순화
- SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL 을 분리!
- But, 결국 SQL을 직접 작성하는것은 피곤하다…(DB 기능에 종속적)
- But, 테이블마다 비슷한 CRUD 반복, DB타입 및 테이블에 종속적이다.

-> 즉, 여기까지의 Framework들은 Java Application 중심이 아니라 DB 중심으로 이루어져있다.
3. QueryMapper 의 DB의존성 및 중복 쿼리 문제로 ORM 이 탄생
- ORM 은 DB의 주도권을 뺏어왔다고 표현해도 과언이 아닙니다.
- ORM 은 DAO 또는 Mapper 를 통해서 조작하는것이 아니라 테이블을 아예 하나의 객체(Object)와 대응시켜 버립니다.
