왜 Java객체를 DB에 바로 저장하지 못하고 JDBC? JPA?를 사용하는걸까?
Java와 DB가 데이터를 바라보는 관점이 다르기에 변환을 해서 저장해줘야한다.
데이터를 바라보는 관점의 차이는 [객체 vs 테이블 간의 관계] 라고 생각한다.
class Item
int id;
String name;

이러한 관점차이, JAVA는 객체 주소의 관계로, DB는 테이블 레코드의 키를 통해서 데이터를 연결하기에 바로 연결을 할 수 없는 것이다.
이러한 관점을 무시하고 서로를 연결하기 위해 조금 더 유연성 있는 JAVA가 DB에 맞추고자 키로 데이터에 접근하면서 객체 지향적이지 않게 되는 문제가 발생한다.
이러한 문제점을 해결하기 위해 ORM이 등장하게 되었다.
ORM은 객체와 관계형 데이터베이스 간의 데이터를 매핑해주는 기술로
ORM은 객체(Object)와 DB의 테이블을 자동으로 연결(Mapping)시켜 RDB 테이블을 객체 지향적으로 사용하게 해주는 기술이다.
즉, JDBC를 통해 DB에 접속하여 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면 된다.
💡영속성 & JDBC란?
영속성: 데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 개념을 영속성(Persistence)이라고 한다.
JDBC: Java에서 데이터베이스에 접속할 수 있도록 하는 Java API이다.
이전에 언급했듯이, 객체 모델과 관계형 모델 간에는 불일치가 존재하는데, ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
그럼이제 JPA 대해 알아보자.
JPA란?
Java에서 객체를 DB에 저장하고 관리하기 위한 인터페이스와 기능을 제공하는 API으로 Java의 ORM기술 표준이다.
JPA는 API, 즉 인터페이스이므로 구현체가 필요하다. 그 중 가장 유명한 것이 "Hibernate"가 있으며 Hibernate는 JDBC를 기반으로 작동한다.
-JPA가 코드 바꿔준다-

-JPA 동작방식-

💡Spring JPA?
JPA != SpringJPA이다. 일반적인 Java app에서도 JPA 사용 가능하다.
[Spring Data JPA -> JPA -> JDBC API] <-> MySQL 로 데이터가 흘러간다.
@Entity 를 클래스 위에 달아 놓으면, 영속성 컨텍스트에 들어가게 처리한다.@Id 는 DB에 넣기 위해 필요한 것이 아니라 영속성 컨텍스트에 존재하는 수많은 객체들을 구분하기 위해 필요한 것이다.
DB에 저장을 위해 레코드를 만들고 그 다음 객체를 넣는 작업의 순서를 보장