Persistence Framework
- 크게 SQL Mapper(Jdbc, Mybatis)와 ORM(Jpa)으로 나눌 수 있음
- ORM은 데이터베이스 객체를 자바 객체로 매핑함으로써 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해주지만 SQL Mapper는 SQL을 명시해줘야 한다.
- ORM은 관계형 데이터베이스의 ‘관계’를 Object에 반영하자는 것이 목적이라면, SQL Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 점에서 지향점의 차이가 있다.
JDBC
- JDBC 는 DB에 접근할 수 있도록 Java에서 제공하는 API임
- 모든 Java의 Data Access 기술의 근간
- 즉, 모든 Persistence Framework는 내부적으로 JDBC API를 이용함
Jdbc Template
- Jdbc Template을 이용해서 데이터 계층에 접근이 가능함
- 기존 JDBC를 이용했을 때의 반복적인 작업을 Jdbc Template이 대신 수행해줌
- Connection 맺고
- Statement활용해서 쿼리 수행 부분
- Statement, Connection 반납
@Repository public class CustomerRepository { private static final Logger log = LoggerFactory.getLogger(CustomerRepository.class); private final JdbcTemplate jdbcTemplate; public CustomerRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public long save(Customer customer) { int insertCount = jdbcTemplate.update( "INSERT INTO customers (id, first_name, last_name) VALUES(?, ?, ?)", customer.getId(), customer.getFirstName(), customer.getLastName() ); log.info("고객정보 {}건이 입력되었습니다.", insertCount); return customer.getId(); } public long update(Customer customer) { int updateCount = jdbcTemplate.update( "UPDATE customers SET first_name = ? , last_name = ? WHERE id = ?", customer.getFirstName(), customer.getLastName(), customer.getId() ); log.info("고객정보 {}건이 수정되었습니다.", updateCount); return customer.getId(); } public Customer findById(long id) { Customer customer = jdbcTemplate.queryForObject( "SELECT * FROM customers WHERE id = ?", (resultSet, rowNum) -> new Customer(resultSet.getLong("id"), resultSet.getString("first_name"), resultSet.getString("last_name")), id ); log.info("아이다:{} 고객의 정보가 조회되었습니다." ,customer.getId()); return customer; } public List<Customer> findAll() { List<Customer> customers = jdbcTemplate.query( "SELECT * FROM customers", (resultSet, rowNum) -> new Customer(resultSet.getLong("id"), resultSet.getString("first_name"), resultSet.getString("last_name")) ); log.info("{}건의 고객정보가 조회되었습니다.", customers.size()); return customers; } }
Mybatis (QueryMapper)
- Jdbc에서 jdbcTemplate.update를 사용 시 쿼리를 파라미터로 넣어주어야 하여 자바 코드에 쿼리가 같이 관리되었음
- Mybatis에서는 자바 코드와 쿼리를 분리를 해줌
- 쿼리 수정으로 자바 코드 수정이나 컴파일 하는 작업을 하지 않아도 됨
@Mapper public interface CustomerMapper { @Insert("INSERT INTO customers (id, first_name, last_name) VALUES(#{id}, #{firstName}, #{lastName})") void save(Customer customer); @Update("UPDATE customers SET first_name=#{firstName}, last_name=#{lastName} WHERE id=#{id}") void update(Customer customer); @Select("SELECT * FROM customers") List<Customer> findAll(); @Select("SELECT * FROM customers WHERE id = #{id}") Customer findById(@Param("id") long id); }
JPA (Java Persistence API)
Object Relational Mapping
- 자바 ORM 기술에 대한 API 표준 명세로, Java에서 제공하는 API임
- 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API임
- 즉, JPA는 ORM을 사용하기 위한 표준 인터페이스를 모아둔 것
- 사용자가 원하는 JPA 구현체를 선택해서 사용할 수 있음
- JPA의 대표적 구현체로 Hibernate, EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있음
사용 시 이점
- JPA를 사용하게 되면 SQL에 의존적인 개발에서 탈피하여 객체중심으로 생산적인 개발이 가능하다
- 객체와 관계형테이블의 패러다임 불일치를 해결할 수 있음