데이터베이스 연동(1) - ORM, JPA, Hibernate, Mybatis, JDBC
ORM(Object Relational Mapping)
ORM은 Object Relational Mapping의 줄임말로 객체 관계 매핑을 의미한다. Java와 같은 객체지향 언어에서 의미하는 객체(클래스)와 RDB(Relational Database)의 테이블을 자동으로 연결(mapping)하는 방법이다.
클래스는 데이터베이스의 테이블과 연결(mapping)하기 위해 만들어진 것이 아니기 때문에 RDB 테이블과 어쩔 수 없는 불일치가 존재한다. ORM은 이 둘의 불일치와 제약사항을 해결하는 역할이다.
ORM의 장단점
ORM의 장점
- ORM을 이용하면 쿼리문 작성이 아닌 코드(Method)로 데이터를 조작할 수 있어서 개발자는 객체 모델을 이용하여 비즈니스 로직으로 구성하는데만 집중할 수 있다.
(물론 내부적으로는 쿼리를 생성하여 DB를 조작한다) - 연결하는 정보가 Class로 명시되어 있으면 ERD를 보는 의존도도 낮출 수 있다.
- 재사용 및 유지보수가 편하다
- 데이터베이스에 대한 종속성이 줄어든다. 예를 들어 DB를 MySQL에서 PostgreSQL로 변환한다면 쿼리를 새로 짜야되는데 ORM을 사용한다면 쿼리를 수정할 필요가 없다.
ORM의 단점
- 복잡한 서비스의 경우 직접 쿼리를 구현하지 않고 코드로 구현하기 어렵다
- 복잡한 쿼리를 정확한 설계 없이 ORM만으로 구성하게 되면 속도 저하 등의 성능 문제가 발생할 수 있다.
- 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨릴 수 있다.
- 세분성 : ORM의 자동 설계 방법에 따라 데이터베이스에 있는 테이블의 수와 애플리케이션의 엔티티 클래스의 수가 다른 경우가 생긴다.
- 상속성 : RDBMS에는 상속이라는 개념이 없다
- 식별성 : RDBMS는 기본 키로 동일성을 정의하는데 자바는 두 객체의 값이 같아도 다르다고 판단할 수 있다
- 연관성 : 객체 지향 언어는 객체를 참조함으로써 연관성을 나타내지만 RDBMS에서는 외래키를 삽입함으로써 연관성을 표현한다. 또한 객체지향 언어에서 객체를 참조할 때는 방향성이 존재하지만 RDBMS에서 외래키를 삽입하는 것은 양방향의 관계를 가지기 때문에 방향성이 없다.
JPA(Java Persistence API)
Java Persistence API는 자바 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음이다. (Java에서 제공한다. 즉, ORM을 사용하기 위한 표준 인터페이스들을 모아둔 것이다)
이전에는 EJB, 엔티티 빈 이라는 개념들로 사용했는 이를 대체하기 위한 기술이 JPA이다.
JPA 또한 실제로 동작하는 것이 아니라 어떻게 동작해야 하는지 메커니즘을 정리한 표준 명세로 생각하면 된다. (즉, 인터페이스 이기 때문에 JPA를 구현하기 위해 Hibernate나 OpenJPA같은 프레임워크를 사용한다. JPA는 구현된 클래스와 연결해주기 위해 사용되는 프레임워크)
JPA의 메커니즘을 보면 내부적으로 JDBC를 사용한다. 개발자가 직접 JDBC를 구현하면 SQL에 의존하게 되는 문제 등이 있어 개발의 효율성이 떨어지는데, JPA는 이 같은 문제점을 보완해서 개발자 대신 적절한 SQL을 생성하고 데이터베이스를 조작해서 객체를 자동 매핑하는 역할을 수행한다.
ORM에서의 단점을 일부 해결하였는데, 데이터베이스는 상속관계를 지원하지 않는데 JPA는 이를 해결하였다.
예를 들어서 item이라는 table에 name과 price라는 column이 있다고 가정하자. 이를 상속하여서 나는 book이라는 table을 만들고 싶다면 item의 id를 book이 primary key로 상속받는 형식으로 해결한다.
JPA의 구성요소로는 javax.persistence 패키지로 정의된 API 그 자체가 있고, JPQL(Java Persistence Query Language) 그리고 객체관계 메타데이터로 구성된다고 한다.
JPA 기반의 구현체(ORM 프레임워크)는 대표적으로 세가지가 있다. (하이버네이트, 이클립스 링크, 데이터 뉴클리어스)
이 중에서도 하이버네이트를 제일 많이 사용한다.
하이버네이트
: 자바의 ORM 프레임워크로 JPA구현체 중 하나이다. Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있다.
HQL(Hibernate Query Language)이라 불리는 매우 강력한 쿼리 언어를 포함하고 있다.
HQL은 완전히 객체 지향적이며 상속, 다형성, 관계 등의 객체 지향의 강점을 사용할 수 있다.
HQL은 쿼리 결과로 객체를 반환하며 생성과 접근을 개발자가 원하는 대로 할 수 있다.
HQL은 페이지네이션과 동적 프로파일링 같은 기능을 제공한다고 한다.
JDBC(Java Database Connectivity)
JDBC는 DB에 접근할수 있도록 Java에서 제공하는 API이다. 모든 Java Data Access 기술의 근간이 되고, 모든 영속성컨텍스트의 프레임워크는 내부적으로 JDBC API를 사용한다고 보면된다.
Spring Data JPA
JPA를 편리하게 사용할 수 있도록 지원하는 스프링 하위 프로젝트 중 하나이다. 데이터베이스 CRUD 처리에 필요한 인터페이스를 제공하며, 하이버네이트의 엔티티 매니저를 직접 다루지 않고 리포지토리를 정의해 사용함으로써 스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스를 조작한다. 이를 통해 하이버네이트에서 자주 사용되는 기능을 더 쉽게 사용할 수 있게 구현한 라이브러리이다.
Mybatis
ORM, JPA, Hibernate 이쪽과는 다른 방식으로 데이터베이스를 다룬다.
Mybatis는 SQL Mapper라는 개념을 사용하는 SQL Mapper는 자바 객체를 실제 SQL문에 연결해주어서 빠른 개발과 편리한 테스트 환경을 제공한다.
JDBC로 처리하는 부분 중 코드와 파라미터 설정 및 결과 연결(mapping)을 대신해준다.
(Mybatis의 예전 이름은 iBatis인데 Google Code로 이전되면서 이름이 바뀌었다.)
Mybatis vs JPA(ORM)
- 영속 계층에서의 영속 프레임워크는 2개로 나눌 수 있는데 SQL Mapper와 ORM으로 나눌 수 있다.
- ORM은 데이터베이스 객체를 자바 객체로 매핑함으로써 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해준다.
- 관계형 데이터베이스의 '관계'를 Object에 반영하자는 것이 목적이다
- SQL Mapper는 SQL을 명시해주어야 한다.
- JPA는 ORM 기술이고 MyBatis는 SQL Mapper의 한 종류이기 때문에 데이터베이스를 어떻게 다룰 것이냐에 따라 선택하면 될 것 같다
[참고] [JDBC] JDBC, JPA/Hibernate, Mybatis의 차이 - Heee's Development Blog
'백엔드 > SpringBoot' 카테고리의 다른 글
[Spring] 서블릿, Spring MVC 발달 과정 (0) | 2023.06.28 |
---|---|
[Spring] 스프링 시큐리티 + JWT (0) | 2023.05.31 |
[Spring] Spring Security 의존성을 사용하는 로그인 (0) | 2023.05.31 |
Spring Security를 사용하는 이유와 동작 방식 (1) | 2023.05.25 |
[Spring] 오류 Referential integrity constraint violation (0) | 2022.12.23 |