티스토리 뷰
DTO(Data Transfer Object) - 데이터 전송 객체
- 기능은 없고, 데이터를 전달하는 용도로 사용하는 객체
- 용도를 명확하게 하기 위해 접미어로 사용하자
JdbcTemplate
- spring-jdbc 라이브러리에 포함, 스프링을 사용한다면 별도의 설정 없이 사용할 수 있다.
- 템플릿 콜백 패턴을 사용해서, 대부분의 반복 작업을 대신 처리해준다.
- SQL을 작성하여 파라미터를 설정하면 사용할 수 있다. ( ? 대신 : name 사용 가능 )
- 동적 쿼리 문제를 해결하지 못한다.
파라미터 전달 방법
1. Map 사용
2. MapSqlParameterSource(SqlParameterSource의 구현체)
메서드 체인을 통해 편리하기 Sql 타입을 지정할 수 있다.
3. BeanPropertySqlParameterSource(SqlParameterSource의 구현체)
자바빈 프로퍼티 규약으로 자동으로 파라미터 객체를 생성한다.
위의 경우가 대부분에서 사용하고, 파라미터 객체를 생성할 수 없는 경우에는 2번의 방법을 사용한다.
JdbcTemplate의 가장 큰 문제는 동적 쿼리를 작성하기 힘든 점이다.
위 메서드는 이름과 가격으로 모두 조회하는 기능이다.
조건에 따라 ( 검색 조건이 이름 or 가격 or 이름 + 가격 ) 동적으로 작동해야 할 sql이기 때문에 위와 같이 작성했다.
이 조건이 2개일 때는 위와 같이 작성할 수 있지만 조건이 점차 늘어나게 된다면 동적 쿼리 작성이 어려워 진다.
이 문제는 추후 MyBatis를 통해 해결할 수 있다. (JdbcTemplate + 동적쿼리 문제 해결 + 자바 코드 내의 sql 문제 해결)
+) 테스트
테스트의 중요 원칙 - 테스트는 다른 테스트와 격리해야 하고, 반복해서 실행할 수 있어야 한다.
-> 하나의 테스트가 다른 테스트의 결과에 영향을 미치지 않아야 한다.
테스트에 트랜잭션을 도입한다면 하나의 데이터베이스를 사용하더라도
롤백을 통해 각각의 테스트를 독립적으로 활용할 수 있다.
테스트에서의 @Transactional
이전에 나온 @Transactional은 메서드나 클래스에 사용하여 로직이 성공적으로 수행되면 커밋하도록 동작했다.
그런데, 테스트에 해당 애노테이션이 존재하면 스프링은 테스트가 끝나면 트랜잭션을 자동으로 롤백하도록 작동한다.
혹, 테스트의 결과(DB에서)를 확인하고 싶은 경우에는
@Commit 이나 @Rollback( value = false) 애노테이션을 사용하여 확인할 수 있다.
결론) 테스트에 @Transactional은 짱이다
본 포스팅은 인프런 강의 김영한님의
[ 스프링 DB 2편 - 데이터 접근 활용 기술 ] 을 수강하며 작성한 내용입니다.