더보기

JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

 

출처 : 위키백과, JDBC, https://ko.wikipedia.org/wiki/JDBC

 

Spring에서 JDBC를 이용하여 데이터베이스에 접근해볼것이다.

JDBC를 이용하기 위해서는 몇가지 라이브러리가 필요하다. 

 

 

mvnrepository에서 Spring JDBC를 검색하여 Maven코드를 추가해주었다. Spring버전과 일치하는 라이브러리를 사용하는것이 좋다. Spring버전과 일치하는 5.2.5 버전을 사용하였다.

 

 

 

Java에서 jdbc를 사용하는것과 비슷하게 Mysql connector가 필요하다. 

자바에서는 직접 커넥터를 다운로드한다음 프로젝트 빌드에 라이브러리로써 추가해주었던 기억이 난다.

Spring에서 우리는 Maven을 사용하기 때문에 아주 간편하게 의존성만 추가해주면 커넥터를 사용할 수 있다.

 

 

 

DBCP를 사용할 것이다.

 

DBCP란?

데이터베이스와 연결하는 커넥션을 미리 설정해두고 풀에 저장해두었다가 필요할때 꺼내쓰고 사용 후에는 다시 풀에 반환하는 기법을 말한다.

 

 

https://leminity.tistory.com/20#rp

 

jdbc, dbcp 차이?

오늘 일과중에 예전에 학원에서 같이 교육받았던 동생한테서 연락이 와서 이런 저런 얘기를 나누다가 요즘은 뭐 배우고 있냐고 물었더니, JDBC랑 DBCP를 배웠는데 갑자기 DBCP가 더 빠르다고 말한다. 왠지 어감이..

leminity.tistory.com

JDBC와 DBCP의 프로세서에 대해 너무 쉽게 잘 표현해주셔서 이 블로그를 참고하여 이해하였다...

커넥터를 손쉽게 관리하기 위하여 DBCP를 사용한다고 보면 되겠다.

 

 

 

pom.xml에 다음과 같이 dependency를 추가해주었다. version관리를 위해 property로 따로 버전을 빼주었다.

 

 

이제 데이터베이스와의 연동을 위한 코드를 작성할 것이다.

그 전에 미리 데이터베이스와 테이블을 만들어 놓겠다. 만들어준 테이블의 필드 속성에 맞추어서 자바코드를 작성할 예정이다.

데이터베이스는 MySQL을 사용하였고, MySQL Workbench를 이용하여 쿼리문을 작성하였다. 

사용할 필드는 data1(int형), data2(String형). 

 

 

그리고 위의 데이터 타입과 똑같은 데이터를 자바에서도 활용하기 위해서 VO클래스도 만들어주었고, 빈으로 등록했다.

 

 

 

 

 

 

 

 

 

1. 자바 설정파일

 

 

POJO클래스와 DAO클래스를 @Component를 사용하여 빈으로 등록할것이기 때문에 @ComponentScan을 이용하여 다음과 같이 해당 패키지를 스캔하도록 등록하였다.

 

먼저, BasicDataSource클래스의 source메소드를 한개 만들었다.

이 클래스는 위에서 추가해준 라이브러리의 DBCP패키지에 있는 클래스로, 커넥션풀을 관리할 수 있다. 위와같이 setter를 이용하여 Driver와 Url, Username, Password를 설정할 수 있다. 셋팅해준 속성을 리턴해준다.

 

둘째로, JdbcTemplate클래스의 db메소드를 만들었다.

이 클래스는 위에서 추가해준 라이브러리의 jdbc패키지에 있는 클래스이다. 위에서 만든 source메소드를 매개변수로 받아준다. 위와같이 BasicDataSource source로 매개변수를 받으면 빈으로 등록되어 있던 source메소드가 자동으로 매개변수로 들어가게 된다. 그 후, JdbcTemplate 클래스 변수를 만들어서 리턴해준다. 

이제 저 db변수를 사용함으로써 우리는 데이터베이스 커넥션 풀을 얻을 수 있게 되었고, 연결된 커넥션을 활용하여 데이터를 삽입, 삭제, 수정, 조회할 수 있게 된다.

 

 

 

 

 

 

 

 

 

 

2. DAO클래스 (insert, delete, update)

 

 

JdbcDAO라는 이름으로 클래스를 만든다. 우선 insert, update, delete 부터 살펴보자.

설정파일에서 커넥션풀을 함께 가진 JdbcTemplate db를 빈으로 등록해주었었다.

@Autowired하여 타입으로써 해당 빈을 가져와 사용한다.

 

insert, update 메소드는 VO(생각해보니 여기서는 데이터베이스에 접근하는 객체여서 DTO가 더 어울리는것 같다...)를 매개변수로 받아서 입력한 데이터를 데이터베이스에 insert한다.

update메소드를 사용하여 쿼리문을 삽입해준다. 이는 insert, update, delete에 공통적으로 사용한다.

쿼리문에서 ?는 사용자가 직접 넣어주어야한다. update메소드의 매개변수가 ?에 1:1대응으로 삽입된다.

insert문의 첫번째 ?는 bean.getData1(), 두번째 ?는 bean.getData2()가 들어간다.

 

자바 jdbc에서는 insert문을 넣어줄 때, PreparedStatement를 사용해서 인덱스에 대응되는 값을 한개씩 넣어주는 작업을 거쳐야 했다... 그런데 Spring Jdbc에서는 이 작업을 생략해도 알아서 1:1대응으로 삽입시켜준다.

 

delete 메소드는 int형 변수를 매개변수로 받았다. 입력하는 값이 data1의 값과 일치하면 삭제할 수 있도록 하려고 만들어 보았다.

 

 

 

main 클래스이다.

JdbcDAO 클래스를 getBean하여 가져온다. VO는 객체를 만들어서 필요한 것에 넣어주었다.

delete는 data1이 1이면 삭제할 수 있도록 1을 매개변수로 넣었다.

모두 성공적으로 동작함을 확인하였다.

 

 

 

 

 

 

 

 

 

3. select

 

select 를 따로 뺀이유는 Mapper클래스를 사용하기 때문이다.

데이터베이스 테이블의 Row가 한개라면 그냥 가져와도 상관이 없겠지만, 만약 Row가 여러개이고 그 Row의 다양한 type의 데이터가 들어가 있다면 한번에 가져오는데에 무리가 있을 것이다.

Java Jdbc를 사용하여 db를 연결할때 우리는 List형을 사용하여 Row를 담아서 사용하였다. Spring도 다를건 없다.

 

select문을 사용하여 데이터를 가지고 올때 어떤 칼럼의 값을 어느 bean에 주입할 것인지 결정해 주어야 하는데 이 역할을 하는 클래스를 Mapper클래스라고 부른다.

 

 

 

MapperClass를 다음과 같이 정의하였다. MapperClass는 SpringFramework에서 제공하는 RowMapper<T>인터페이스를 구현하여 작성한다. mapRow라는 메소드를 오버라이딩하여 작성한다. VO 객체를 만들어서 그 객체의 setter를 이용하여 데이터를 담아주었다.

Java Jdbc에서 우리는 Select문을 이용할 때, ResultSet을 이용하여 해당 Row에 데이터를 담았던것을 기억한다.

코드만 살짝 다를 뿐. 전체적 개념은 비슷하다는 것을 알 수 있었다.

매번 ResultSet을 이용하여 Row를 담는 작업을 줄여서 MapperClass에 담아 놓고 이 MapperClass를 활용해서 Select하는 것이다..

 

 

 

select부분을 추가하였다.

아까 말한것 처럼 Row가 여러개면 List의 형태로 담아서 활용한다. JdbcVO를 제네릭으로 받는 List형태의 select메소드를 만들었다. select는 다른 작업과 다르게 update()가 아닌 query()를 사용한다.

위에서 만들었던 MapperClass를 빈으로 등록하여 그 빈객체를 query메소드의 매개변수로 받는다. 이렇게 하면 MapperClass에서 했던 mapRow의 작업을 해당 select문에서 적용할 수 있는 것이다.

 

 

 

반환형이 List<JdbcVO> 이었으니까 위와 같이 하면 모든 Row의 값을 select 할 수 있을 것이다.

 

 

 

 

 

'JAVA > Spring' 카테고리의 다른 글

Spring WebSocket에 대한 내용 정리  (0) 2020.06.11
MyBatis  (0) 2020.04.21
@AspectJ 어노테이션  (0) 2020.04.17
execution 명시자  (0) 2020.04.17
AOP  (0) 2020.04.17

+ Recent posts