테이블도 만들었고 테스트로 홍길동도 넣어 뒀으니깐 드디어 JSP에 개발을 해보자. 근데 조회만 하자...
1. 목표
Tomcat에는 이미 olDevStudy 프로젝트가 배포(Add and Remove) 되어 있으니깐 Tomcat Start 하고 http://localhost:800/으로 접속하면 index.jsp 화면이 보인다.
index.jsp Submit 버튼을 통해 페이지를 이동하고 이동한 페이지(userSample.jsp)에 홍길동을 조회하고 출력해보자.
2. DB Driver 다운로드
Table을 생성하고 Insert 하고 Select 했던 것은 HeidSql라는 DB Tool을 이용해 접속했던 것이고 JSP, JAVA에서 SQL을 수행하려면 해당 DataBase의 Driver 설정을 해주어야 한다. JAVA는 지금 MariaDB라는게 있는지 모른다.
MariaDB를 사용하니 MariaDB Driver를 추가할 것이고 Oracle, DB2 등 다른 DB는 그에 맞게 검색해서 넣어주면 된다.
다운로드 사이트 : https://mariadb.com/kb/en/about-mariadb-connector-j/
About MariaDB Connector/J
LGPL-licensed MariaDB client library for Java applications.
mariadb.com


다운로드한 mariadb-java-client-2.7.0.jar 파일을 WEB-INF/lib 폴더 밑으로 복사하면 끝난다.
이건 뭐.. 그냥 파일만 넣기만 하면 되는 거니...
3. DB Connection
DB Driver도 추가했고 JSP나 JAVA에서 요놈을 실제로 활용할 DB 연결자를 만들어한다.
보통 디비 컨넥션이 끊겼어요 붙었어요 컨넥션을 못 받아요 하는 것들은 우리가 생성할 연결자와 끊겼거나 못 붙는다는 건데 이걸 직접 코딩하려면 참 머리 아프겠다. 그래서 java에서 어떤 DB에 연결할건지 설정할 수 있는 Class를 제공하는데 이 Class 활용해 연결을 해보자.
java.sql package의 Connection, DriverManager를 활용할텐데 구현 자체는 매우 간단하다. 그리고 SQLException도 사용할 것이다. java.sql package가 오류 나면 뭘 주겠는가? 당연히 SQLException 지... 그래서 Exception도 미리 Inport 해두자.
소스코드 :
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.SQLException" %>
<%
Connection dbConn = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
dbConn = DriverManager.getConnection(
"jdbc:mariadb://127.0.0.1:3306/oldev"
, "olDev"
, "olDev@1234"
);
System.out.println("############## 여기도 찍어보자 " + dbConn.toString());
%>
<%="################## 객체가 생성되나? "+dbConn.toString()%><br/>
<%
} catch (SQLException e) {
e.printStackTrace();
}
%>
<body>
요기에 로그인, 회원가입 같은거 만들어봐야징 으흐흐흐흐
</body>
소스코드처럼 구현 자체는 별게 없다.
java.sql package에서 몇 가지 정보만 넣으면 DB에 Connection을 맺을 수 있게 만들어져 있다. (pool 설정이나 validate 등 뭐 옵션 주려면 줄 수도 있겠지만... 기본만... 알고 넘어가자..)
설정 정보를 넣어야 하는 것들을 살펴보면
- Class.forName(String className)
누가 봐도 클래스 찾겠다는 거다.
근데 특이하게도 클래스의 이름만 적어준 게 아니라.(점)이 몇 개 찍혀있다? 다운로드한 mariadbxxxx.jar를 압축 프로그램으로 압축을 풀어보면 org.mariadb.jdbc.Driver.class가 있다.
즉 이 클래스의 절대 경로를 준거라 생각하면 되겠다. 어? 그럼 C:/... 어딧음? 이렇게 생각들 수도 있겠는데 WEB-INF/lib에 넣어두면 Tomcat Server로부터 찾는다.
만약 다른 DB라면 그 DB의 클래스 찾아서 넣어주면 된다. 근데 org. <요기만 바뀐다>. jdbc.Driver.class
- DriverManager.getConnection(String url, String userId. String password)
위에서 클래스를 로드했으니깐 우리 DB서버의 위치(url)도 알려주고 개발환경 설정 때 설정해둔 ID, PW를 넣어주자.
URL이 독특한데 누가 봐도 이거 keyword 아닌가? jdbc:mariadb:// 까지가 고정이고 입력부분을 보면 jdbc:mariadb://<DB IP>:<DB Port>/<DB Name> 이따구로 생겼다.
DB IP : 데이터 베이스가 위치한 IP 입력 (로컬이니깐 127.0.0.1)
DB Port : 특별히 변경하지 않았다면 3306 Port가 기본인데 변경했다면 변경한 Port
DB Name : DB 설정 때 생성해준 DB 이름이다. (oldev로 생성했으니 넣어줌. 새로 또 만들고 붙으려면 그거 넣음 됨)
결국 아이피, 포트, 이름 내가 환경 설정한 정보 넣어주면 된다는 거다. &xxx=xxx?xxx=xxx 으로 옵션을 줄수도 있지만 앞서 얘기한대로 우선 기본만 알자.. 기본만 ..ㅎㅎ;;
DB Connection이라는 게 java.sql package에 잘 정의되었기 때문에 갖다 쓰면 뭐.. 문제가 생길 게 없다고 보면 될 것 같다. network 불안정해서 timeout이나 뭐 Connection Pool 꽉차거나 등등 해서 SQLException이 발생하긴함. (근데 이게 Connection 코딩의 문제는 아니잖음?)
DB Connection은 이렇게 코딩하는구나 알았으니 저 구문에서 스크립트릿을 잠시 보자 <%%> 표현과 <%=%> 표현이 있는데 <%%> 코딩하는 영역이고 <%=%> 출력하는 영역이다.
<%%> 표현중 System.out.println()은 Eclipse console에 노출되고 <%=%> 표현은 화면에 바로 노출된다.
<%=%> 표현은 javascript에서 로그 찍는 console.log() 정도로 이해하면 되겠다.
그리고 특히 하게 <%%> <%=%> <%%> 이렇게 반복되는데 스크립트릿으로 표현하고 닫고 다시 표현하고 하는 건 <% 요기서 %> 요기까지는 쌩 java 코딩이야 까묵지말고 컴파일하라고 알려주는 건데 JSP가 컴파일될 때 가장 먼저 컴파일해주는 게 스크립트릿이다.
스크립트릿, jstl 등등을 함께 사용하면 JSP 컴파일 시 선순위 우선 컴파일하게 되고 선순위 애들은 후순위 애들 꺼 쓸수없다. (후순위에 뭐가 있는지 어찌알고 쓰겠는가? 너무 당여하지 않나?)
뭐 그렇다는 거고 이 정도만 알고 또 넘어가자 섞어서 코딩을 하게 될 때 다시 찾으면 되고 사실 요즘 누가 스크립트릿을 사용하나?;;
4. Statement와 ResultSet
소스코드 :
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.sql.ResultSet" %>
<body>
<%
Connection dbConn = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
dbConn = DriverManager.getConnection(
"jdbc:mariadb://127.0.0.1:3306/oldev"
, "olDev"
, "olDev@1234"
);
Statement stmt = dbConn.createStatement();
String sqlStr = "";
sqlStr += "SELECT MBER_SN ";
sqlStr += " , MBER_ID ";
sqlStr += " , MBER_PWD ";
sqlStr += " , MBER_NM ";
sqlStr += " , MBER_MOBLPHON ";
sqlStr += " , RM ";
sqlStr += " , REGIST_SN ";
sqlStr += " , REGT_DTTM ";
sqlStr += " , UPDT_SN ";
sqlStr += " , UPDT_DTTM ";
sqlStr += " FROM OD_MBER ";
sqlStr += " WHERE MBER_SN = '1' ";
ResultSet resultSet = stmt.executeQuery(sqlStr);
while(resultSet.next()) {
String mberSn = resultSet.getString("MBER_SN");
String mberId = resultSet.getString("MBER_ID");
String mberPwd = resultSet.getString("MBER_PWD");
String mberNm = resultSet.getString("MBER_NM");
%>
<table style="border:1px solid blue;">
<tr>
<td style="border:1px solid blue;">회원 일련번호</td>
<td style="border:1px solid blue;">회원 아이디</td>
<td style="border:1px solid blue;">회원 비밀번호</td>
<td style="border:1px solid blue;">회원 이름</td>
</tr>
<tr>
<td style="border:1px solid blue;"><%=mberSn%></td>
<td style="border:1px solid blue;"><%=mberId%></td>
<td style="border:1px solid blue;"><%=mberPwd%></td>
<td style="border:1px solid blue;"><%=mberNm%></td>
</tr>
</table>
<%
}
} catch (SQLException e) {
e.printStackTrace();
}
%>
</body>
조회를 하기 위해서 java.sql package의 Statement와 ResultSet 객체를 import 하자.
- Statement
Statement는 Statement 객체와 PreparedStatement 객체가 있는데 각 차이는 정적이냐 동적이냐의 뭐 이런 차이고 소스코드처럼 어차피 조회할 거 조건을 때려 박았다면 고정인데 굳이... 그냥 쓰면 되지..라고 생각하면 안되고 화면으로부터 N건의 데이터를 처리해야 한다고 가정하면 Statement 객체는 매번 SQL을 새로 수행하게 되고는 반면 PreparedStatement객체는 수행될 SQL을 로드해둔 상태에서 bind variable만 변경해서 사용할 수 있게 제공한다.
매번 새로 수행하는 거랑 값만 바꾸는 거랑 뭐가 더 효율이 좋겠는가? 당연히 후자 아닌가? 그래서 PreparedStatement 객체를 주로 쓰게 되는데 이런것도 있구나 정도로 한 번쯤 보는게 어떨까 싶다. ㅎㅎ
Statement 객체든 PreparedStatement 객체든 SQL을 수행하도록 하는 메서드들이 있는데 그중 하나인 excuteQuery 메서드를 사용한 것이고 excuteUpdate() 메서드와 같은 insert, update, delete 작업 시 사용하는 메서드도 있다. 차차 필요할 때 찾아서 사용해보자.
- ResultSet
SQL 수행 결과라고 생각하면 되는데 SQL이 수행되면 그 SQL의 결과를 ResultSet 객체로 Return 해주게 된다.
소스코드처럼 조회했으면 조회된 전체 Rows와 해당 Row의 칼럼에 값이 채워져 오게 되고 ResultSet.getString() 이따구로 바로 접근은 되지 않는다.
반복문에서 ResultSet.next() 메서드를 통해 반드시 Row가 존재하는지 확인 후 결과를 받아 올 수 있다.
ResultSet 객체는 ResultSetMetaData 같은 뭔가 중요해 보이는 객체도 꺼내 쓸 수 있는데 이런 것들은 난중에 알아가고 지금은 SQL 수행 결과를 담는 객체 정도만 이해하자.
Statement, ResultSet의 상세한 내용이 궁금하다면 아래 사이트에서 확인 하자.
Java Package java.sql : https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html
Java Platform SE 8
docs.oracle.com
요기 내용에서 중요한게 JSP만으로 어지간한건 다 될 것 같다는거다. 그럼 뭐하러 요즘은 죄다 3Tier MVC인가는 JSP로 좀 더 놀고(?) 알아보자
목표 잡은대로 조회를 해보았는데 사실 뭐 너무 간단한 거라 눈요기도 안될 것 같지만... 아무튼 그래도 했다.
다음엔 등록, 수정, 삭제 뭐 이런 것들 맨들어야지 ㅎ
'JAVA_JSP' 카테고리의 다른 글
| 초보의 JSP 개발 데이터 수정, 삭제 (0) | 2020.11.13 |
|---|---|
| 초보의 JSP 개발 데이터 등록 (0) | 2020.11.12 |
| 초보의 JSP 개발 DB Table 생성 (0) | 2020.11.10 |
| 초보의 JSP 개발 JSP Servlet 비교 (0) | 2020.11.09 |
| 초보의 JSP 개발 프로젝트 생성 (0) | 2020.11.06 |
댓글