계속해서 JSP 했던 것들 복습!!을 하니 주말이 끝나버렸네요!! 이게무슨일이야...
주말 하루만 더 주시면 감사하겠습니다.
그래도 정리하면서 수업시간에는 무의식적으로 했던 내용들을 천천히 복기하면서 그래도 조금 이해가 잘 되는 것 같습니다. 계속 반복하면 이제 100%가 되지않을까요?..?아닌가요?
오늘은 개념적인 내용도 많지만 코드를 직접 천천히 적어가면서 작업의 순서를 생각하면서 진행 해보았습니다.
바로 시작하겠습니다.
JDBC를 통해서 update구문 연습해보기
updateForm 연습
<%
// 앞써 사용한 inserform의 이름과 나이가 있는 데이터를 update를 통해 나이를 수정해봅시다.
%>
<h1>Update</h1>
<form action="updatePro.jsp" method="post">
<table border="1">
<tr>
<th>이름</th>
<td><input type="text" name="name"></td>
</tr>
<tr>
<th>나이</th>
<td><input type="text" name="age"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="전송">
</td>
</tr>
</table>
</form>
updatePro 연습
<%
request.setCharacterEncoding("UTF-8");
//post의 경우에는 한글이 깨짐으로 setCharacer를 선언해줍니다.
%>
<%
//이전의 페이지의 값을 불러옵니다. 불러오 데이터를 변수안으로 넣습니다.
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
// DB 연결에서 사용될 데이터들을 변수 안으로 미리 넣어줍니다.
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/study_jsp2";
String user = "root";
String password = "1234";
%>
<%
// JDBC 연결 1단계 드라이버 로드
Class.forName(driver);
System.out.println("드라이버 로드 성공");
// 2단계 DB 연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DB연결");
// 3단계 구문작성 및 전달
String sql = "UPDATE test1 SET age= ? WHERE name = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, 40);
pstmt.setString(2, "김태희");
System.out.println("구문 작성 완료");
// 4단계 구문 실행
int updateCount = pstmt.executeUpdate();
pstmt.close();
con.close();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>이름 : <%=name %></h3>
<h3>나이 : <%=age %></h3>
<% if(updateCount > 0) {%>
<h3>구문 실행성공</h3>
<%} else { %>
<h3> 구문 실행 실패</h3>
<% }%>
</body>
body에 값을 출력하게 하여 값들이 잘 넘어 왔는지 체크해줍시다.
JDBC를통해 Select구문 실행 및 출력 해보기
<body>
<h1>select.jsp</h1>
<%
// 앞서 만든 데이터베이스를 SELECT문을 이용해서 출력해서 볼수있도록 해봅시다.
// 입력해서 등록된 DB에서 값을 불러오기 때문에 바로 연결해줍시다.
// 드라이버 로드에 필요한 변수 값들을 미리 선언해줍니다.
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/study_jsp2";
String user = "root";
String password = "1234";
// 1단계 드라이버 로드
Class.forName(driver);
System.out.println("드라이버 로드 성공");
// 2단계 DB 연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DB연결");
// 3단계 구문 작성 및 전달
String sql = "SELECT * FROM test1";
PreparedStatement pstmt = con.prepareStatement(sql);
System.out.println("구문 작성 완료");
// 4단계 구문 실행
%>
<table border ="2">
<tr>
<th>이름</th> <th>나이</th> <th>성별</th> <th>취미</th>
</tr>
<%
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
String name = rs.getString("name"); //getString(column label)
int age = rs.getInt(2); //getInt(column index)
String gender = rs.getString(3);
String hobby = rs.getString(4);
%>
<tr>
<td><%=name %></td> <td><%=age %></td> <td><%=gender %></td> <td><%=hobby %></td>
</tr>
<%
}
rs.close();
pstmt.close();
con.close();
%>
</table>
</body>
Select 구문의 경우 실행문을 할 때 Reulstset과 excuteQuery를 이용하여 ResultSet타입의 반환 값으로 결과 값을 저장할 수 있습니다.
이때 저장된 결과 값을 한 행 단위로 불러오는데 이를 while문과 조건식을 .next()메소드를 통해서 선택되는 행을 바꿔가면서 불러와야할 값들 여러 개 일 경우에 활용할 수 있습니다.
(next()메소드의 경우는 boolean 타입입니다.)
이후 get타입 메소드를 통해서 값을 불러옵니다.
get타입 메소드의 경우 column 레이블 명으로 값을 받거나 컬럼의 인덱스 즉 순서 값으로 argument를 받습니다.
getString(column label) / getInt(column index)
JDBC DAO, DTO
DAO (Data access object) : SQL문을 보내는 여러개의 객체들을 하나로 통합해 DB에 접근하는 방식입니다.
DTO (Data Transfer Object) :
데이터를 주고 받을 때 쓰이는 객체 테이블 칼럼을 멤버변수화 시키고 getter & setter를 통해 접근하도록 합니다.
이제 DAO DTO를 사용해봅시다.
준비물 : testForm, testPro, test_select, testDAO, DTO
testform으로 입력된 값을 데이터베이스에 insert하고 조건에 맞는 값을 조회하는 test_select을 만들어 DAO, DTO를 연습해보았습니다.
이해가 잘 안될때는 자료 흐름도를 통해서 순서를 잘 이해하고 진행하는게 도움이 많이 되는것 같습니다.
참고 : 자료흐름도 만들기
testForm
testForm의 경우 번호와 이름만 입력받도록 하였습니다.
<h1>testForm</h1>
<form action="testPro.jsp" method="post">
<table border="2">
<tr><th>번호</th> <td><input type="text" name="idx"></td></tr>
<tr><th>이름</th> <td><input type="text" name="name"></td></tr>
<tr><td colspan="2"><input type="submit" value="전송"></td></tr>
</table>
</form>
testPro
<%
// post 방식임으로 차셋을 바꿔줍니다.
request.setCharacterEncoding("UTF-8");
int idx = Integer.parseInt(request.getParameter("idx"));
String name = request.getParameter("name");
//TestDTO 클래스의 인스턴ㄴ스를 생성한후 setter메서드를 호출하여 데이터를 저장합니다.
TestDTO dto = new TestDTO();
dto.setIdx(idx);
dto.setName(name);
TestDAO dao = new TestDAO();
int insertCount = dao.insert(dto);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>testPro.jsp</title>
</head>
<body>
<h3>번호 : <%=dto.getIdx() %></h3>
<h3>이름 : <%=dto.getName() %></h3>
<button onclick="location.href='test_Select.jsp?idx=<%=dto.getIdx() %>'">회원 정보 확인</button>
</body>
버튼 클릭시 하이퍼링크를 이동할때 값을 같이 전달하고자 할 경우에는 ? 를 이용합니다!
TestDTO
public class TestDTO {
// 데이터를 저장하는 주고 받을 때 사용하는 TestDTO를 만들어 줍니다.
/*
* 데이터를 저장할 인스턴스 멤머변수, DB 테이블의 칼럼의이름, 타입의 수 만큼 선언합니다.
* 이 경우에는 2개를 선언합니다.
* 멤버변수에 접근할 Getter/Setter를 선언해줍니다.
* Getter/Setter 빨리 만들기는 Alt + shift + s -> r 입니다.
*/
private int idx;
private String name;
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Test DAO
public class TestDAO {
public int insert(TestDTO dto) throws Exception{
// DB 설정을 위한 값들을 변수에 입력
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/study_jsp2";
String user = "root";
String password = "1234";
// 1단계 드라이버 로드
Class.forName(driver);
System.out.println("드라이버 로드");
//2단계 DB연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DB 연결 성공");
//3단계 구문 작성 및 전달
String sql = "INSERT INTO test2 VALUES(?, ?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, dto.getIdx());
pstmt.setString(2, dto.getName());
System.out.println("구문작성 성공");
//4단계
int insertCount = pstmt.executeUpdate();
System.out.println("insert 작업 " + insertCount + "개 성공");
pstmt.close();
con.close();
return insertCount;
}
public TestDTO selectInfo(int idx) throws Exception {
TestDTO dto = null;
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/study_jsp2";
String user = "root";
String password = "1234";
// 1단계 드라이버 로드
Class.forName(driver);
System.out.println("드라이버 로드");
//2단계 DB연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DB 연결 성공");
//3단계 구문 작성
String sql = "SELECT * FROM test2 WHERE idx=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, idx);
//4단계 구문실행
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
dto = new TestDTO();
dto.setIdx(rs.getInt("idx"));
dto.setName(rs.getString("name"));
}
rs.close();
pstmt.close();
con.close();
return dto;
}
}
test_select
<%
int idx = Integer.parseInt(request.getParameter("idx"));
TestDAO dao = new TestDAO();
//dao 의 값을 불러와야 하기 떄문에 새로운 dao 인스턴스 생성
TestDTO dto = dao.selectInfo(idx);
// dto의 경우 testDAO에서 인스턴스를 만들어놨음!
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>test_select</h1>
<h2>번호 : <%=dto.getIdx() %></h2>
<h2>이름 : <%=dto.getName() %></h2>
</body>
</html>
여러 파일들이 유기적으로 연결되어있고 그 페이지수가 점점 많아지는 것 같습니다.
수업시간에는 배우기 급급해서 충분한 시간이 없을 수도 있지만 복습을 할 때는 자료흐름도를 구상하면서 충분히 흐름에 대해 생각하면서 진행하니깐 도움이 많이 되는 것 같습니다.
처음에는 저도 이해가 잘 안되었는데 오늘 하고나니깐 조금 손맛(?) 정도는 온 것 같습니다. 시간 날때마다 반복해봅시다!
'개인 공부 > TIL' 카테고리의 다른 글
TIL #220524 #JSP #JAVA (0) | 2022.05.24 |
---|---|
TIL #220523 #JSP #JAVA (0) | 2022.05.23 |
TIL #220521 #JSP (6) | 2022.05.22 |
TIL #220520 #JSP #DB (0) | 2022.05.20 |
TIL #220519 #DB #WEB (0) | 2022.05.19 |