Java와 DB를 연결하는 코드를 보며 해당 코드들이 어떠한 역할을 하는지 분석
주어진 조건
userinfo key에 insert 하려하는 MemberDto형 value가 저장되어 있음
dbUtil 파일 내 getConnection()는 jdbc.jar 파일 build path하는 메서드
SQL 구성
guestbook 테이블에 userid, subject, content, regtime 총 네개의 Column을 가지고 있음
- 각각의
Column은 String 타입을 가짐
Servlet 코드
HttpSession session = request.getSession();
MemberDto memberDto = (MemberDto) session.getAttribute("userinfo");
if(memberDto != null) {
String userid = memberDto.getUserId();
String subject = memberDto.getUserSubject();
String content = memberDto.getUserContent();
Connection conn = null;
PreparedStatement pstmt = null;
int cnt = 0;
try {
conn = dbUtil.getConnection();
String sql = "";
sql += "insert into guestbook (userid, subject, content, regtime) \n";
sql += "values (?, ?, ?, now())";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, userid);
pstmt.setString(2, subject);
pstmt.setString(3, content);
cnt = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
dbUtil.close(pstmt, conn);
}
return (cnt != 0 ? "/success.jsp" : "/fail.jsp");
} else
return ("/index.jsp");
해석
HttpSession session = request.getSession();
MemberDto memberDto = (MemberDto) session.getAttribute("userinfo");
Servlet은 request로부터 HttpSession 객체를 제공받음
getSession()은 현재 HttpSession이 존재하면 HttpSession을 반환하고 존재하지 않으면 새로 세션을 생성
- 현재
session에 userinfo 이름을 가진 key값에 저장된 value 를 형변환하여 memberDto 변수에 저장
String userid = memberDto.getUserId();
String subject = memberDto.getUserSubject();
String content = memberDto.getUserContent();
memberDto 객체에 저장된 userid, subject, content 를 각 변수에 저장
Connection conn = null;
PreparedStatement pstmt = null;
- 데이터베이스와 연결하는 인터페이스
Connection 선언
Statement를 상속받는 인터페이스로, SQL구문을 실행시키는 기능을 가진 객체인 PreparedStatement 선언
conn = dbUtil.getConnection();
String sql = "";
sql += "insert into guestbook (userid, subject, content, regtime) \n";
sql += "values (?, ?, ?, now())";
pstmt = conn.prepareStatement(sql);
conn 변수에 Connection 객체 연결
String 타입 변수에 실행하고자 하는 sql 삽입
sql에 들어갈 매개변수는 ? 로 표기
pstmt 에 sql 문을 삽입함으로, sql문이 pstmt 라는 객체로 만들어짐
pstmt.setString(1, userid);
pstmt.setString(2, subject);
pstmt.setString(3, content);
cnt = pstmt.executeUpdate();
pstmt 에 삽입한 sql 의 몇번째 물음표에 어떤값을 집어넣는지 명시
- 인덱스가 1부터 시작함
select 는 executeQuery를 사용
insert, update, delete 는 executeUpdate를 사용
dbUtil.close(pstmt, conn);
pstmt, conn 이 열려있다면 닫기
- 연결을 닫을때는 가장 최근에 만들어진 것부터 닫아야 함
select 일때
- 결과집합객체를 받기 위한
ResultSet가 추가
executeUpdate() 가 아닌 executeQuery()를 통해 ResultSet 타입으로 선언한 변수에 삽입
- 조회된 행열 데이터를 얻기위해
(변수).next()를 통해 하나씩 행을 얻을수 있음