Notice
Recent Posts
Recent Comments
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
10-11 00:15
Archives
Today
Total
관리 메뉴

Developer_Neo

[Spring 입문] - JdbcTemplate 본문

Spring

[Spring 입문] - JdbcTemplate

_Neo_ 2022. 8. 5. 21:42
반응형

이것을 보면서

2022.08.04 - [Spring] - [Spring 입문] - 데이터베이스 연동(spring boot + Mysql with build.gradle , applicatioin.properties)

 

[Spring 입문] - 데이터베이스 연동(spring boot + Mysql with build.gradle , applicatioin.properties)

김영한님의 Spring입문 강의 내에서 database를 h2로 진행하였다. 하지만 나는 h2를 설치하기 싫어서 사용해왔던 Mysql으로 이용하였다. build.gradle 추가한 코드 dependencies { implementation 'org.springfram..

devloper-dreaming.tistory.com

잘 이해가 안되거나, 연결이 안된다면 위의 글을 보고 오면 될 것이다.


JdbcTemplate

실무에서 많이 쓰인다.

이전 글에서 해왔던 것은 순수 JDBC를 이용해 왔던 것이다. 우리는 이제 JdbcTemplate를 사용할 것인데 이것은 MyBatis와 같이 JDBC API에서 본 반복 코드를 대부분 제거해줍니다. 하지만 SQL문은 직접 작성해야한다는 것이 있습니다.

 

등록 조회 삭제에 관한 SQL문도 안적어도 되는 것은 JPA이다.

 

 

 JdbcTemplate라는 것이 있다.

import org.springframework.jdbc.core.JdbcTemplate;

이것을 활용해야한다.

 

하지만, JdbcTemplate은 Injection인 주입받을 수 없다. 그래서 이것은 DataSource라는 것을 이용해 주입 받는다.

위와 같이 진행할 수 있다.

 

이전의 발행글을 보면, SpringConfig라는 파일에서 DataSource를 @Autowired를 통해 주입하는 것이 있는걸 확인할 수 있다.
위의 클래스에서도 @Autowired를 통해 진행하고 있는데 이것은 DataSource는 빈으로 등록하지 않아도 스프링 부트가 자동으로 빈등록을 하며, 빈 등록을 하면 DataSource에 해당하는 것은 싱글톤으로써 관리되어 하나의 객체를 공유하면서 쓰고 있는 것이 된다. 그래서 위의 클래스에서는 SpringConfig에서 넣어주는 DataSource랑 동일하다.

 

 

참고로 빈으로 등록된(할) 클래스의 생성자가 딱 하나만 있으면, @Autowried를 생략할 수 있다. 

 

 


findById에 대한 코드

 

1. RowMapper

왼쪽의 new RowMapper에 커서를 두고 alt+ enter누르면 람다식으로 변경이 가능하다.

여기에서 RowMapper에 해당하는 것을 만드는 이유는 JdbcTemplate의 query메서드를 사용하기 때문이다.

 

 

 

2. query메서드

 

JdbcTemplate의 query메서드는

위와 같은 형식으로 많이 쓰이는데 우리가 사용할 것은 첫번째에 해당하는 것이다.

 

 

그래서 jdbcTemplate.query(쿼리문, rowmapper함수) 형식으로 적는데 이것은 반환 값은 위를 보면 List이다. 그래서 List클래스 타입으로 반환 받고선 가공하여 결과값을 내보내야 한다.

 

 

이전 발행글의 순수 JDBC로 구현한 모습
JdbcTemplate을 이용한 모습

위의 두 코드를 보면 JdbcTemplate을 이용한것이 반복적인 코드가 줄어들고 깔끔해 보인다.

참고) findAny() 메소드는 해당 스트림에서 첫 번째 요소를 참조하는 Optional 객체를 반환

 

위의 말대로 Optional객체를 반환해야하는데 해당 id에 대한 하나의 요소만 나오고 하나의 요소만 리턴해야하기에 위의 코드와 같이 작성하였다.

 

 

 


회원 등록에 대한 코드

save코드

강의 내에서는 자세히 이야기안해주었지만 위의 코드를 자세히 알아보자

 

SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");

 

SimpleJdbcInsert

간단하게 데이터를 저장하기 위해 만들어진 클래스이다.
테이블 명과 컬럼 명만 명시해주면 쿼리문 없이 쉽게 Insert 쿼리를 처리할 수 있다. 
insert 쿼리문을 구성하는데에 있어 정보가 없기에 이 클래스에게 제공해야하는 것이 있다.
테이블 이름과 열이름과 열 값이 포함된 맵을 제공하면 된다.

생성자는 2가지가 있다.
1. SimpleJdbcInsert(DataSource dataSource) 형식
2. SimpleJdbcInsert(JdbcTemplate jdbcTemplate) 형식
우리는 2번째 방식을 사용한다.

insert할 때 어디 테이블에 삽입할지에 대한 정보를 withTableName이라는 메서드를 이용해 알려줍니다.
jdbcInsert.withTableName("member") 와 같이
이것의 반환 값은 SimpleJdbcInsert입니다.

그리고, 위에서 알려준 table중 PK이며, 자동으로 생성되는 키를 알려주어야합니다.
usingGeneratedKeyColumns메서드를 이용하며 인자로는 위의 조건에 해당되는 키의 열이름을 넣어줍니다.
반환 값은 SimpleJdbcInsert입니다.
그래서 최종적으로 jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id"); 이러한 형태로 알려줍니다.

 

위의 작업이 끝났다면, 우리는 insert into member Values ( )를 완성했다고 할 수 있다. 그러면 우리는 진짜 이제 들어갈 정보를 입력해 주어야한다.

 

member의 테이블은

member 테이블

위의 사진과 같이 구성되어 있다 (여기에서 pk는 Auto_Increment를 적용하여 입력안해도된다.)
그러면 우리는 name에 대한 것이 필요하다

name에 대한 data를 insert문에 넣어 완성시켜서 테이블에 데이터를 삽입시키기 위해서executeAndReturnKey메서드를 사용해야한다.

그런데 이 메서드는 인자로 SqlParameterSource 인터페이스를 구현한 구현체로써 받고 있는데
SqlParameterSource 인터페이스의 구현체 중 우리는 MapSqlParameterSource 클래스를 이용할 것이다.

이 MapSqlParameterSource의 생성자는 Map에 해당하는 것을 인자로 받고 있다.

그래서 우리는 name에 대한 data를 Map클래스를 이용해 저장하고 MapSqlParameterSource 생성자의 인자로 전달하면, 데이터베이스 member테이블에 데이터를 저장하고 기본키를 반환 받을 수 있다.

SimpleJdbcInsert 클래스의 executeAndReturnKey메서드
SqlParameterSource 인터페이스
SqlParameterSource 인터페이스의 구현체의 클래스와 메서드

 

 

 

Map<String, Object> parameters = new HashMap<>();
parameters.put("name", member.getName());

Number key = jdbcInsert.executeAndReturnKey(new
                MapSqlParameterSource(parameters));

 

 

executeAndReturnKey

executeAndReturnKey 메소드를 호출하면, 테이블에 데이터가 삽입된다. 그리고반환 값으로 DB에서 받아온 기본키를 반환한다.

 

따라서 위에 적혀진 코드로 진행하게 되면 Number key의 key에는 insert쿼리문이 작동된 후 해당 id인 기본키 값이 Number클래스로 변환되어 저장된다.

그리고 save를 한 결과로 원래 id를 반환 해주기로 되어 있었으니 

member.setId(key.longValue());
return member;

위의 코드로써 long타입 id값을 반환하여 member에 저장해 return한다.

 

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/simple/SimpleJdbcInsert.html#executeAndReturnKey-org.springframework.jdbc.core.namedparam.SqlParameterSource-

 

SimpleJdbcInsert (Spring Framework 5.3.22 API)

A SimpleJdbcInsert is a multithreaded, reusable object providing easy insert capabilities for a table. It provides meta-data processing to simplify the code needed to construct a basic insert statement. All you need to provide is the name of the table and

docs.spring.io

 


나머지 코드들

위에서 query메서드에서 맨마지막 인자로 name을 전달한 것이 있는데 이것은 쿼리문의 ?에 들어갈 인자를 넣어준 것이다.

 

결과

 

반응형
Comments