Spring boot JDBC Template

강정우·2022년 10월 26일
0

spring

목록 보기
19/27
post-thumbnail

  • ctrl + E : 최근에 봤던 파일 목록

H2 DB 설치

  • 개발이나 테스트용도로 가볍고 편리한 DB, 웹 화면 제공
  • H2 버전은 스프링 부트 버전에 맞춘다.
    H2 DB 설치법
    위의 설치법 대로 하고 web console로 테이블 생성하면 결과값이 다음과 같이 잘 뜰것이다.

intelli에서 sql 코드 따로 관리

  • 테이블 관리를 위해 프로젝트 루트디렉토리에 sql/ddl.sql 파일을 생성해서 따로 관리해주면 좋다.ㅉㅉ

1. 순수 JDBC

  • 정말 오래된 기술이고 앞서도 포스팅 했기에 혹시 필요로 하다면 그냥 googling하는 것이 좋다.
  • java가 db에 붙으려면 반드시 필요한 것이 바로 jdbc이다.

1. gradle.build에 추가

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'

2. JdbcMemberRepository만들기

Alt + Endter : implement methods를 빠르고 간편하게 할 수 있다.

다형성

  • 이제 memory 상에 올려두었던 data code를 떼고 실제 DB와 열결할 수 있는 code로 바꿔줘야하는데 이때 매우 편리하게 할 수 있다.
    바로 앞서 만들어두었던 @Config 부분에 assembly만 바꿔주면 되는데 바로 이렇게 바꾸어줄 수 있다.

  • SOLD 원칙 중 개방-폐쇄원칙(OCP, Open-Closed Principle)
    • 확장에는 열려있고, 수정(변경)에는 닫혀있다.

@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다. 요즘은 이거 하나로 된다. "Spring Boot 만세"
@Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고,
테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지
않는다. 그런데 또 강제로 transaction을 저장하기위한 메서드에 붙이는 @Commit 어노테이션 도 있다.

Test 부분

  • 이 코드를 test 부분이니까 즉, 말그대로 test부가 final, 다른곳에서 갖다 쓰는게 아니니까 그냥 field기반 auto injection으로 하면 편하다.

@Transactional

@AfterEach
public void afterEach(){ repository.cleaStore(); }
  • 이제 memory를 지워주면 위 코드도 필요가 없어졌다. 왜냐 이게 실제 DB에 붙는거기 때문
  • 그럼 이제 허걱쓰 진짜 DB에 삭제하는건가?! 하는데 실무는 test용 DB가 따로 있어서 괜찮다. 즉, 이 test는 실제 config에 있는 component들이 모두 spring container안에 들어간다.
  • 그런데 문제는 코드를 여러번 돌려도 문제가 없어야 한다!!!
    모든 DB엔 trainsaction 개념이 있는데 그 "transaction"이다.

    spring 컨테이너 없이 unit test하는 것이 좋고 이것에 익숙해져야한다. 물론 그게 항상 좋은 test다 라고 말할 순 없고 반드시 통합 테스트가 필요한 순간도 오겠지만 보통은 단위 test가 좋은 test일 확률이 높다. 즉 unit test를 잘 만들어야 한다.

2. Spring JDBCTemplate

  • 왜 template인가? 디자인 패턴중 template method pattern이 있는데 그 걸 사용해서 그렇다.
  • 순수 jdbc의 중복들을 제거하여 조금 더 편리하게 개발할 수 있도록 하게끔 Spring에서 template를 제공한다.
  • 설정은 순수 jdbc와 같이 gradle.build를 설정하면 된다.
  • Spring의 jdbctemplatemybatis같은 libary는 jdbc api에서 본 반복 코드를 대부분 제거해준다. 하지만 sql은 직접 작성해야한다.

JDBC Repository class 만들기

1. jdbc 객체 생성

private final JdbcTemplate jdbcTemplate;

@Autowired
public JdbcTemplateMemberRepository(DataSource dataSource){
	this.jdbcTemplate = new JdbcTemplate(dataSource);
}
  • 위와 같이 JDBC 객체를 생성할 때 dataSource를 넣어주어야 한다.

2. 결과값을 받을 Mapper 만들기

  • 이걸 alt + Enter(mac:opt+enter) lambda식으로 더 간소화 하여 만들 수 있다.
private RowMapper<Member> memberRowMapper(){
	return (rs, rowNum) -> {
		Member member = new Member();
		member.setId(rs.getLong("id"));
		member.setName(rs.getString("name"));
		return member;
	};
}

3. method구현

@Override
public Optional<Member> findById(Long id) {
	List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper());
	return result.stream().findAny();
}
  • 위에서 만든 RowMapper 객체를 바로 가져와서 쓴 모습이다.

  • 즉, 원래는 JDBC를 연결하고 conn을 얻어서 다시 psmt에 집어넣고 쿼리돌리고 리소스 때문에 다시 연결을 끊고 이러한 긴 작업과정을 Spring JDBC Template를 사용하면 위 코드들 처럼 연결하는 코드 1개 그리고 쿼리문 날리는 메서드 1개 면 끝난다는 장점이 있다.

  • 또한 굉장히 간단히 insert를 할 수 있다. 그외 기타 CRUD 및 다른 spring JDBC 메서드에 대해선 docs를 자세히 보면 알 수 있다.
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글