
객체지향 언어의 객체와 관계형 데이터베이스의 테이블을 자동으로 매핑해주는 기술을 말합니다.
예를 들어, 데이터베이스에 'age'와 'name'이라는 컬럼이 있고, 그 값으로 각각 20, 홍길동이 저장되어 있다고 가정하면 이런 데이터를 자바에서 어떻게 해야할까?
보통 우리는 SQL이라는 언어를 사용해서 데이터베이스에서 데이터를 추출한다. 원래라면 SELECT * From user와 같은 쿼리를 직접 써서 데이터를 가져와야 하지만 데이터 양이 방대할 수 있고 코드랑 sql을 따로 관리해야 해서 헷갈릴 수가 있다.
하지만 ORM이 있으면 데이터베이스의 값을 마치 객체처럼 사용할 수 있다.쉽게 말해 SQL에 대한 지식이 깊지 않아도 기본적인 CRUD는 자바 코드로만 데이터베이스에 접근해서 원하는 데이터만 가져올 수 있습니다.
-> 자바 코드 속의 객체와 데이터 베이스의 테이블을 연결해주는 다리 역할을 해주는 것이 ORM이다.
장점
단점

자바 객체를 데이터베이스 테이블과 매핑해서 DB작업을 쉽게 해주는 자바에서 사용하는 ORM기술 표준이다.
쉽게 말하면 SQL을 직접 많이 안 써도 자바 객체만으로 DB에 저장,조회,수정,삭제(CRUD)를 할 수 있게 해주는 기술
장점
기본 CRUD를 SQL없이 처리가 가능해 반복적인 SQL작성이 줄어들어 개발 속도가 빨라지고 생산성이 매우 높아진다.
테이블이 아니라 자바 객체 중심으로 개발 되고객체 간 관계를 코드로 표현해 비즈니스 로직이 명확해지고 코드 가독성이 좋아져 객체적인 개발이 가능해진다.
DB가 바뀌어도 코드 수정이 거의 없고 특정 DB에 종속되지 않는 구조를 가져 데이터베이스 독립성을 가진다.
테이블 구조 변경시 SQL 전부를 수정할 필요가 없고 엔티티만 수정하면 자동 반영되어 유지보수에 용이하다.
1차 캐시, 변경 감지, 쓰기 지연 개발자가 신경 쓰지 않아도 성능을 어느 정도 보장해 자동 최적화가 가능하다.
단점
영속성 컨텍스트, 트랜잭션, 지연로딩/즉시 로딩등의 개념을 이해하지 못하면 오류 원인 파악이 어렵다.
복잡한 통계, 다중 조인 쿼리 등 복잡한 쿼리에 한계가 있다.
SQL이 자동 생성되기 때문에 어떤 쿼리가 나가는지 모를 수 있고 N + 1 문제 등 성능 튜닝이 어렵다.
대량 배치 처리와 SQL 최적화가 매우 중요한 경우 등 모든 상황에 적합하지 않을 수 있다.
@Entity
public class Memo {
@Id
@GeneratedValue
private Long id;
}
자바 클래스가 DB테이블과 매핑된다. @Entity는 DB랑 연결이 된다.
entityManager.persist(memo);
JPA의 핵심 관리자이고 엔터티를 저장,조회,삭제하는 역할이 있다.
엔티티를 관리하는 1차 캐시 공간
특징 :
public interface MemoRepository extends JpaRepository<Memo, Long> {
}
기본 CRUD를 자동 제공하고 메서드 이름만으로 쿼리 생성이 가능하다.
@Transactional
public void updateMemo(...) { }
작업 단위를 보장하고 중간에 에러가 나면 자동으로 롤백하는 기능이 있다.
JPA는 개발 생산성과 유지보수성을 크게 향상시키는 ORM 기술이지만, 내부 동작에 대한 이해 없이 사용할 경우 성능 문제를 유발할 수 있다. 따라서 JPA의 장점을 살리기 위해서는 트랜잭션과 영속성 컨텍스트에 대한 충분한 이해가 필요하다.
본 개발자도 JPA 내부 동작을 구현하다가 코드가 꼬여서 성능문제를 유발했음..

내일하루도수고하세용~