이제 어떻게 보면 웹 개발자가 하는 일들의 기본적인 부분들을 어느정도 배웠다. 사용자가 접근할 페이지를 만들고 사용자의 요청에 따라 데이터를 처리하고 그에 따라 반응할 수 있도록 프로그램을 만들고 그리고 그 프로그램을 위해 필요한 데이터를 저장하도록 DB에 접근하는 과정까지, 오늘은 DB와 연동하는걸 정리해 보려 한다.
1) 사용자의 요청과 함께 보내온 데이터를 getParameter를 통해 받아오고 변수에 담았다.
2) 그리고 자바와 DB를 연결하기위해 필요한 드라이버를 WEB-INF/lib/ 안에 넣고 그 경로의 드라이버를 지금 사용하는 자바 클래스에서 사용하도록 Class.forName으로 설정한다.
3) 그리고 등록된 드라이버를 내가 사용하는 DB와 연결하는 커넥션을 DriverManager.getConnection(DB url, DB 아이디, DB 패스워드)를 통해 생성해준다. 그리고 그 커넥션을 Connection클래스 변수에 담고 DB와 접근시 발생하는 AutoCommit 에러를 해결하기 위해 setAutocommit을 false로 설정한다.
4) 그리고 연결된 커넥션에 sql을 전달할 종이, 워크시트를 만들어주는 prepareStatement 메소드를 사용해서 sql을 전달한다. Statement는 사용자가 요청한 데이터를 집어넣어 sql 쿼리문을 작성하기 번거롭고, 보안상 문제가 발생할 수 있어서 잘 사용하지 않고, prepareStatement를 사용한다. prepareStatement에 쿼리문을 전달할 때 ?를 사용해서 만들 불완전한 sql문을 사용하고, 담은 후에 setXXX 메소드를 사용해서 ?의 들어갈 값을 나중에 셋팅해줄 수 있다.
5) 전달한 sql을 PreparedStatement 클래스 변수에 담았으면 불완전했던 sql문을 완성시키기 위해 setString(? index, ?에 넣을 값)을 사용한다.
6) 그리고 쿼리문을 실행하는 executeXXX 메소드를 사용한다. 여기서 sql쿼리문은 위에서 prepareStatement의 매개변수로 이미 받았으니 execute 메소드에 따로 매개변수에 sql 쿼리문을 담을 필요가 없다. executeXXX 메소드들은 쿼리문을 실행한다는 점은 같지만, 차이점으로는 execute() 는 반환형이 boolean으로 쿼리문 실행이 됐다면 true, 실패했다면 false를 반환하고 executeQuery() 는 반환형이 ResultSet으로 쿼리문 실행에 따른 결과를 가져올때 사용한다.(SELECT문 사용시), executeUpdate() 는 반환형이 int로 쿼리문을 실행하고 쿼리문 실행 결과에 따라 반영된 행의 개수를 반환해준다.
7) 그리고 sql에 접근을 하고 꼭 성공시 commit 실패시 rollback 그리고 자바와 DB 연결을 닫아주는 close 메소드를 작성해주어야한다. 아래 이미지에 주석처리된 rollback, close 메소드를 보면 모두 예외 발생을 처리하기 위한 try - catch문으로 작성해야 해서 코드의 가독성이 좋지 않고 작성하기도 번거롭다. 매 요청에 대해 데이터를 처리하고 DB에 접근하는 servlet을 만들 때마다 저 작업을 반복해줘야하기때문에 모든 servlet이 DB 접근시 사용할 수 있는 commit, rollback, close 메소드를 미리 만들어 놓은 자바 클래스를 생성해서 사용이 필요한 servlet에서 import해주면 주석처리 밑의 메소드들 처럼 깔끔한 처리가 가능하다.
- 더 깔끔한 코드 사용을 위해 import문에 static을 붙이고 뒤에 .*을 사용하면 좋다.
8) 실행 결과