Developer_Neo
[Spring 입문] - JdbcTemplate 본문
반응형
이것을 보면서
잘 이해가 안되거나, 연결이 안된다면 위의 글을 보고 오면 될 것이다.
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
여기에서 RowMapper에 해당하는 것을 만드는 이유는 JdbcTemplate의 query메서드를 사용하기 때문이다.
2. query메서드
JdbcTemplate의 query메서드는
위와 같은 형식으로 많이 쓰이는데 우리가 사용할 것은 첫번째에 해당하는 것이다.
그래서 jdbcTemplate.query(쿼리문, rowmapper함수) 형식으로 적는데 이것은 반환 값은 위를 보면 List이다. 그래서 List클래스 타입으로 반환 받고선 가공하여 결과값을 내보내야 한다.
위의 두 코드를 보면 JdbcTemplate을 이용한것이 반복적인 코드가 줄어들고 깔끔해 보인다.
참고) findAny() 메소드는 해당 스트림에서 첫 번째 요소를 참조하는 Optional 객체를 반환
위의 말대로 Optional객체를 반환해야하는데 해당 id에 대한 하나의 요소만 나오고 하나의 요소만 리턴해야하기에 위의 코드와 같이 작성하였다.
회원 등록에 대한 코드
강의 내에서는 자세히 이야기안해주었지만 위의 코드를 자세히 알아보자
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의 테이블은
위의 사진과 같이 구성되어 있다 (여기에서 pk는 Auto_Increment를 적용하여 입력안해도된다.)
그러면 우리는 name에 대한 것이 필요하다
name에 대한 data를 insert문에 넣어 완성시켜서 테이블에 데이터를 삽입시키기 위해서는 executeAndReturnKey메서드를 사용해야한다.
그런데 이 메서드는 인자로 SqlParameterSource 인터페이스를 구현한 구현체로써 받고 있는데
SqlParameterSource 인터페이스의 구현체 중 우리는 MapSqlParameterSource 클래스를 이용할 것이다.
이 MapSqlParameterSource의 생성자는 Map에 해당하는 것을 인자로 받고 있다.
그래서 우리는 name에 대한 data를 Map클래스를 이용해 저장하고 MapSqlParameterSource 생성자의 인자로 전달하면, 데이터베이스 member테이블에 데이터를 저장하고 기본키를 반환 받을 수 있다.
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한다.
나머지 코드들
위에서 query메서드에서 맨마지막 인자로 name을 전달한 것이 있는데 이것은 쿼리문의 ?에 들어갈 인자를 넣어준 것이다.
결과
반응형
'Spring' 카테고리의 다른 글
[Spring 입문] - 스프링 데이터 JPA (0) | 2022.08.06 |
---|---|
[Spring 입문] - JPA (0) | 2022.08.05 |
[Spring 입문] - 데이터베이스 연동(spring boot + Mysql with build.gradle , applicatioin.properties) (0) | 2022.08.04 |
[Spring 입문] - 스프링 빈과 의존관계, 웹 MVC개발 (0) | 2022.08.04 |
[Spring 입문] - 회원 관리 예제를 만들어 보자 (0) | 2022.08.03 |
Comments