테스트 - 스프링 부트와 임베디드 모드
2022. 8. 15. 21:16
데이터 접근 기술/JdbcTemplate
스프링 부트는 개발자에게 정말 많은 편리함을 제공하는데, 임베디드 데이터베이스에 대한 설정도 기본으로 제공한다. 스프링 부트는 데이터베이스에 대한 별다른 설정이 없으면 임베디드 데이터베이스를 사용한다. 앞서 직접 설정했던 메모리 DB용 데이터소스를 주석처리하자. package hello.itemservice; import hello.itemservice.config.*; import hello.itemservice.repository.ItemRepository; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot...
테스트 - 임베디드 모드 DB
2022. 8. 15. 20:44
데이터 접근 기술/JdbcTemplate
테스트 케이스를 실행하기 위해서 별도의 데이터베이스를 설치하고, 운영하는 것은 상당히 번잡한 작업이다. 단순히 테스트를 검증할 용도로만 사용하기 때문에 테스트가 끝나면 데이터베이스의 데이터를 모두 삭제해도 된다. 더 나아가서 테스트가 끝나면 데이터베이스 자체를 제거해도 된다. 임베디드 모드 H2 데이터베이스는 자바로 개발되어 있고, JVM안에서 메모리 모드로 동작하는 특별한 기능을 제공한다. 그래서 애플리케이션을 실행할 때 H2 데이터베이스도 해당 JVM 메모리에 포함해서 함께 실행할 수 있다. DB를 애플리케이션에 내장해서 함께 실행한다고 해서 임베디드 모드(Embedded mode)라 한다. 물론 애플리케이션이 종료되면 임베디드 모드로 동작하는 H2 데이터베이스도 함께 종료되고, 데이터도 모두 사라진..
테스트 - @Transactional
2022. 8. 15. 17:59
데이터 접근 기술/JdbcTemplate
스프링은 테스트 데이터 초기화를 위해 트랜잭션을 적용하고 롤백하는 방식을 @Transactional 애노테이션 하나로 깔끔하게 해결해준다. @Transactional @SpringBootTest class ItemRepositoryTest { @Autowired ItemRepository itemRepository; /* @Autowired PlatformTransactionManager transactionManager; TransactionStatus status; @BeforeEach void beforeEach() { //트랜잭션 시작 status = transactionManager.getTransaction(new DefaultTransactionDefinition()); } */ @After..
테스트 - 데이터 롤백
2022. 8. 15. 17:37
데이터 접근 기술/JdbcTemplate
트랜잭션과 롤백 전략 이때 도움이 되는 것이 바로 트랜잭션이다. 테스트가 끝나고 나서 트랜잭션을 강제로 롤백해버리면 데이터가 깔끔하게 제거된다. 테스트를 하면서 데이터를 이미 저장했는데, 중간에 테스트가 실패해서 롤백을 호출하지 못해도 괜찮다. 트랜잭션을 커밋하지 않았기 때문에 데이터베이스에 해당 데이터가 반영되지 않는다. 이렇게 트랜잭션을 활용하면 테스트가 끝나고 나서 데이터를 깔끔하게 원래 상태로 되돌릴 수 있다 예를 들어서 다음 순서와 같이 각각의 테스트 실행 직전에 트랜잭션을 시작하고, 각각의 테스트 실행 직후에 트랜잭션을 롤백해야 한다. 그래야 다음 테스트에 데이터로 인한 영향을 주지 않는다. 1. 트랜잭션 시작 2. 테스트 A 실행 3. 트랜잭션 롤백 4. 트랜잭션 시작 5. 테스트 B 실행 ..
테스트 - 데이터베이스 분리
2022. 8. 15. 03:39
데이터 접근 기술/JdbcTemplate
로컬에서 사용하는 애플리케이션 서버와 테스트에서 같은 데이터베이스를 사용하고 있으니 테스트에서 문제가 발생한다. 이런 문제를 해결하려면 테스트를 다른 환경과 철저하게 분리해야 한다. 가장 간단한 방법은 테스트 전용 데이터베이스를 별도로 운영하는 것이다. ● H2 데이터베이스를 용도에 따라 2가지로 구분하면 된다. ● jdbc:h2:tcp://localhost/~/test local에서 접근하는 서버 전용 데이터베이스 ● jdbc:h2:tcp://localhost/~/testcase test 케이스에서 사용하는 전용 데이터베이스 데이터베이스 파일 생성 방법 ● 데이터베이스 서버를 종료하고 다시 실행한다. ● 사용자명은 sa 입력 ● JDBC URL에 다음 입력, ● jdbc:h2:~/testcase (최초..
테스트 - 데이터베이스 연동
2022. 8. 14. 14:02
데이터 접근 기술/JdbcTemplate
데이터 접근 기술에 대해서 더 알아보기 전에 데이터베이스에 연동하는 테스트에 대해서 알아보자. 데이터 접근 기술은 실제 데이터베이스에 접근해서 데이터를 잘 저장하고 조회할 수 있는지 확인하는 것이 필요하다. 지금부터 테스트를 실행할 때 실제 데이터베이스를 연동해서 진행해보자. 앞서 개발한 ItemRepositoryTest 를 통해서 테스트를 진행할 것이다. 테스트를 실행하기 전에 먼저 지금까지 설정한 application.properties 를 확인해보자 main - application.properties src/main/resources/application.properties spring.profiles.active=local spring.datasource.url=jdbc:h2:tcp://loca..
JdbcTemplate 기능 정리
2022. 8. 14. 03:09
데이터 접근 기술/JdbcTemplate
주요 기능 JdbcTemplate이 제공하는 주요 기능은 다음과 같다. ● JdbcTemplate ● 순서 기반 파라미터 바인딩을 지원한다. ● NamedParameterJdbcTemplate ● 이름 기반 파라미터 바인딩을 지원한다. (권장) ● SimpleJdbcInsert ● INSERT SQL을 편리하게 사용할 수 있다. ● SimpleJdbcCall ● 스토어드 프로시저를 편리하게 호출할 수 있다. 참고 스토어드 프로시저를 사용하기 위한 SimpleJdbcCall 에 대한 자세한 내용은 다음 스프링 공식 메뉴얼을 참고하자. https://docs.spring.io/spring-framework/docs/current/reference/html/dataaccess.html#jdbc-simple-j..
JdbcTemplate - SimpleJdbcInsert
2022. 8. 12. 17:18
데이터 접근 기술/JdbcTemplate
JdbcTemplate은 INSERT SQL를 직접 작성하지 않아도 되도록 SimpleJdbcInsert 라는 편리한 기능을 제공한다. JdbcTemplateItemRepositoryV3 package hello.itemservice.repository.jdbctemplate; import hello.itemservice.domain.Item; import hello.itemservice.repository.ItemRepository; import hello.itemservice.repository.ItemSearchCond; import hello.itemservice.repository.ItemUpdateDto; import lombok.extern.slf4j.Slf4j; import org.spri..
JdbcTemplate - 이름 지정 파라미터 3
2022. 8. 12. 17:02
데이터 접근 기술/JdbcTemplate
이제 이름 지정 파라미터를 사용하도록 구성하고 실행해보자 JdbcTemplateV2Config package hello.itemservice.config; import hello.itemservice.repository.ItemRepository; import hello.itemservice.repository.jdbctemplate.JdbcTemplateItemRepositoryV2; import hello.itemservice.service.ItemService; import hello.itemservice.service.ItemServiceV1; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.B..
JdbcTemplate - 이름 지정 파라미터 2
2022. 8. 12. 14:13
데이터 접근 기술/JdbcTemplate
이름 지정 파라미터 파라미터를 전달하려면 Map 처럼 key , value 데이터 구조를 만들어서 전달해야 한다. 여기서 key 는 :파리이터이름 으로 지정한, 파라미터의 이름이고 , value 는 해당 파라미터의 값이 된다. 다음 코드를 보면 이렇게 만든 파라미터( param )를 전달하는 것을 확인할 수 있다. template.update(sql, param, keyHolder); 이름 지정 바인딩에서 자주 사용하는 파라미터의 종류는 크게 3가지가 있다. ● Map ● SqlParameterSource ● MapSqlParameterSource ● BeanPropertySqlParameterSource 1. Map 단순히 Map 을 사용한다. findById() 코드에서 확인할 수 있다. Map pa..
JdbcTemplate - 이름 지정 파라미터 1
2022. 8. 12. 13:49
데이터 접근 기술/JdbcTemplate
순서대로 바인딩 JdbcTemplate을 기본으로 사용하면 파라미터를 순서대로 바인딩 한다. 예를 들어서 다음 코드를 보자. String sql = "update item set item_name=?, price=?, quantity=? where id=?"; template.update(sql, itemName, price, quantity, itemId); 여기서는 itemName , price , quantity 가 SQL에 있는 ? 에 순서대로 바인딩 된다. 따라서 순서만 잘 지키면 문제가 될 것은 없다. 그런데 문제는 변경시점에 발생한다. 이름 지정 바인딩 JdbcTemplate은 이런 문제를 보완하기 위해 NamedParameterJdbcTemplate 라는 이름을 지정해서 파라미터를 바인딩 ..
JdbcTemplate 적용3 - 구성과 실행
2022. 8. 12. 13:09
데이터 접근 기술/JdbcTemplate
JdbcTemplateV1Config package hello.itemservice.config; import hello.itemservice.repository.ItemRepository; import hello.itemservice.repository.jdbctemplate.JdbcTemplateItemRepositoryV1; import hello.itemservice.service.ItemService; import hello.itemservice.service.ItemServiceV1; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework...
JdbcTemplate 적용2 - 동적 쿼리 문제
2022. 8. 12. 12:11
데이터 접근 기술/JdbcTemplate
결과를 검색하는 findAll() 에서 어려운 부분은 사용자가 검색하는 값에 따라서 실행하는 SQL이동적으로 달려져야 한다는 점이다. 예를 들어서 다음과 같다. 검색 조건이 없음 select id, item_name, price, quantity from item 최대 가격( maxPrice )으로 검색 select id, item_name, price, quantity from item where price
JdbcTemplate 적용1 - 기본
2022. 8. 12. 10:31
데이터 접근 기술/JdbcTemplate
이제부터 본격적으로 JdbcTemplate을 사용해서 메모리에 저장하던 데이터를 데이터베이스에 저장해보자. ItemRepository 인터페이스가 있으니 이 인터페이스를 기반으로 JdbcTemplate을 사용하는 새로운 구현체를 개발하자. JdbcTemplateItemRepositoryV1 package hello.itemservice.repository.jdbctemplate; import hello.itemservice.domain.Item; import hello.itemservice.repository.ItemRepository; import hello.itemservice.repository.ItemSearchCond; import hello.itemservice.repository.ItemUp..
JdbcTemplate 소개와 설정
2022. 8. 11. 20:17
데이터 접근 기술/JdbcTemplate
장점 ● 설정의 편리함 ● JdbcTemplate은 spring-jdbc 라이브러리에 포함되어 있는데, 이 라이브러리는 스프링으로 JDBC를 사용할 때 기본으로 사용되는 라이브러리이다. 그리고 별도의 복잡한 설정 없이 바로 사용할 수 있다. ● 반복 문제 해결 ● JdbcTemplate은 템플릿 콜백 패턴을 사용해서, JDBC를 직접 사용할 때 발생하는 대부분의 반복 작업을 대신 처리해준다. ● 개발자는 SQL을 작성하고, 전달할 파리미터를 정의하고, 응답 값을 매핑하기만 하면 된다. ● 우리가 생각할 수 있는 대부분의 반복 작업을 대신 처리해준다. ● 커넥션 획득 ● statement 를 준비하고 실행 ● 결과를 반복하도록 루프를 실행 ● 커넥션 종료, statement , resultset 종료 ● ..