JSP - 데이터베이스 연결 / JNDI / 데이터베이스 풀링

준동이·2023년 4월 24일
0

환경설정

개발 환경

Window(Mac) + JDK + apache-tomcat + eclipse(intellij)
개발환경에서 서비스 환경으로 => 배포

  • 배포
    수동배포
    자동배포

서비스 환경

Linux(Unix) + JDK + apache-tomcat



Java로 웹 프로그램을 할 수 있는 방법 2가지

1.Servlet - class
2.jsp -html유사
=> 나중에는 둘 다 사용한다.



웹 프로그램 실행환경

클라이언트(브라우저)와 서버가 있음
브라우저(요청, 렌더링) -> 요청 -> 서버(was)가 받음 <-> jsp / servlet
응답은 <- html <- 방향



JSP파일을 제작하려면

1.확장자는 jsp(.jsp)이여야 한다.

2.페이지 내부에서는 4가지 특수기호를 사용하여 코딩

<%@ : directive - jsp 페이지에 대한 설정 - (중요)
/*
directive에는
page - (language, contentType, pageEncoding, import(중요))
include
taglib 가 있다
*/

<%! : declaration - 멤버 필드, 메서드 선언 (많이 사용하지는 않음)
<%  : scriptlet - java 소스/ 안에 들어갈 수 있는것은 지역변수,제어문) - 중요
<%= : expression - out.println 대치



JSP나 Servlet은 java ee 형식( se가 아님 )
jdbc - java ee



외부에 있는 라이브러리 jdbc 쓰기 / 데이터베이스

jdbc 프로젝트 생성 후 lib에 마리아디비 api를 직접 넣어줌.

클래스 생성하여 연결 되는지 확인.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.sql.DriverManager" %>
    <%@ page import="java.sql.Connection" %>
    <%@ page import="java.sql.SQLException" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String url = "jdbc:mysql://localhost:3306/sample";
String user = "root";
String password = "123456";

Connection conn = null;

try {
Class.forName("org.mariadb.jdbc.Driver");
out.println("드라이버 로딩 성공<br>");

conn = DriverManager.getConnection(url, user, password);
out.println("데이터베이스 연결 성공<br>");
} catch(ClassNotFoundException e) {
	System.out.println("[에러] : " + e.getMessage());
} catch(SQLException e) {
	System.out.println("[에러] : " + e.getMessage());
} finally {
	if(conn != null) conn.close();
}
%>
</body>
</html>



dept 테이블 가져오기

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.sql.DriverManager" %>
    <%@ page import="java.sql.Connection" %>
    <%@ page import="java.sql.PreparedStatement" %>
    <%@ page import="java.sql.ResultSet" %>
    <%@ page import="java.sql.SQLException" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String url = "jdbc:mysql://localhost:3306/sample";
String user = "root";
String password = "123456";

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName("org.mariadb.jdbc.Driver");

conn = DriverManager.getConnection(url, user, password);

// preparestatment -> dept 테이블로 출력
String sql = "select * from dept";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();

out.println("<table width='800'>");

while(rs.next()) {
	out.println("<tr>");
	out.println("<td>" + rs.getString("deptno") + "</td>");
	out.println("<td>" + rs.getString("dname") + "</td>");
	out.println("<td>" + rs.getString("loc") + "</td>");
	out.println("</tr>");
}
out.println("</table>");

} catch(ClassNotFoundException e) {
	System.out.println("[에러] : " + e.getMessage());
} catch(SQLException e) {
	System.out.println("[에러] : " + e.getMessage());
} finally {
	if(rs != null) rs.close();
	if(pstmt != null) pstmt.close();
	if(conn != null) conn.close();
}
%>
</body>
</html>



StringBuilder로 선언부에서 처리하고 변수에 담아서 한번에 출력.

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.sql.DriverManager" %>
    <%@ page import="java.sql.Connection" %>
    <%@ page import="java.sql.PreparedStatement" %>
    <%@ page import="java.sql.ResultSet" %>
    <%@ page import="java.sql.SQLException" %>
    
<%
String url = "jdbc:mysql://localhost:3306/sample";
String user = "root";
String password = "123456";

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

StringBuilder sbHtml = new StringBuilder();

try {
Class.forName("org.mariadb.jdbc.Driver");

conn = DriverManager.getConnection(url, user, password);

// preparestatment -> dept 테이블로 출력
String sql = "select * from dept";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();

sbHtml.append("<table width='800'>");

while(rs.next()) {
	sbHtml.append("<tr>");
	sbHtml.append("<td>" + rs.getString("deptno") + "</td>");
	sbHtml.append("<td>" + rs.getString("dname") + "</td>");
	sbHtml.append("<td>" + rs.getString("loc") + "</td>");
	sbHtml.append("</tr>");
}
sbHtml.append("</table>");

} catch(ClassNotFoundException e) {
	sbHtml.append("[에러] : " + e.getMessage());
} catch(SQLException e) {
	sbHtml.append("[에러] : " + e.getMessage());
} finally {
	if(rs != null) rs.close();
	if(pstmt != null) pstmt.close();
	if(conn != null) conn.close();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=sbHtml %>
</body>
</html>



우편번호 검색기 웹버전으로 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>

<%
	request.setCharacterEncoding("utf-8");
	
	StringBuilder sbHtml = new StringBuilder();
	
	if(request.getParameter("dong") != null) {
		String strDong = request.getParameter("dong");
		
		String url = "jdbc:mysql://localhost:3306/project";
		String user = "project";
		String password = "1234";

		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			Class.forName("org.mariadb.jdbc.Driver");

			conn = DriverManager.getConnection(url, user, password);
			
			String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, strDong + "%");
			rs = pstmt.executeQuery();
			
			sbHtml.append("<table width='800' border='1'>");
			while(rs.next()) {
				sbHtml.append("<tr>");
				sbHtml.append("<td>" + rs.getString("zipcode") + "</td>");
				sbHtml.append("<td>" + rs.getString("sido") + "</td>");
				sbHtml.append("<td>" + rs.getString("gugun") + "</td>");
				sbHtml.append("<td>" + rs.getString("dong") + "</td>");
				sbHtml.append("<td>" + rs.getString("ri") + "</td>");
				sbHtml.append("<td>" + rs.getString("bunji") + "</td>");
				sbHtml.append("</tr>");
			}
			sbHtml.append("</table>");
		} catch(ClassNotFoundException e) {
			sbHtml.append("[에러] : " + e.getMessage());
		} catch(SQLException e) {
			sbHtml.append("[에러] : " + e.getMessage());
		} finally {
			if(rs != null) rs.close();
			if(pstmt != null) pstmt.close();
			if(conn != null) conn.close();
		}
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./zipcode.jsp" method="post" name="frm">
<fieldset>
<legend>우편번호 검색</legend>
<label for="dong">동이름 입력</label>
<input type="text" id="dong" name="dong" size="40" placeholder="동이름 입력">
<input type="button" id="btn" value="우편번호 검색">
</fieldset>
</form>
<%=sbHtml %>
</body>
</html>



JNDI

JNDI(Java Naming and Directory Interface)는 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup) 하기 위한 자바 API다

용도

자바 애플리케이션을 외부 디렉터리 서비스에 연결 (예: 주소 데이터베이스.. 등)

자바 애플릿이 호스팅 웹 컨테이너가 제공하는 구성 정보를 참고

=> 간단히 요약하자면 우리가 연결하고 싶은 데이터베이스의 DB Pool을 미리 Naming 시켜주는 방법 중 하나이다. 우리가 저장해놓은 WAS 의 데이터베이스 정보에 JNDI를 설정해 놓으면 웹 애플리케이션은 JNDI만 호출하면 간단해진다.



데이터베이스 풀링 - 미리 만들어놓은 접속

풀이 나오면 미리 만들어놓은 것을 쓴다는거라고 보면 됨
tomcat시작 - 풀링 -> JNDI -> 프로그램 접근
속도가 좀 더 나아진다.

풀링을 시작할 설정파일, JNDI 사용법 필요

파일명 잘 정해줘야함



name : JDBC의 이름이고 변경이 가능하다.

auth :컨테이너(서버, tomcat같은 것)를 자원 관리자로 쓸것이다.
(컨테이너 : JSP와 서블릿을 실행시킬 수 있는 소프트웨어를 웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container)라고 한다.)

type : 웹에서 이 리소스를 사용시 datasource로 리턴된다. / 리소스의 타입을 지정. Connection Pool을 사용할 수있도록 해주는 객체의 javax.sqlDataSource이다.

driverClassName : JDBC 드라이버

url : 접속 url

username : 접속계정(마리아db접속계정)

password : 마리아계정 비번설정했던것



아이디나 비밀번호 적는것을 안해도 된다. 보안에도 좋음.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>

<%@ page import="javax.sql.DataSource" %>

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.SQLException" %>

<%
Connection conn = null;

try {
// JNDI를 이용하기 위한 객체 생성
Context initCtx = new InitialContext();

// initCtx의 lookup메서드를 이용해서 "java:comp/env" 에 해당하는 객체를 찾아서 evnCtx에 삽입
// java:comp/env는 웹어플의 구성된 엔트리와 리소스들이 배치되어있는 부분.
// 그래서 이것에 접근을 하여 web.xml의 <resource-env-ref>에 설정한 jdbc/mysql과 매핑되는 리소스를 가져온다.
// lookup() : 등록된 naming 서비스로부터 자원을 찾고자할 때 사용하는 메서드
Context envCtx = (Context)initCtx.lookup("java:comp/env"); // 자바 실행환경

// 리소스를 찾은 후 리소스를 사용할 수 있도록 객체를 반환
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb1"); // 데이터 소스가 리턴

conn = dataSource.getConnection();
System.out.println("데이터베이스 연결 성공");
} catch(NamingException e) {
	System.out.println("[에러] : "  + e.getMessage());
} catch(SQLException e) {
	System.out.println("[에러] : "  + e.getMessage());
} finally {
	if(conn != null) conn.close();
}

conn.close();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

만약 실행했을 때 바인딩이 되지 않았다는 에러가 뜬다면 잘못쓴거임


프로젝트에 접속하고싶은 경우 이런식으로 작성하면 됨.
실행할때도 name에 맞춰서 실행하면 연결이 된다.



데이터베스에 연동하여 select로 dept테이블 확인

<?xml version="1.0" encoding="utf-8" ?>
<Context>
<Resource
name="jdbc/mariadb1"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.mariadb.jdbc.Driver"
url="jdbc:mysql://localhost:3306/sample"
username="root"
password="123456" />

<Resource
name="jdbc/mariadb2"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.mariadb.jdbc.Driver"
url="jdbc:mysql://localhost:3306/project"
username="project"
password="1234" />
</Context>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>

<%@ page import="javax.sql.DataSource" %>

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>

<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

try {
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup("java:comp/env"); // 자바 실행환경
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb1"); // 데이터 소스가 리턴

conn = dataSource.getConnection();

String sql = "select * from dept";
pstmt = conn.prepareStatement(sql);

rs = pstmt.executeQuery();

while(rs.next()) {
	System.out.println(rs.getString("deptno"));
}

} catch(NamingException e) {
	System.out.println("[에러] : "  + e.getMessage());
} catch(SQLException e) {
	System.out.println("[에러] : "  + e.getMessage());
} finally {
	if(rs != null) rs.close();
	if(pstmt != null) pstmt.close();
	if(conn != null) conn.close();
}

conn.close();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>



우편번호

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>

<%@ page import="javax.sql.DataSource" %>

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>

<%
request.setCharacterEncoding("utf-8");

StringBuilder sbHtml = new StringBuilder();

if(request.getParameter("dong") != null) {
	
String strDong = request.getParameter("dong");
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

try {
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup("java:comp/env"); // 자바 실행환경
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb2"); // 데이터 소스가 리턴

conn = dataSource.getConnection();

String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, strDong + "%");
rs = pstmt.executeQuery();

sbHtml.append("<table width='800' border='1'>");
while(rs.next()) {
	sbHtml.append("<tr>");
	sbHtml.append("<td>" + rs.getString("zipcode") + "</td>");
	sbHtml.append("<td>" + rs.getString("sido") + "</td>");
	sbHtml.append("<td>" + rs.getString("gugun") + "</td>");
	sbHtml.append("<td>" + rs.getString("dong") + "</td>");
	sbHtml.append("<td>" + rs.getString("ri") + "</td>");
	sbHtml.append("<td>" + rs.getString("bunji") + "</td>");
	sbHtml.append("</tr>");
}
sbHtml.append("</table>");

} catch(NamingException e) {
	System.out.println("[에러] : "  + e.getMessage());
} catch(SQLException e) {
	System.out.println("[에러] : "  + e.getMessage());
} finally {
	if(rs != null) rs.close();
	if(pstmt != null) pstmt.close();
	if(conn != null) conn.close();
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./zipcode.jsp" method="post" name="frm">
<fieldset>
<legend>우편번호 검색</legend>
<label for="dong">동이름 입력</label>
<input type="text" id="dong" name="dong" size="40" placeholder="동이름 입력">
<input type="button" id="btn" value="우편번호 검색">
</fieldset>
</form>
<%=sbHtml %>
</body>
</html>



디자인해줘서 뽑아보기 집 가서 마무리

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>

<%@ page import="javax.sql.DataSource" %>

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>

<%
	request.setCharacterEncoding( "utf-8" );

	String strSido = request.getParameter( "sido" );

	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	
	StringBuffer sbSido = new StringBuffer();
	StringBuffer sbGugun = new StringBuffer();
	
	try {
		Context initCtx = new InitialContext();
		Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
		DataSource dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
		
		conn = dataSource.getConnection();
	
		String sql = "select distinct sido from zipcode";
		
		pstmt = conn.prepareStatement( sql );
		
		rs = pstmt.executeQuery();
		
		while( rs.next() ) {
			sbSido.append( "<option value='" + rs.getString( "sido" ) + "'>" + rs.getString( "sido" ) + "</option>" );
		}
		
		if( request.getParameter( "sido" ) != null ) {
			
			sql = "select distinct gugun from zipcode where sido=?";
			pstmt = conn.prepareStatement( sql );
			pstmt.setString( 1, strSido );
			
			rs = pstmt.executeQuery();
			
			while( rs.next() ) {
				sbGugun.append( "<option value='" + rs.getString( "gugun" ) + "'>" + rs.getString( "gugun" ) + "</option>" );
			}
		}
		
	} catch( NamingException e ) {
		System.out.println( "[에러] " + e.getMessage() );
	} catch( SQLException e ) {
		System.out.println( "[에러] " + e.getMessage() );
	} finally {
		if( rs != null ) rs.close();
		if( pstmt != null ) pstmt.close();
		if( conn != null ) conn.close();
	}
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	table	{ border: 1px solid black; font-size: 15px; border-collapse: collapse; }
	td		{ width: 800px; padding: 10px; text-align: center; border: 1px solid black; }
	#sido	{ width: 100px; }
	#gugun	{ width: 100px; }
</style>
<script type="text/javascript">
	window.onload = function() {
		document.getElementById( 'sido' ).onchange = function() {
			const sido = document.getElementById( 'sido' ).value;
			//alert( sido );
			document.frm.submit();
		};
	};
</script>
</head>
<body>

<form action="zipcode3.jsp" method="post" name="frm">
<table>
<tr>
	<td>
		<select name="sido" id="sido">
			<option value="시도">시도</option>
			<%=sbSido %>
		</select>
		<select name="gugun" id="gugun">
			<option value="구군">구군</option>
			<%=sbGugun %>
		</select>
		<input type="text" name="dong" id="dong" size="40" />
		<input type="submit" value="우편번호검색" />
	</td>
</tr>
</table>
</form>

</body>
</html>




profile
개발자 꿈나무

0개의 댓글