오늘은 데이터베이스와 상호작용 하는 프레임워크 JPA, MyBatis의 공통점과 차이점을 학습함으로써
상황에 따라 취사선택할 수 있는 능력을 갖는 것을 목표로 포스팅해보겠습니다.
먼저 JPA를 학습하기 위한 준비 단계, ORM (Object Relation Mapping)에 대해 알아볼게요
ORM이란?
객체 관계형 매핑 ? 객체와 DB의 테이블을 Mapping 시켜서 관계짓는 것으로, RDB의 데이터를 다루는 하나의 기술
다시 말해, 객체를 통해 RDB 데이터를 다룰 수 있게 도와주는 기술로, 데이터베이스 작업을 객체지향적인 방식으로 활용할 수 있게 도와줍니다. 객체지향적 방식을 활용한다는 것은 코드의 유지보수, 확장성 면에서 유리하다는 의미로 Java에서 사용하는 대표적인 ORM으로 JPA(Java Persistent API)와 구현체 Hiberante가 있습니다.
spring-data-jpa 프로젝트를 활용하여 Java 클래스에 매핑정보를 입력한 뒤 이를 활용하여 DB와 연결할 수 있습니다.
JPA로 작성된 코드의 예시
@Entity
@Table(name = "board")
@Getter
@Builder
@NoArgsConstructor(force = true)
@AllArgsConstructor
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
} //DTO 역할
public interface BoardRepository extends JpaRepository <Board, Long> { //Dao 역할
List<Board> findByTitleContaining(String keyword);
}
인터페이스를 생성한 뒤, JpaRepository를 상속받아 기본 CRUD 메서드를 자동으로 제공받습니다.
또한 필요한 경우 커스텀 메서드를 추가할 수 있습니다.
@Service
@RequiredArgsConstructor
@Transactional(readonly = true)
public class BoardService {
private final BoardRepository boardRepository;
@Transactional
public Board findBoardAndUpdateContent(Long id) {
Board board = BoardRepository.findById(id);
board.setContent("수정할 글 내용");
}
}
서비스 로직에선 id값으로 해당 board 정보를 가져온 뒤, 별 다른 쿼리문 없이 수정 기능을 사용할 수 있습니다.
(MyBatis와 달리 쿼리를 직접 작성하지 않아도 됩니다.)
MyBatis란 ?
MyBatis는 오픈 소스 라이브러리로 JPA가 나오기 이전, Object Mapping 기술을 활용하여 데이터베이스와 상호작용 할 수 있습니다. MyBatis의 경우, Java 코드에 SQL 쿼리문을 직접 작성하여 DB와 Mapping 해야 합니다.
MyBatis로 작성된 코드의 예시(Mapper.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="package.com.BoardDao">
<insert id="writeBoard" parameterType="Board">
INSERT INTO board(title,content) //board table (MySQL column 입력)
VALUES (#{title}, #{content}); //Board클래스의 Dto 필드명 입력
</insert>
</mapper>
연결할 domain의 Dao 클래스와 함께 CRUD 기능 (insert, select, update, delete)에 따라 태그를 달리하여 구현할 수 있습니다.
@Mapper
@Repository
public interface BoardDao {
void writeBoard(Board board);
}
편의성 측면에서 볼 때, JPA가 MyBatis보다 매우 유리한 것으로 보이시죠? 또한 디버깅 측면에서도 MyBatis의 쿼리문이 상대적으로 어려움이 있어 보입니다. 그럼에도 불구하고MyBatis를 활용하는 경우는
1. 여러 테이블을 조인하여, 복잡한 쿼리를 작성하거나, DB기능을 활용할 때
2. 직접 작성한 최적화된 쿼리의 필요성이 우선시 될 때
3. 스키마의 변동 가능성이 거의 없을 때
정확하고 최적화된 쿼리의 용이
반면 JPA를 활용한다면
1. 객체지향적인 데이터베이스 접근으로 Java와의 방향성이 매우 유사하여 객체지향 중심의 개발을 더욱 용이하게 할 수 있습니다.
2. 테이블 생성과 DB 생성, 그리고 가장 많이 사용하는 기본 CRUD의 유지보수가 쉽습니다. ( DB 종류에 관계없이 JPA에서 자동으로 SQL Dialect를 만들어 줌)
3. QueryDSL을 활용하여 복잡한 쿼리도 자바 언어로 작성할 수 있습니다.
4. @DataJpaTest를 활용한 테스트 작성의 용이성 ( 트랜잭션 롤백, 인메모리 데이터베이스 사용)을 통한 유지보수 기능 향상 시킬 수 있습니다.
+인메모리 데이터베이스 (데이터베이스가 메모리에 상주하며 작동하는 데이터베이스 관리 시스템)
- 데이터가 메모리에 저장되어 접근 속도가 매우 빠름
- 시스템 재시작 or 어플리케이션 종료 시 데이터 유실
- 각 테스트의 독립성으로 데이터 간섭이 발생하지 않음
유지보수성 측면과 복잡한 쿼리의 최적화 측면을 고려하여 JPA와 MyBatis를 취사선택하여 사용하기
'Server' 카테고리의 다른 글
CI와 CD에 대하여 (Continuous Integration / Deployment ) (0) | 2024.06.14 |
---|---|
RESTful API에 대하여 (0) | 2024.06.10 |
Stateful과 Stateless (0) | 2024.05.19 |
java.lang.IndexOutOfBoundsException (MyBatis) (0) | 2024.05.18 |
intellij Project 인식 오류 해결하기 (0) | 2024.05.15 |