요르딩딩
[Spring 분석] JDBC, 영속성, SQLmapper(mybatis),ORM(jpa, hibernate) 본문
[Spring 분석] JDBC, 영속성, SQLmapper(mybatis),ORM(jpa, hibernate)
요르딩딩 2021. 6. 29. 12:49이번시간에는 JDBC와 JPA의 차이에 대해서 공부해 보겠습니다.
1. JDBC
Java DataBase Connectivity의 약자이고, Java에서 DB 연결을 위해 제공하는 API 입니다.DB와의 연결설정을 위해 일괄된 형태를 제공합니다.
DB 제작업체에서 제공하는 드라이버만 있다면 DB의 종류와는 상관없이 JDBC를 이용하여 프로젝트와 DB를 연결 가능한것이 장점입니다. DB연결뿐 아니라, SQL수행 및 트랜잭션 관리까지 DB운용에 필요한 다양한 기능을 제공합니다.
그러나 JDBC를 사용해본다면 알 수 있는 두가지 단점이 있습니다.
(1) JDBC를 사용하기 위해서는 꽤 복잡한 프로그래밍을 필요로 한다는 것과
(2) 작성되는 코드가 중복된다는 것입니다.
(1)번 단점인 JDBC의 복잡성은 JDBC를 사용하기 위해 작성해야 하는 일종의 규칙으로 인한 것이고,
(2)번 단점인 JDBC의 코드 중복성은 JDBC가 SQL문을 처리하는 과정에서 파생되는 특징입니다.
즉, 코드의 재사용적인 측면에 있어서 비효율 적입니다. 그 이유는 무엇일까?
JDBC는 쿼리문(SQL)을 소스코드에 직접 작성하는 방식을 사용합니다.
한가지 쿼리문을 여러 클래스에 적용하고 싶다면, 각 클래스의 소스코드에 해당 쿼리문을 모두 작성해야 합니다.
이와 같은 JDBC의 단점을 보완하기 위해 개발된 프레임워크를 Persistence Framework라고 하며,
그 종류에는 MyBatis와 JPA, Hibernate가 있습니다.
[요점]
1. Java에서 DB 연결을 위해 제공하는 API
2. 드라이버만 있다면 DB의 종류와 상관없이 JDBC를 이용하여 프로젝트와 연결 가능
3. 일종의 규칙작성을 위한 복잡한 프로그래밍 문제
4. 소스에 쿼리를 적어야하는 코드의 중복성 문제
2. Persistence Framework
Persistence Framework의 Persistence는 영속성을 의미합니다. 무엇을 말하고 싶은 것일까?
영속성이란, 프로그램이 종료되더라도 사리지지 않는 데이터의 특징을 뜻합니다.
영속성이 없는 데이터는 메모리에서 상주하기 때문에, 프로그램이 종료되면 모두 사라집니다.
반대로 생각해보면 영속성은 파일시스템 또는 DB를 활용하여 데이터를 영구적으로 저장함으로써 부여되는 특성입니다.
프로그램의 아키텍처 관점에서 영속성이 부여되는 계층을 Persistence Layer라고 하는데,
웹 어플리케이션과 DB사이의 프로그램 아키텍처는 다음 사진과 같다.
영속성을 부여해주는 계층은 Persistence Layer계층입니다.
JDBC를 이용하여 직접 Persistence Layer를 구축할 수 있으나, 프로그래밍의 복잡성으로 대게는 Persistence Framework의 간단한 설정만으로 DB와의 연결을 빠르게 구축할 수 있으며, 안정성까지 보장할 수 있습니다.
Persistence Framework에는 SQL Mapper와 ORM이라는 두가지 방법을 사용하여 데이터에 영속성을 부여합니다.
어떤 방법을 사용하여 데이터에 영속성을 부여하느냐에 따라 Persistence Framework의 종류가 달라집니다.
[요점]
1. 영속성이란 프로그램이 종료되더라도 사라지지않는 특성
2. 영속성을 부여하는 계층은 Persistence Layer
3. Persistence Layer계층은 JDBC를 이용하여 직접 구현할 수 있지만 Persistence framework를 이용한 개발이 많이 이루어짐
4. Persistence Framework에는 SQL Mapper와 ORM 두가지 방법을 사용하여 데이터에 영속성을 부여
2-1. SQL Mapper
JDBC처럼 소스코드에 쿼리문을 포함시키는 방식이 아닌, Mapper라는 XML 형식의 파일에 쿼리문을 작성하여 빌드하는 방식입니다.
이로인해 JDBC의 복잡성과 중복성 문제가 해결되었습니다.
기존의 단점은 보완되면서, 여전히 쿼리문을 직접 작성한다는 측면에서 복잡한 과정의 데이터검색을 충분히 구현할 수 있다는 것이 장점입니다.
그러나 XML 파일의 특성상, 쿼리문에 오류가 있더라도 빌드과정에서 오류를 발생시키지 않는다는 문제가 발생합니다.
빌드과정에서 오류가 발생하지 않기에, 유지보수 또는 QA 테스트를 위해서 모델 객체, 컨트롤러, 서비스 등 어플리케이션을 전체적으로 점검 및 확인해야 한다는 어려움이 있습니다.
MyBatis가 대표적인 SQL Mapper 방식의 Persistence Framework다.
[요점]
1. Mapper라는 XML형식의 파일에 쿼리문을 작성하여 빌드하기 때문에, JDBC처럼 소스코드에 쿼리문을 쓰지 않아 복잡성,중복성을 줄임
2. 여전히 쿼리문을 직접 작성하기 때문에 복잡한 과정도 수행가능.
3. XML파일의 특성상 빌드과정에서 오류를 발생시키지 않음.
2-2. ORM (Object Relational Mapper, 객체 관계형 매핑)
ORM은 객체간 관계를 기반으로 ORM이 알아서 쿼리문을 작성하는 방식으로 동작합니다.
즉, 객체(자바 클래스)와 RDB의 데이터를 자동으로 Mapping 하기때문에 개발자가 쿼리문을 작성하지 않습니다.
예를 들어, select A* from tableA; 라는 SQL문을, ORM에서는 A.findAll() 이라는 메소드 호출 형식으로 표현하는 것입니다.
개발자의 입장에서는 쿼리문 작성 방식이OOP 방식으로 구현되어 비지니스 로직에 더욱 집중할 수 있습니다.
객체의 재사용성 즉, 쿼리문의 재사용성이 높고 OOP방식으로 인해 오류발견이 쉬움으로 유지보수가 편리합니다.
JPA(Java Persistence API)와 Hibernate가 대표적인 ORM 방식의 Persistence Framework다.
[요점]
1. 객체와 RDB의 데이터를 자동으로 Mappingg하므로 ORM이 알아서 쿼리문을 작성 (메소드 호출방식 : A.findAll())
2. 개발자입장에서는 쿼리문 작성방식이 OOP방식으로 구현되어 비지니스로직에 더욱 집중 가능
3. 쿼리문의 재사용성이 높고, 오류발견이 쉬어 유지보수에 편리
4. 대표적인 방식으로는 JPA, Hibernate
1) JPA(Java Persistence API)
JPA는 Hibernate 개발자들이 만든 Java 표준 ORM입니다.
Java 어플리케이션에서 RDB를 사용하는 방식을 정의한 Interface 입니다.
Interface이므로, 어떤 기능을 제공하는 것이 아닌 구현해야만 하는 메소드를 규정하는 역할을 합니다.
[요점]
1. Java 표준 ORM
2. Interface이므로, 어떤 기능을 제공하는 것이 아닌 구현해야만 하는 메소드를 규정하는 역할을 한다.
2). Hibernate
Hibernate는 JPA 인터페이스의 구현체로, 이 외에도 EclipseLink, DataNucleus, OpenJPA, TopLink Essentials등이 있습니다.
개발자가 직접 쿼리문을 작성하지 않아도 되는 이유는 Hibernate라는 구현체를 사용하기 때문입니다.
Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 직접 작성하지 않을 뿐입니다.
* 구현체란? 추상 메소드만 담고있는 인터페이스를 실제로 구현한 클래스
[요점]
1. JPA 인터페이스의 구현체
2. Hibernate 구현체를 사용하기 때문에 개발자가 직접 쿼리문을 작성하지 않음.
3) Spring-Data-JPA
Spring Data JPA는 Spring에서 제공하는 모듈이자 Framework로, 개발자가 JPA를 더욱 쉽게 사용할 수 있도록 합니다.
JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써, 사용자가 Repository 인터페이스에 메소드를 입력하면 Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해줍니다.
즉, Spring Boot 프레임워크를 이용한 프로젝트에서 Repository를 작성한다면 JPA를 사용하고 있다는 의미입니다.
[요점]
1. JPA를 한 단계 추상화 시킨 Repository라는 인터페이스를 제공 > 메소드를 입력하면 쿼리를 날리는 구현체를 만들어 > Bean 등록
https://devraphy.tistory.com/135
'[Web] > [Spring]' 카테고리의 다른 글
[Spring 분석] (No.1) MVC 패턴이란 (0) | 2021.09.01 |
---|---|
[Spring 분석] 터미널을 이용한 properties 암복호화 (0) | 2021.07.05 |
[Spring 분석] Spring 와 Spring Boot 차이 (0) | 2021.06.29 |
[Spring 분석] URI(URN, URL)란 (0) | 2021.06.28 |
[Spring 분석] SFTP 파일 업로드 ( jsch 라이브러리) (0) | 2021.05.31 |