TIL 2023-12-13 JDBCTemplate, MyBatis

장규빈·2023년 12월 13일

TIL

목록 보기
44/59
post-thumbnail

SQL Mapper

JDBC 로 직접 SQL을 작성했을때의 여러가지 문제가 발생하여 생긴 SQL Mapper로는 크게 JDBCTemplate과 MyBatis가 있다.

JDBC Template

  • 쿼리 수행 결과와 객채 필드 매핑
  • RowMapper 로 응답필드 매핑코드 재사용
  • Connection, Statement, ResultSet 반복적 처리 대신 해줌
  • But, 결과값을 객체 인스턴스에 매핑하는데 여전히 많은 코드가 필요함
@JdbcTest // Jdbc Slice Test
@AutoConfigureTestDatabase(replace = Replace.NONE) // 테스트용 DB 쓰지 않도록
@Rollback(value = false) // Transactional 에 있는 테스트 변경은 기본적으론 롤백 하도록 되어있다.
public class JDBCTemplateTest {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Test
  @DisplayName("SQL Mapper - JDBC Template 실습")
  void sqlMapper_JDBCTemplateTest() {
    // given
    var accountTemplateDAO = new AccountTemplateDAO(jdbcTemplate);

    // when
    var id = accountTemplateDAO.insertAccount(new AccountVO("new user2", "new password2"));

    // then
    var account = accountTemplateDAO.selectAccount(id);
    assert account.getUsername().equals("new user2");
  }
}

MyBatis

  • 반복적인 JDBC 프로그래밍을 단순화
  • SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL 을 분리!
  • But, 결국 SQL을 직접 작성하는것은 피곤하다…(DB 기능에 종속적)
  • But, 테이블마다 비슷한 CRUD 반복, DB타입 및 테이블에 종속적이다.

@SpringBootTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import(DBConfiguration.class)
public class MyBatisTest {

  // Mapper 클래스를 받으려면 mapper.xml 빌드 해야하고, 그러려면 main 으로 옮겨서 해야함...
  @Autowired
  AccountMapper accountMapper;

  @Autowired
  AccountMapperV2 accountMapperV2;

  @Test
  @DisplayName("SQL Mapper - MyBatis 실습")
  void sqlMapper_MyBatisTest() {
    // given

    // when
    accountMapper.insertAccount(new AccountMyBatisVO("new user3", "new password3"));
    var account = accountMapper.selectAccount(1);

    // then
    assert !account.getUsername().isEmpty();
  }

  @Test
  @DisplayName("SQL Mapper - MyBatis V2 실습")
  void sqlMapper_MyBatisV2Test() {
    // given

    // when
    accountMapperV2.insertAccount(new AccountMyBatisVO("new user4", "new password4"));
    var account = accountMapperV2.selectAccount(1);

    // then
    assert !account.getUsername().isEmpty();
  }
}

문제점

QueryMapper 의 DB의존성 및 중복 쿼리 문제로 ORM 이 탄생했다.

profile
나다운사람

0개의 댓글