ORM과 JPA

오하수·2026년 1월 21일

ORM(object-relational mapping)

객체지향 언어의 객체와 관계형 데이터베이스의 테이블을 자동으로 매핑해주는 기술을 말합니다.

예를 들어, 데이터베이스에 'age'와 'name'이라는 컬럼이 있고, 그 값으로 각각 20, 홍길동이 저장되어 있다고 가정하면 이런 데이터를 자바에서 어떻게 해야할까?

보통 우리는 SQL이라는 언어를 사용해서 데이터베이스에서 데이터를 추출한다. 원래라면 SELECT * From user와 같은 쿼리를 직접 써서 데이터를 가져와야 하지만 데이터 양이 방대할 수 있고 코드랑 sql을 따로 관리해야 해서 헷갈릴 수가 있다.

하지만 ORM이 있으면 데이터베이스의 값을 마치 객체처럼 사용할 수 있다.

쉽게 말해 SQL에 대한 지식이 깊지 않아도 기본적인 CRUD는 자바 코드로만 데이터베이스에 접근해서 원하는 데이터만 가져올 수 있습니다.

-> 자바 코드 속의 객체와 데이터 베이스의 테이블을 연결해주는 다리 역할을 해주는 것이 ORM이다.


ORM의 장점과 단점

장점

  • SQL을 직접 작성하지 않고, 사용하는 언어로 데이터베이스에 접근할 수 있다.
  • 객체지향적으로 코드를 작성할 수 있기 때문에 비즈니스 로직에만 집중할 수 있다.
  • 데이터베이스 시스템이 추상화되어 있어, 예를들어 MySQL에서 postgreSQL로 전환할 때 추가 자작업이 거의 필요없다. 즉 데이터베이스 시스템에 대한 종속성이 줄어든다.
  • 매핑하는 정보가 명확해지기 때문에 ERD에 대한 의존도를 낮출 수 있고, 유지보수 시 유리하다.

단점

  • 프로젝트가 복잡해질수록 ORM의 사용 난이도 높아질 수 있다.
  • 복잡하고 성능이 중요한 쿼리는 ORM으로 해결하기 어려운 경유가 있다.

JPA란

자바 객체를 데이터베이스 테이블과 매핑해서 DB작업을 쉽게 해주는 자바에서 사용하는 ORM기술 표준이다.

쉽게 말하면 SQL을 직접 많이 안 써도 자바 객체만으로 DB에 저장,조회,수정,삭제(CRUD)를 할 수 있게 해주는 기술


JPA의 장점과 단점

장점

  • 기본 CRUD를 SQL없이 처리가 가능해 반복적인 SQL작성이 줄어들어 개발 속도가 빨라지고 생산성이 매우 높아진다.

  • 테이블이 아니라 자바 객체 중심으로 개발 되고객체 간 관계를 코드로 표현해 비즈니스 로직이 명확해지고 코드 가독성이 좋아져 객체적인 개발이 가능해진다.

  • DB가 바뀌어도 코드 수정이 거의 없고 특정 DB에 종속되지 않는 구조를 가져 데이터베이스 독립성을 가진다.

  • 테이블 구조 변경시 SQL 전부를 수정할 필요가 없고 엔티티만 수정하면 자동 반영되어 유지보수에 용이하다.

  • 1차 캐시, 변경 감지, 쓰기 지연 개발자가 신경 쓰지 않아도 성능을 어느 정도 보장해 자동 최적화가 가능하다.

단점

  • 영속성 컨텍스트, 트랜잭션, 지연로딩/즉시 로딩등의 개념을 이해하지 못하면 오류 원인 파악이 어렵다.

  • 복잡한 통계, 다중 조인 쿼리 등 복잡한 쿼리에 한계가 있다.

  • SQL이 자동 생성되기 때문에 어떤 쿼리가 나가는지 모를 수 있고 N + 1 문제 등 성능 튜닝이 어렵다.

  • 대량 배치 처리와 SQL 최적화가 매우 중요한 경우 등 모든 상황에 적합하지 않을 수 있다.


JPA의 핵심 개념

1. Entity(엔터티)

@Entity
public class Memo {
    @Id
    @GeneratedValue
    private Long id;
}

자바 클래스가 DB테이블과 매핑된다. @Entity는 DB랑 연결이 된다.

2.EntityManager

entityManager.persist(memo);

JPA의 핵심 관리자이고 엔터티를 저장,조회,삭제하는 역할이 있다.

3. Persistence Context(영속성 컨텍스트)

엔티티를 관리하는 1차 캐시 공간

특징 :

  • 같은 ID조회 시 DB재조회를 하지 않는다.
  • 변경 감지가 자동으로 된다.
  • 트랜잭션이 끝나면 DB에 반영된다.

4. Repository(Spring Data JPA)

public interface MemoRepository extends JpaRepository<Memo, Long> {
}

기본 CRUD를 자동 제공하고 메서드 이름만으로 쿼리 생성이 가능하다.

5. 트랜잭션(@Transactional)

@Transactional
public void updateMemo(...) { }

작업 단위를 보장하고 중간에 에러가 나면 자동으로 롤백하는 기능이 있다.


JPA는 개발 생산성과 유지보수성을 크게 향상시키는 ORM 기술이지만, 내부 동작에 대한 이해 없이 사용할 경우 성능 문제를 유발할 수 있다. 따라서 JPA의 장점을 살리기 위해서는 트랜잭션과 영속성 컨텍스트에 대한 충분한 이해가 필요하다.

본 개발자도 JPA 내부 동작을 구현하다가 코드가 꼬여서 성능문제를 유발했음..

profile
오늘하루도수고하세용~

2개의 댓글

comment-user-thumbnail
2026년 1월 23일

내일하루도수고하세용~

1개의 답글