[SpringBoot] ORM & JPA

Intro

부트를 접하면서 JPA가 가장 신기했고 정말 이해만 한다면 편리한 기술이겠구나 생각이 들었다. 그렇기에 확실하게 JPA의 개념을 정리하고자 한다.

ORM(Object-Relational-Mapping)이란?

DB의 특정 테이블이 자바의 객체로 매핑되어 SQL문을 일일이 작성하지 않고 객체로 구현할 수 있도록 하는 기술이라고 할 수 있다. 여기서 포인트는 객체와 관계형 데이터베이스의 매핑이다.

  • 객체와 RDB를 매핑할 때 불일치가 발생할 수 있는데, ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다.
  • 장점
    • SQL Squery를 직접 작성하지 않아도, JPArepository의 메서드를 활용하여 객체.findAll(), 객체.findById() 등의 메서드를 사용하여 데이터 조회를 할 수 있다.
      • ex) SELECT * FROM member; => member.findAll();
    • 객체 지향적인 코드 작성이 가능하다 !
      • SQL문이 아닌, 클래스의 메서드를 활용하기에 객체 모델만 이용하여 프로그래밍을 하는 데 집중할 수 있게 한다.
    • 가독성도 높일 수 있음.
    • DBMS 종속성이 줄어든다.
      • 자바에서 equals, hashcode의 오버라이드 같은 자바 기능을 사용할 수 있음.
  • 단점
    • 완벽한 ORM으로만 서비스 구현이 어렵다.
      • 사용하기는 편리하지만, 설계를 매우 신중하게 해야 한다.(순환참조가 발생할 수 있기 때문.)
      • 프로젝트 규모가 커질 수록 난이도가 어려워진다.

JPA(Java Persistent API)란?

JPA(Java Persistent API)란 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스로, 자바 ORM 기술에 대한 API 표준 명세이다.

  • 자바에 있는 데이터를 영구히 기록할 수 있도록 환경을 제공하는 API이다. (여기서 중요한 점은 JPA는 인터페이스인 것이다. 라이브러리가 아님!!)
  • JPA를 구현한 구현체가 Hibernate이다.
    • Hibernate는 ORM 프레임워크 중 가장 많이 사용되며 JPA의 인터페이스의 실제 구현부를 담당한다.
  • Hibernate를 통해 JDBC API를 사용하여 DB와 통신하고 SQL을 호출하고 반환한다.
    • Hibernate가 지원하는 메서드 내부에서 JDBC API가 동작하고 있고, 단지 개발자가 직접 SQL을 작성하지 않는 것임.
  • 장점
    • 반복적인 CRUE 작업을 생략하게 해준다.
    • SQL이 아닌 객체 중심으로 개발할 수 있다는 것이다. 객체 중심으로 개발하게 되면 생산성 향상과 유지보수도 수월해지는 장점도 있다.
    • JPA를 통해 상속, 연관관계, 컴포지션 등 OOP의 관점에서 모델링을 할 수 있게 해준다.
  • 단점
    • 학습이 어렵고, 학습 비용이 높음.
    • 잘못 사용하게 되면 직접 Query 작성하는 것보다 성능이 떨어질 수 있음.

Spring Data JPA

Spring Data JPA는 위에서 정리한 JPA를 사용하기 편하게 만들어 둔 모듈이다.

  • JPA를 추상화시킨 Repository Interface를 제공하여 개발자가 JPA를 더 편하게 사용할 수 있게 하는 모듈임.
  • Spring Data JPA를 사용하지 않으면 repository에 @Repository를 작성하고 JPA 적용 후 EntityManager의 API를 직접 호출해야 처리가 되지만 작성하지 않아도 Bean으로 자동 등록된다.

결론

참고 사이트

참고 게시물 1 참고 게시물 2 참고 게시물 3