
🧩 ORM이란
Object-relational mapping(객체 관계 매핑) 
- 객체는 객체대로 설계
 
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
 
- ORM 프레임워크가 중간에서 매핑
 
- 우리가 일반적으로 알고 있는 애플리케이션 
class와 RDB의 테이블을
매핑(연결)한다는 뜻이며, 기술적으로 어플리케이션의 객체를 RDB테이블에
자동으로 영속화 해주는 것이라고 보면 된다.  
장점
SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을
이용하여 비지니스 로직을 구성하는 데만 집중 할 수 있음
(내부적으로는 쿼리를 생성하여 DB를 조작함. 하지만 개발자가 이를 신경쓰지
않아도 됨) 
- Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어,
각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높임 
- 객체지향적인 코드 작성이 가능하다. 오직 객체지향적 접근만 고려하면
되기 때문에 생산성 증가 
- 매핑하는 정보가 
Class로 명시 되었기 때문에 ERD를 보는 의존도를
낮출 수 있고 유지보수 및 리팩토링에 유리 
- 예를 들어 기존 방식에서 MySQL 데이터베이스를 사용하다가 
PostgreSQL로
변환한다고 가정해보면, 새로 쿼리를 짜야하는 경우가 생김. 이런 경우에
ORM을 사용한다면 쿼리를 수정할 필요가 없음 
단점
- 학습비용이 비쌈
 
- 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저항 및
일관성을 무너뜨리는 문제점이 생길 수 있음. 
- 복잡하고 비지니스 로직에 종속적인 쿼리는 속도를 위해 별도의 튜닝이
필요하기 떄문에 결국 SQL문을 써야할 수도 있다.  
🧩 JPA?
Java Persistence API 
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한
인터페이스 
- 자바 진영의 ORM 기술 표준
 
- JPA가 제공하는 API를 사용하면 객체를 DB에 저장하고 관리할 때,
개발자가 직접 SQL을 작성하지 않아도 된다. 
- JPA가 개발자가 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체를 자동으로
Mapping 해준다.

 
🧩 데이터베이스 방언
- JPA는 특정 데이터베이스에 종속 X
 
- 각각의 데이터베이스가 제공하는 SQL문법과 함수는 조금씩 다름
 
- 가변 문자 : 
MySQL -> varchar / Oracle -> varchar2 
- 문자열을 자르는 함수 : 
SQL표준 -> SUBSTRING() / Oracle -> SUBSTR() 
- 페이징 :
 MySQL은 LIMIT, oracle rownum 
- 방언 :
 SQL표준을 지키지 않는 특정 데이터베이스만의 고유한 기능 
- oracle 이라고 하는 사투리를 써서 쿼리를 작성해 라는 뜻
 
