애플리케이션 서버와 데이터베이스(DB)는 어떻게 소통해야 할까?
JDBC란 DB에 접근할 수 있도록 Java에서 제공하는 API이다.
DB의 JDBC Driver를 제공하면, MySQL, PostgreSQL 등 다양한 DB와 연결가능하며, Java 표준이기 때문에 JVM 위에서 운영되는 애플리케이션에서 자유롭게 사용할 수 있다.
JDBC의 등장으로 손쉽게 DB교체가 가능해졌지만 여러가지 작업 로직들을 직접 작성해야하는 불편함이 있어, 이를 해결하기 위해 (커넥션 연결, statement 준비 및 실행, 커넥션 종료 등의 반복적이고 중복되는 작업들을 대신 처리해주는) JdbcTemplate이 등장하게 되었다.
DB연결이 필요한 곳에서 JdbcTemplate을 주입받아와 사용하면 된다.
JdbcTemplate이 JDBC를 직접 사용할 때 발생하는 불편함을 해결해 주었지만 SQL에 의존적이라 수정 시 취약하고 아직도 복잡하기 때문에, Java 개발자들을 위해 DB와 객체를 매핑하여 소통할 수 있는 ORM이라는 기술이 등장하게 되었다.
ORM이란 객체와 DB의 관계를 매핑해주는 도구이다.
JPA란 자바 ORM기술에 대한 API표준 명세이다.
객체를 통해 간접적으로 DB 데이터를 다룰 수 있기 때문에 매우 쉽게 DB 작업을 처리할 수 있는 장점을 가지고 있다.
JPA를 사용하여 DB에 데이터를 저장, 수정, 삭제 하려면 트랜잭션 적용이 반드시 필요하다.
Spring 프레임워크에서는 DB의 트랜잭션 개념을 애플리케이션에 적용할 수 있도록 트랜잭션 관리자를 제공한다.
@Transactional 애너테이션을 클래스나 메서드에 추가하면 쉽게 트랜잭션 개념을 적용할 수 있다.
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
...
@Transactional
@Override
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Entity must not be null");
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
...
}
Spring Data JPA란 JPA를 쉽게 사용할 수 있게 만들어놓은 하나의 모듈이다.
Spring Data JPA에서는 JpaRepository 인터페이스를 구현하는 클래스를 자동으로 생성해주기 때문에, 인터페이스의 구현 클래스를 직접 작성하지 않아도 "JpaRepository 인터페이스"를 통해 JPA의 기능을 사용할 수 있다.
참고 자료