티스토리 뷰

Spring

[ 스프링 DB ] JdbcTemplate

GiHoo 2023. 8. 27. 22:19

DTO(Data Transfer Object) - 데이터 전송 객체

  • 기능은 없고, 데이터를 전달하는 용도로 사용하는 객체
  • 용도를 명확하게 하기 위해 접미어로 사용하자

 

JdbcTemplate

  • spring-jdbc 라이브러리에 포함, 스프링을 사용한다면 별도의 설정 없이 사용할 수 있다.
  • 템플릿 콜백 패턴을 사용해서, 대부분의 반복 작업을 대신 처리해준다.
  • SQL을 작성하여 파라미터를 설정하면 사용할 수 있다. ( ? 대신  : name 사용 가능 )
  • 동적 쿼리 문제를 해결하지 못한다.

파라미터 전달 방법

1. Map 사용

Map을 사용하여 바인딩

2. MapSqlParameterSource(SqlParameterSource의 구현체)

메서드 체인을 통해 편리하기 Sql 타입을 지정할 수 있다.

 

3. BeanPropertySqlParameterSource(SqlParameterSource의 구현체)

자바빈 프로퍼티 규약으로 자동으로 파라미터 객체를 생성한다.

위의 경우가 대부분에서 사용하고, 파라미터 객체를 생성할 수 없는 경우에는 2번의 방법을 사용한다.

 

JdbcTemplate의 가장 큰 문제는 동적 쿼리를 작성하기 힘든 점이다.

위 메서드는 이름과 가격으로 모두 조회하는 기능이다.

조건에 따라 ( 검색 조건이 이름 or 가격 or 이름 + 가격 ) 동적으로 작동해야 할 sql이기 때문에 위와 같이 작성했다.

이 조건이 2개일 때는 위와 같이 작성할 수 있지만 조건이 점차 늘어나게 된다면 동적 쿼리 작성이 어려워 진다.

 

이 문제는 추후 MyBatis를 통해 해결할 수 있다. (JdbcTemplate + 동적쿼리 문제 해결 + 자바 코드 내의 sql 문제 해결)

 

 

+) 테스트

테스트의 중요 원칙 - 테스트는 다른 테스트와 격리해야 하고, 반복해서 실행할 수 있어야 한다.

-> 하나의 테스트가 다른 테스트의 결과에 영향을 미치지 않아야 한다.

 

테스트에 트랜잭션을 도입한다면 하나의 데이터베이스를 사용하더라도

롤백을 통해 각각의 테스트를 독립적으로 활용할 수 있다.

 

테스트에서의 @Transactional 

이전에 나온 @Transactional은 메서드나 클래스에 사용하여 로직이 성공적으로 수행되면 커밋하도록 동작했다.

그런데, 테스트에 해당 애노테이션이 존재하면 스프링은 테스트가 끝나면 트랜잭션을 자동으로 롤백하도록 작동한다.

좌 : 애노테이션 대상이 동작되는 방식, 우 : 주석으로 표시된 부분이 @Transactional의 구성

혹, 테스트의 결과(DB에서)를 확인하고 싶은 경우에는

@Commit 이나 @Rollback( value = false) 애노테이션을 사용하여 확인할 수 있다.

 

결론) 테스트에 @Transactional은 짱이다

 

 

 

 

 

 

 

 

본 포스팅은 인프런 강의 김영한님의

[ 스프링 DB 2편 - 데이터 접근 활용 기술 ] 을 수강하며 작성한 내용입니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31