스프링 공부/인프런 김영한 스프링 입문 노트정리

6-4. 스프링 JdbcTemplate

모항 2022. 7. 31. 23:57

순수 JDBC보다 훨씬 단순하고 편리해진 JdbcTemplate라는 것을 사용해 레포지토리를 짜보는 회차이다.

순수 JDBC는 비효율적이어서 실무에선 거의 안 쓴다고 했는데, JdbcTemplate부터는 많이 쓰인다고 한다.

 

디자인 패턴 중에 template method pattern이라는 것이 있는데, 이걸 사용해서 디자인하였기 때문에 이름이 JdbcTemplate이라고 한다.

 

JDBC에서는 모든 코드를 일일이 적어야 했기 때문에 반복되는 코드가 많았다.

JdbcTemplate에서는 이런 반복되는 코드들을 줄여놓았다.

 

우리는 귀찮은 설정을 하나하나 해줄 필요 없이,

메소드 하나를 딱 호출해서

그 인자로

원하는 sql문과

sql문의 결과를 담아올 방식을 정해주기만 하면 된다.

 

훨씬 편리해졌지만, sql문 자체는 여전히 손으로 적어줘야 한다.

 

따로 해줘야 하는 환경설정은 없다.

그냥 이렇게 순수 JDBC를 사용할 때 쓰는 라이브러리들만 준비해주면 된다.

 

 

 

 

 

JDBC Template을 사용한 리포지토리 코드 작성

repository 패키지 안에 다음과 같이 새 클래스를 만든다.

implement까지 해주었음

 

 

그 다음, JdbcTemplate라는 것의 객체를 필드로 선언해주고, 생성자도 만들어준다.

근데 이렇게 지금까지 하던 대로 injection받는 것이 아니고,

 

 

이렇게 DataSource라는 것을 받아와 생성자의 인자로 넣어줘야 한다.

이 DataSource는 스프링이 알아서 자동으로 injection해준다.

 

 

그리고 강사님이 한 가지 팁을 주셨다.

원래 이렇게 @Autowired가 있어야 하는데,

지금처럼 클래스 안에 생성자가 딱 하나밖에 없다면 @Autowired를 생략해도 된다고 한다.

두 개 이상일 땐 안 된다!

 

 

그래서 지워주었다.

 

 

 

 

 

 

RowMapper

내가 구글링을 해본 결과에 의하면,

sql query를 통해 받아올 수 있는 것은 기본 데이터형 뿐이라고 한다.

그렇다면 내가 만든 객체인 Member를 결과물로 받아오려면 어떻게 해야 할까?

이런 문제를 해결하기 위해 있는 것이 바로 RowMapper이다.

sql문의 결과문을 RowMapper로 감싸서 가져오면 된다.

 

 

이를 위해선 아래와 같이

내가 원하는 객체를 RowMapper로 감싸서 리턴하는 메소드를 만들어주어야 한다.

sql의 결과물이 ResultSet 객체 rs에 담겨, mapRow의 인자로 들어온다.

우린 이 ResultSet에서 데이터를 꺼내와, 새로운 Member 객체의 필드값으로 지정해준 뒤, 그 Member 객체를 mapRow의 리턴값으로 돌려주면 된다.

그럼 리턴된 Member 객체가 RowMapper에 감싸인 채로 최종 리턴된다.

 

 

 

ID로 회원을 조회하는 메소드 findById()

Member를 RowMapper로 감싸주는 메소드를 만들어주었다면 이제 본격적으로 리포지토리의 메소드들을 만들어보자.

 

가장 먼저 findById() 부터 만들어본다.

 

 

query()의 매개변수는 sql문, 결과, sql문의 ?에 들어갈 기준값이다.

sql문의 결과가 RowMapper에 싸여있는 것을 result라는 객체에 넣어준 뒤

result 안에 값이 하나라도 들어있다면 그 값을 Optional에 담아 리턴,

아무 값도 없다면 텅 빈 Optional을 리턴해준다.

 

 

두 줄 밖에 안 된다. 매우 간단하다!

순수 JDBC와 한 번 비교해보자.

어마어마하게 길다.

순수 JDBC 보니까 또 수업 듣던 때의 PTSD가 올라오네

 

 

 

 

 

새 회원 정보를 저장하는 save()

save()는 좀 복잡하다.

강사님처럼 일단 강의자료에서 복붙을 해주겠다.

쭉 읽어보니,

SimpleJdbcInsert라는 신기한 놈이 하나 등장해서 편리하게 일을 해주는 것 같다.

그리고 또 흥미로운 부분은 HashMap(키는 속성의 이름, 밸류는 속성의 값)을 인자로 넣어주면 그거에 기반해 DB에 데이터를 넣어주는? 아니면 데이터를 바꿔주는? 기능이 있는 듯하다. 매우 신기하다. 우리는 회원의 속성이 id와 name밖에 없으므로 usingGeneratedKeyColumns를 통해 id를 자동생성해주고 HashMap에는 name이라는 키의 요소 하나만 넣었다. 만약 회원의 속성이 여러 개 (예를 들면 이름, 나이, 성별 등등...) 라면 HashMap에 더 많은 요소를 넣으면 될 것 같은 느낌적인 느낌?

 

강사님께서는 문서 읽어보고 배우면 금방 쓸 수 있을 정도로 쉽다고 이야기해주시고 넘어갔다. 맞는 것 같다.

감을 잡는 것이 목표인 강의이므로 간단한 예시 코드 적어주시고 짧게 설명해주시는 것 같다.

 

 

 

 

 

 

이름으로 회원을 조회하는 메소드 findByName()

findById()를 복붙해놓고 이렇게 조금만 바꿔주면 된다.

 

 

 

 

 

 

모든 회원 목록을 조회하는 메소드 findAll()

얘도 다른 조회 메소드들이랑 비슷하다. 좀만 바꿔서 적어준다.

 

 

간단하게 한 줄로 줄여줬다.

 

 

 

 

 

조립하기(Configuration 수정)

이제 SpringConfig를 수정해서 리포지토리를 갈아끼워주자.

위처럼 순수 JDBC로 만든 리포지토리가 끼워져있는 상태에서

 

 

이렇게 JdbcTemplate 리포지토리가 사용되도록 바꾸어준다.

 

 

 

 

 

 

테스트하기

테스트는 이전 강의에서 만든 통합 테스트를 돌려서 해주면 된다. 잘 pass되었다.

'스프링 공부 > 인프런 김영한 스프링 입문 노트정리' 카테고리의 다른 글

6-6. 스프링 데이터 JPA  (1) 2022.08.01
6-5. JPA  (0) 2022.08.01
6-3. 스프링 통합 테스트  (0) 2022.07.31
6-2. 순수 JDBC  (0) 2022.07.30
6-1. H2 데이터베이스 설치  (2) 2022.07.30