OOP(Object Oriented Programming)에서 쓰이는 객체라는 개념을 구현한 클래스와 RDB(Relational Database) 에서 쓰이는 데이터인 테이블을 자동으로 매핑(연결)하는 것을 의미한다. 그런데 클래스와 테이블은 호환되지 않기 때문에 불일치가 발생한다. 이 불일치를 ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다. ORM을 이용하면 따로 SQL문을 짤 필요없이 객체를 통해 간접적으로 데이터베이스를 조작할 수 있게된다.
ORM 단점
ORM으로 모든 걸 해결할 수 없음. 결국 SQL문을 써야 한다. -> JPQL
클래스-테이블 간의 불일치를 완벽하게 해결하지 못함
그 이유는?
크게 세분성, 상속성, 일치, 연관성, 탐색이라는 이유가 있다.
세분성: 테이블 수보다 더 많은 클래스를 가진 모델이 생길 수 있음
상속성: RDBMS는 OOP 특징인 상속개념이 없다.
일치: RDBMS는 pk를 이용하여 동일성을 정의하지만, 자바는 a==b 그리고 a.equals(b) 로 정의함
연관성: 자바는 객체의 참조를 사용하여 연관성을 나타내지만 RDBMS는 방향성이 없는 fk를 이용해서 나타낸다.
탐색: 자바는 그래프 형태로 객체를 접근하고 RDBMS는 JOIN 을 통해 접근한다.
ORM 프레임워크
JPA/Hibernate
JPA
자바의 ORM 기술 표준
인터페이스 모음
Hibernate
JPA 표준 명세를 구현한 구현체
Sequelize
Django ORM
SQL
Structured Query Language
구조화된 질의 언어
필요한 데이터에 대해서 구조화된 언어로 작성해서 실행하면 데이터베이스에서 데이터를 보여준다.
SQL을 통해 데이터베이스에 있는 데이터를 추출할 수 있음
JPQL
Java Persistence Query Language
SQL과 비슷한 문법을 가진 객체지향 쿼리
JPQL은 왜 생겼을까?
JPA에서 제공하는 메서드 호출만으로는 섬세한 쿼리 작성이 어렵기 때문
MVC
Model, View, Controller의 합성어로 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴
디자인 패턴?
소프트웨어의 개발 방법을 공식화 한 것
Model
백그라운드에서 동작하는 로직을 처리
View
사용자가 보게 될 결과 화면을 출력
Controller
사용자의 입력 처리와 흐름을 제어
사용자가 접근한 URL에 따라 사용자의 요청사항을 파악한 후, 그 요청에 맞는 데이터를 Model에 의뢰한다. 그리고 데이터를 View에 반영해서 사용자에게 알려준다.
MVC 패턴에는 모델1 방식과 모델2 방식이 있다.
MVC 모델1
JSP 안에 view + controller 가 공존함
MVC 모델2
철저하게 분리된 시스템을 기본으로 함
대부분의 웹은 모델2를 따르고 스프링 mvc 또한 모델2를 기반으로 함
어려움을 겪은 일
지금까지 구현한 건 간단한 CRUD 기능이라 JPA를 잘 몰라도 지금까지 큰 문제가 없었지만 내부적으로 어떻게 동작하는지 이해하고 쓴 게 아니어서 예상하지 못한 에러가 발생할 때마다 이 부분이 좀 힘들기도 했다. 특히 JPA 코드를 작성하는데 확신이 없는 경우가 많았다.