스프링은 로컬DB 또는 원격 DB에 접근하여 Restful API 호출 서비스, DB 관리 및 제어를 할 수 있게 만든다. DB에 접근하는 방법은 다양한 방식이 있는데 그것들에 대한 개념을 정리하고자 한다.
ORM 이란?
- ORM(Object-Relational-Mapping)이란 객체와 관계형대이터베이스 매핑, 객체와 DB의 테이블이 매핑을 이루는 것을 말한다.
- 객체가 테이블이 되도록 매칭 시켜주는 프레임워크이다.
- 프로그램의 복잡도를 줄이고 자바 객체와 쿼리를 분리할 수 있으며 트랜잭션 처리나 기타 데이터베이스 관련 작업들을 좀 더 편리하게 처리할 수 있게 된다.
SQL Query가 아닌
직관적인 코드로서 데이터를 조작할 수 있다.(ORM에서 제공하는 메서드로 쿼리를 제어할 수 있다.)
JPA 란?
- JPA(Java Persistence API)이란
자바 ORM 기술에 대한 API 표준 명세
를 말한다. - ORM에 대한 자바 API 규격이며, 자바 어플레케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
- 인터페이스 자체이기 때문에 라이브러리와 같이 특정 기능이 존재하지 않는다.
- 따라서,
Hibernate
와 같은 JPA 구현체를 사용해야한다.
JPA에 대한 장점
-
생산성이 뛰어나고 유지보수가 용이하다.
-
객체지향적인 코드를 사용하므로 비즈니스로직에 더 집중할 수 있다.
-
객체지향적으로 데이터를 관리할 수 있으므로 유지보수에 용이하다.
-
SQL을 직접적으로 사용하는 것이 아닌, 메서드에 의해 동작하므로 간결하게 사용할 수 있다.
-
DBMS에 대한 종속성이 줄어든다.
-
DBMS가 변경되더라도 소스, 쿼리, 구현방법, 자료형 등을 변경할 필요가 없다.
-
결국, 개발자는 DBMS에 대한 고려를 덜 해도 되므로 객체에 집중하여 개발할 수 있다.
JPA에 대한 단점
- JPA를 실무에서 잘사용하기 위한 비용은 비교적 높은편이다.
- 복잡한 쿼리를 사용할 때 불리하다.(다양한 어노테이션을 알고 그것들을 조합해야해서 신경쓸게 많다.)
- 기존 데이터베이스 중심으로 되어있는 환경(SQL Mapper 사용 환경)에서 적용하기 어려워진다.
SQL Mapper
- SQL Mapper란, SQL을 직접 작성하여 DB에 접근하는 것을 말한다.
Mybatis
라는 미들웨어를 사용해서 접근한다.- JAVA 코드가 아닌 작성한 SQL문을 Mapping해서 접근하기 때문에 비교적 쉽다.
- 복잡한 쿼리도 비교적 쉽게 구현해낼 수 있다.
SQL Mapper vs JPA
SQL Mapper 장점
SQL Mapper
는 XML파일에 쿼리를 직접 입력하고 매핑시키는 방식으로 코드를 구성한다. 그렇기 때문에 편리하다. 하지만, 규모가 커지고 DAO, DTO 등 소스가 하나 둘씩 커지기 시작하면 그만큼 XML 파일이 불규칙하게 늘어나고 소스를 유지하기가 어려워진다.
작은 규모의 프로젝트에서 SQL Mapper를 사용하는 것은 좋다. 하지만, 규모가 커지고 로직이 복잡해지고 소스가 방대해지면 객체로 접근 및 관리하는 것이 더 나은 방법일 수 있다.
보통 Mybatis
라는 미들웨어를 사용하여 SQL Mapper를 보다 쉽게 적용한다.
JPA 장점
위에서 설명하였지만 부연설명하자면...
JPA는 JAVA ORM에 대한 규격이다. 즉 특정기능을 하는 것이 아닌 규격만 존재하는 것이다. 기능을 구현하기 위해서는 SQL Mapper에서 Mybatis와 같이 JPA에서는 Hibernate
를 사용한다.(이외에도 여러가지 미들웨어가 존재한다.)
마찬가지로 hibernate에서 제공하는 여러 기능들이 있는데 일단 메서드를 제공한다
. SQL Mapper에서는 XML 파일에 직접 쿼리를 작성하고 Java 클래스에서 객체와 매핑하는 작업을 거쳤다.
JPA에서는 Repository
와 Entity
를 구성하고 그에 대한 인터페이스
를 작성한다. 그리고 인터페이스에 대한 서비스
를 Java 클래스로 구현하여 DB에 대한 데이터를 접근한다.
(자세한 설명은 추후 다루도록 한다.)
결국엔, XML에서 SQL을 직접 다루지 않고 Java 코드로만 DB에 매핑하게 된다. 이것으로 객체지향적으로 소스를 디자인 할 수 있고, 객체지향적으로 디자인한다는 것은 곧 유지보수성이 좋아지게 된다.
하지만, 관련 어노테이션이 많고, 조합하기 어렵다는 단점이 있다... 너무 어렵다...
JDBC (java Database Connectivity)
- JDBC는 Database(영속성계층)에 접근하기 위해 사용되는 API 이다.
- JPA 또는 다른 ORM은 Object를 SQL로 매핑하는 것을 제공해주고, 그 이후 SQL을 연결하는 것은 JDBC영역 기능을 제공한다.