1. 영속성(persistence)이란?
데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 말한다.
영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 사라진다. 우리는 데이터들에 영속성을 부여하기 위해서 데이터베이스를 활용하는 것이다.
2. Persistence Framework
JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동을 보장하는 프레임워크이다.
Persistence Framework는 SQL Mapper와 ORM으로 나눌 수 있다.
Ex) JPA, Hibernate, Mybatis 등
2-1 SQL Mapper
- SQL Mapper는 직접 SQL문을 작성해 DB를 접근하는 것이다. 즉, SQL Mapper는 SQL을 명시해줘야 한다.
- SQL을 실행하여 얻은 DB 데이터를 객체로 매핑시켜준다.
- Mybatis, Spring JDBC가 SQL Mapper에 해당한다.
- SQL <— 매핑 —> Object 필드
- ex) Mybatis, JdbcTempletes 등
2-2 ORM (Object Relational Mapping)
- 데이터베이스 데이터 <— 매핑 —> Object 필드
- 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
- ORM을 사용하면 SQL을 작성하지 않고도 직관적인 코드(메서드)를 사용해 데이터를 조작할 수 있다.
- 객체 간의 관계를 바탕으로 SQL을 자동으로 생성한다.
- ex) JPA, Hibernate 등
3. 데이터를 데이터베이스에 저장하는 3가지 방법(자바 기준)
1) JDBC
2) SQL Mapper(Spring JDBC)
3) ORM(JPA)
3-1. JDBC란?
JDBC(Java DataBase Connectivity)는 데이터베이스에 연결 및 작업을 하기 위한 자바 표준 인터페이스 입니다. 자바는 DBMS(Oracle, MySQL, MongoDB 등)의 종류에 상관 없이 하나의 JDBC API를 이용해서 데이터베이스 작업을 처리합니다. 이 JDBC는 DB에 접근해서 CRUD를 쉽고 효율적이게 할 수 있게 하고, 고성능에서의 세련된 메소드를 제공하며 쉽게 프로그래밍 할 수 있게 도와줍니다.
3-1-1. JDBC가 생긴 이유
JDBC API가 없던 때에는 데이터베이스의 종류 마다(ms-sql, my-sql, oracle ..) 각각의 다른 SQL문을 사용하였기 때문에 DB의 종류에 따라 SQL문의 작성 방법이 너무나 차이가 나서 구현이 불편하였다. 이를 극복하기 위해서 표준 인터페이스인 JDBC가 등장하게 된 것이다.
3-1-2. JDBC 인터페이스
-JDBC API
JDBC API는 자바 프로그래밍 언어로 작성된 인터페이스, 클래스, 및 예외 클래스들의 집합으로 구성되어 있으며, SQL을 이용해 자바 프로그래밍 언어로 데이터베이스 응용 프로그래밍을 작성할 수 있도록 지원한다.
- JDBC Driver manager
자바 응용프로그램이 사용하는 DB에 맞는 드라이버를 찾고 JDBC를 초기화하는 역할 수행.
- JDBC Driver API
JDBC Driver API는 JDBC드라이버 매니저와 각 DBMS의 벤더에서 제공하는 JDBC Driver가 서로 접속하기 위한 인터페이스입니다.
- JDBC Driver
JDBC Driver와 DBMS 접속을 제어하는 모듈. 각 DB업체에서 만든 드라이버로 JDBC를 지원하는 어떤 DB에도 접근하는 것이 가능하다.
3-1-3. JDBC API 프로그래밍 단계
위와같은 JDBC 방식은 단점이 존재합니다. 연결해체시에 Close()함수를 매번 Statement, ResultSet, Connection에 해줘야 메모리 누수가 생기지 않고 안전하게 종료할 수 있어 불편함이 존재합니다. 이런 불편함을 극복한 것이 Spring JDBC입니다.
3-2. Spring JDBC란?
Spring JDBC는 JDBC의 모든 저수준 처리를 스프링 프레임워크에 위임하므로써, Connection 연결 객체 생성 및 종료, Statement 준비/실행 및 종료, ResultSet 처리 및 종료, 예외 처리, 트랙잭션 등의 반복되는 처리를 개발자가 직접하지 않고 Database에 대한 작업을 수행할 수있다.
Spring JDBC는 SQL Query 수행하기 위해 필요한 저수준 작업을 내부적으로 처리해주고 보다 추상적인 기능을 제공하는데 대표적으로 JdbcTemplate, SimpleJdbcInsert, NamedParameterJdbcTemplate 객체 등이 존재한다. 이 중에서 JdbcTemplate방식을 가장 많이 사용하고 전형적인 방법이라고 한다. 쿼리를 직접 작성하는 방법을 제공하므로 많은 작업과 시간을 절약 할 수 있다.
우리는 이러한 Template객체들을 통해서 JDBC에서 우리가 하나하나 직접 작성해야 했던 JDBC 코드들을 자동으로 처리해주고 개발자는 DataSource(DB관련 커넥션 정보) 제공, SQL문 작성, 결과처리만 하면 된다.
JdbcTemplate을 사용한다면 DataSource를 Spring IOC 컨테이너에 bean으로 등록하고 이를 나중에 JdbcTemplate에 주입받으면 자동으로 연결이 되고 JdbcTemplate을 통해 SQL문만 작성해주면 된다.
3-3. JPA란
JPA란 자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세를 의미합니다.
JPA는 특정 기능을 하는 라이브러리가 아니고, ORM을 사용하기 위한 인터페이스들을 모아둔 것입니다.
JPA는 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 방법중 한 가지 입니다.
JPA는 단순히 명세이기 때문에 구현이 없습니다.
JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus 같은 ORM 프레임워크를 사용해야 합니다.
우리가 Hibernate를 많이 사용하는 이유는 가장 범용적으로 다양한 기능을 제공하기 때문입니다.
4.Hibernate란
Hibernate는 JPA의 구현체 중 하나입니다.
Hibernate는 SQL을 사용하지 않고 직관적인 코드(메소드)를 사용해 데이터를 조작할 수 있습니다.
Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는 것은 아닙니다.
Hibernate가 지원하는 메소드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 작성하지 않을 뿐 입니다.
4-1. Hibernate의 장단점(JPA 장단점)
장점
- 생산성
- Hibernate는 SQL을 직접 사용하지 않고, 메소드 호출만으로 query가 수행된다.
- 즉, 반복적인 SQL 작업과 CRUD 작업을 직접 하지 않으므로 생산성이 매우 높아진다.
- 객체지향적 개발
- 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중할 수 있다.
- 로직을 쿼리에 집중하기 보다 객체 자체에 집중할 수 있다.
단점
- 어렵다
- 많은 내용이 감싸져 있기 때문에 JPA를 잘 사용하기 위해서는 알아야 할 것이 많다.
- 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다.
- 성능
- 메소드 호출로 쿼리를 실행하는 것은 내부적으로 많은 동작이 있다는 것을 의미하므로, 직접 SQL을 호출하는것보다 성능이 떨어질 수 있다.
- 실제로 초기의 ORM은 쿼리가 제대로 수행되지 않았고, 성능도 좋지 못했다고 한다.
- 그러나 지금은 많이 발전하고 있고, 좋은 성능을 보여주고 있다.
- 세밀함이 떨어진다.
- 메소드 호출로 SQL을 실행하기 때문에 세밀함이 떨어진다. 또한 객체간의 매핑 (Entity Mapping)이 잘못되거나 JPA를 잘못 사용하여 의도하지 않은 동작을 할 수도 있다.
- 복잡한 통계 분석 쿼리를 메소드 호출로 처리하는 것은 힘들다.
- 이것을 보완하기 위해 JPA에서는 SQL과 유사한 기술인 JPQL(SQL을 추상화한 객체지향쿼리 언어, 엔티티 객체를 대상으로 쿼리를 작성)을 지원한다.
- SQL 자체 쿼리를 작성할 수 있도록 지원도 하고 있다.
5. Spring Data JPA란
Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로 JPA를 쉽고 편하게 사용할 수 있도록 도와줍니다.
기존에 JPA를 사용하려면 EntityManager(엔티티매니저는 영속 컨텍스트에 접근하여 엔티티에 대한 DB 작업을 제공하는 인터페이스)를 주입받아 사용해야 하지만, Spring Data JPA는 JPA를 한단계 더 추상화 시킨 Repository 인터페이스를 제공합니다. Spring Data JPA가 JPA를 추상화 했다는 말은, Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다는 것입니다. 사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해줍니다. 즉, Spring Data JPA를 사용한다면 Repository만 다루면 Spring이 알아서 JPA를 사용하여 적합한 쿼리를 만듭니다.
참고:
https://azderica.github.io/00-java-jpa/
https://gmlwjd9405.github.io/2019/02/01/orm.html
https://jaehoney.tistory.com/29
https://velog.io/@jaydev/JAVA-JDBC-%EB%BF%8C%EC%8B%9C%EA%B8%B0
https://aomee0880.tistory.com/132
https://velog.io/@koseungbin/Spring-JDBC
https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/
'자바' 카테고리의 다른 글
JVM이란? JVM 구조 및 작동원리 (0) | 2022.05.24 |
---|---|
추상클래스, 인터페이스, 추상메서드 정리 (0) | 2022.04.25 |
JPA 연관관계 (0) | 2022.02.20 |
JPA란 무엇인가? (0) | 2022.02.06 |
Spring이란? Spring Boot란? (0) | 2022.01.28 |