스프링 DB 데이터 접근 활용 기술_01
인프런 김영한님 강의 들으면서 살짝쿵 내용 정리해보기ㅎㅎㅎ
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2/dashboard
스프링 DB 2편 - 데이터 접근 활용 기술 강의 - 인프런
백엔드 개발에 필요한 DB 데이터 접근 기술을 활용하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 백엔드 개발자
www.inflearn.com
데이터 접근 기술 - 시작
Profile(프로필)
: 로딩 시점에 application.properties 의 spring.profiles.active 속성을 읽어서 프로필로 사용.
: 이 프로필은 local, 운영 등등 다양한 환경에 따라서 설정 다르게 하고 싶을 때 사용.
: local PC에서는 local PC에 설치된 데이터베이스에 접근해야 하고, 운영 환경에서는 운영 데이터베이스에 접근해야 한다면 서로 설정 정보가 달라야 함.
: 프로필을 사용하면 이런 문제 해결 가능.
Ex) @Profile("local")
: local 이라는 이름의 프로필이 사용되는 경우에만 어떤 실행하게 하는 코드.
JUnit으로 간단 테스트 시
: assertThat(...)은 해당 값의 검증이 실패하면 테스트 실패를 알리고, 해당 메소드의 테스트를 중지.
: 테스트 시 순서랑 중복 여부까지 고려해서 완벽히 일치하는 테스트를 원한다면 containsExactly.
: 테스트 시 순서랑 중복 여부는 상관없이 값만 테스트해보고 싶다면 ContainsOnly.
스프링 JdbcTemplate
: KeyHolder는 자동으로 생성 된 키 값을 구할 수 있는 방법 중 하나.
Ex) KeyHolder keyHolder = new GeneratedKeyHolder();
: NamedParameterJdbcTemplate은 이름을 지정해서 파라미터를 바인딩 하는 기능 제공.
Ex) SQL에서 아래와 같이 ? 대신 :뒤에 파라미터 이름 적어서 작성해서 사용.
insert into item (item_name, price, quantity) " +
"values (:itemName, :price, :quantity)"
: MapSqlParameterSource
Map 과 유사한데, SQL 타입을 지정할 수 있는 등 SQL에 좀 더 특화된 기능을 제공.
SqlParameterSource 인터페이스의 구현체. MapSqlParameterSource 는 메서드 체인을 통해 편리한 사용법도 제공.
SqlParameterSource param = new MapSqlParameterSource()
.addValue("itemName", updateParam.getItemName())
.addValue("price", updateParam.getPrice())
.addValue("quantity", updateParam.getQuantity())
.addValue("id", itemId);
template.update(sql, param);
: SimpleJdbcInsert
INSERT SQL문을 직접 작성하지 않아도 되도록 JdbcTemplate에서 제공해주는 기능 중 하나.
private final SimpleJdbcInsert jdbcInsert;
public JdbcTemplateItemRepositoryV3(DataSource dataSource) {
this.template = new NamedParameterJdbcTemplate(dataSource);
this.jdbcInsert = new SimpleJdbcInsert(dataSource)
.withTableName("item")
.usingGeneratedKeyColumns("id");
// .usingColumns("item_name", "price", "quantity"); //생략 가능
}
데이터 접근 기술-테스트
데이터베이스 분리
: l ocal에서 사용하는 애플리케이션 서버와 테스트에서 같은 데이터베이스 사용으로 문제 발생.
: 테스트와 local이랑 데이터베이스 별도 운영 필요.
: h2 DB 용도에 따라 명칭 다르게 해서 구분해 주면 문제 해결.
jdbc:h2:tcp://localhost/~/test local에서 접근하는 서버 전용 데이터베이스.
jdbc:h2:tcp://localhost/~/testcase test 케이스에서 사용하는 전용 데이터베이스.
테스트에서 중요한 원칙
: 테스트는 다른 테스트와 격리해야 함.
: 테스트는 반복해서 실행할 수 있어야 함.
@Transactional 원리
: 스프링은 테스트 데이터 초기화를 위해 트랜잭션 적용/롤백을 @Transactional로 해결.
: 스프링이 제공하는 @Transactional 어노테이션은 로직이 성공적으로 수행되면 커밋하도록 동작.
: BUT @Transactional 어노테이션을 테스트에서 사용하면 아주 특별하게 동작.
: @Transactional 이 테스트에 있으면 스프링은 테스트를 트랜잭션 안에서 실행하고, 테스트가 끝나면 트랜잭션을 자동으로 롤백시켜 버림.
임베디드 모드 DB
: 애플리케이션을 실행 시 H2 데이터베이스도 해당 JVM 메모리에 포함해서 함께 실행할 수 있음.
: DB를 애플리케이션에 내장해서 함께 실행한다고 해서 임베디드 모드(Embedded mode)라 함.