Spring JDBC (Back End) ... Part 3
2020. 4. 17. 23:40ㆍToday I learned/Online Courses
강의: [edwith 부스트코스] 웹 프로그래밍 챕터 3, 웹 앱 개발: 예약서비스 1/4
학습일: 2020년 4월 17일
8. Spring JDBC - BE
Spring JDBC를 이용해 SELECT 쿼리문 실행하기
- 쿼리문 실행에 필요한 클래스
- Role (DTO): 데이터가 오고갈 때 필요한 클래스
- RoleDaoSqls: 쿼리문 정보를 담은 클래스
- RoleDao (DAO): 데이터에 접근할 수 있는 객체를 만드는 메서드를 담은 클래스
- 실행 시 Spring JDBC가 제공하는 객체인 NamedParameterJdbcTemplate과 SimpleJdbcInsert를 이용
- Role (DTO) 클래스 생성
- DTO 클래스 파일만 모아놓을 패키지 생성
- 패키지명: kr.or.connect.daoexam.dto
- Role 클래스 생성
-
- 필드 선언: int 타입 roleId, String 타입 description
- 필드 각각에 대한 getter, setter 메서드 생성
- Role 객체가 가진 값을 간편하게 보여주기 위해 toString( ) 메서드를 Override함
-
- DTO 클래스 파일만 모아놓을 패키지 생성
- RoleDaoSqls 클래스 생성
- DAO 클래스 파일만 모아놓을 패키지 생성
- 패키지명: kr.or.connect.daoexam.dao
- RoleDaoSqls 클래스 생성
- 사용하고자 하는 쿼리를 상수에 입력
- 상수명은 모든 문자가 대문자인 스네이크 표기법으로 입력
- DAO 클래스 파일만 모아놓을 패키지 생성
- RoleDao (DAO) 클래스 생성
- 데이터에 접근할 객체가 담겨 있는 클래스
-
- @Autowired로 연결하기 위해 @Repository를 붙임
- 쿼리문 실행을 위해 필요한 NamedParameterJdbcTemplate 객체(이하 Named... 객체)를 선언
- Spring JDBC에서 가장 중요한 JDBC 템플릿의 가독성을 높이기 위해 사용하는 객체
- ?로 mapping했으나, 매개변수 이름으로 대체해서 mapping할 수 있게 함
- 생성자는 DataSource를 인자로 받아들여 Named... 객체를 생성
- SELECT 쿼리문을 실행할 selectAll( ) 메서드 생성
- 반환되는 Role이 여러건이므로 메서드의 타입은 List<Role>으로 설정
- 복잡한 것은 Named... 객체가 처리할 수 있도록, jdbc.query( ) 메서드를 실행
- 결과가 여러 건일 때 내부적으로 반복하면서 DTO를 생성하고 List에 담아 반환하는 메서드
- 첫 번째 인자로 쿼리문을 입력
- RoleDaoSqls 클래스를 static import한 뒤, 첫 번째 인자에 SELECT_ALL 지정
- static import: 외부 클래스의 변수를 클래스 이름 없이 바로 사용할 수 있는 import 방식
- 두 번째 인자로 비어있는 map 객체를 입력
- Collections.emptyMap( ) 메서드로 비어 있는 map 객체 생성
- SQL 문에 mapping할 값이 있을 때, 그 값을 전달할 목적으로 사용하는 map 객체
- 세 번째 인자로 rowMapper 객체를 입력
- SELECT 결과 각각을 DTO에 저장하는 목적으로 사용되는 객체
- BeanPropertyRowMapper 객체를 이용하면 Column의 값을 자동으로 DTO에 담아줌
- ※ BeanPropertyRowMapper 객체는 DBMS와 Java의 Column 표기법 차이도 맞춰줌
- ※ Column 이름을 DBMS는 스네이크 표기법으로, Java는 카멜 표기법으로 기재
- Column의 수가 많아질수록 빛을 발하는 기능
- ※ BeanPropertyRowMapper 객체는 DBMS와 Java의 Column 표기법 차이도 맞춰줌
- @Repository가 붙은 RoleDao 클래스를 읽어들이도록 설정
- ApplicationConfig에 @ComponentScan 입력
-
- basePackages를 지정해서 사용
- { } 중괄호를 이용하면 복수의 패키지를 대상으로도 ComponentScan 연결 가능
- basePackages를 지정해서 사용
- RoleDao 클래스를 bean으로 등록해준 것과 같은 효과
- SELECT 쿼리문 실행 테스트하기
- SelectAllTest 클래스 생성
- 패키지: kr.or.connect.daoexam.main
- ApplicationContext(공장)에 만들 객체에 대한 정보를 담은 클래스의 경로를 입력
- getBean( ) 메서드로 ApplicationContext에서 RoleDao 객체를 얻어냄
- RoleDao 객체의 selectAll( ) 메서드로 쿼리문을 실행한 뒤, 결과값을 List에 담아 반환
- SelectAllTest 클래스 생성
※ JdbcTemplate 대신 NamedParameterJdbcTemplate을 이용해 DAO를 작성하는 이유
- 쿼리문에 ? 대신 구체적인 매개변수명을 사용하여,
쿼리문이 별도의 클래스나 파일로 저장될 경우에 일어날 수 있는 잘못된 순서로 값을 전달하는 실수를 줄일 수 있음
'Today I learned > Online Courses' 카테고리의 다른 글
Spring MVC (Back End) ... Part 1 (0) | 2020.04.22 |
---|---|
Spring JDBC (Back End) ... Part 4 (0) | 2020.04.19 |
Spring JDBC (Back End) ... Part 2 (0) | 2020.04.17 |
Spring JDBC (Back End) ... Part 1 (0) | 2020.04.16 |
Spring Core (Back End) ... Part 3 (0) | 2020.04.15 |