Backend

스프링 DB 데이터 접근 활용 기술_01

starlikedh 2024. 1. 6. 16:34

인프런 김영한님 강의 들으면서 살짝쿵 내용 정리해보기ㅎㅎㅎ
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)라 함.