Java, JSP로 웹 프로그래밍을 하다 보면 로그를 출력해서 데이터의 흐름을 봐야할 때가 있다.

로그를 출력하는 것이야 모든 프로그램들이 다 기능을 제공해 준다.


JSP의 경우는 JavaScript의 alert()이나 console.log()를 이용해서 웹브라우저에서 확인할수가 있으나

Servlet 상에서 변수의 값을 로그로 출력할경우는 alert()이나 console.log()를 사용하기가 어려워진다.


Servlet의 경우는 보통 System.out.println()과 같은 방식으로 로그를 확인할수 있겠는데

local상에서 개발할 때는 물론 이클립스의 경우 로그를 볼수가 있다.

그러나 웹 서버에서 돌아가는 Servlet에서 System.out.println()의 결과를 어떻게 확인해야할지 난감해진다.

그런데 의외로 간단하게 이 문제를 해결할수 있다.


tomcat이 설치되어 있는 디렉토리의 하위에 logs라는 디렉토리가 있고 logs 디렉토리에는

많은 종류의 로그 파일들이 저장되어 있다.

이 디렉토리에 가면 catalina.out이라는 로그 파일이 있는데 여기에 System.out.println()에서 출력한 값들이 저장되어 있다.

이 파일을 vi로 열어서 확인하면 웹 서버 상에서 돌아가는 Servlet의 로그를 확인할수가 있다.




JSP에서 MySQL 사용하기


JSP에서는 보통 Oracle DB와 연동을 하는 경우가 많은데 

MySQL과 연동하는 경우도 있다. 이를 위한 설정 작업에 대해서이다.


(1) APM을 설치하는 방식

Apache, PHP, MySQL을 설치한 경우에도 JSP에서 간단히 MySQL과 연동할수 있다.

APM은 설치하기가 간단하기 때문에 이 방식이 편리할수도 있다.


 ① MySQL용 JDBC 드라이버 설치

APM을 통해서 MySQL이 설치가 되었다면 JSP에서 MySQL에 접속하기 위해서는 JDBC라는 드라이버를 설치해야 한다. 이를 설치하기 위해서는


http://www.mysql.com/ ⇒ Downloads 탭 ⇒ Community라는 하위 탭 ⇒ 우측의 MySQL Connectors 항목 클릭 ⇒ Connector/J  ⇒ Connector/J 5.1.40 하위의 ZIP 파일 다운로드 ⇒ 압축을 푼 후 mysql-connector-java-5.1.40-bin.jar를 Java가 설치된 폴더 중 jre7/lib/ext 폴더에 복사해 넣는다. 그리고 JSP 프로젝트의 WEB-INF/lib 폴더에도 복사해 넣는다.

여기까지가 되면 JSP에서 MySQL을 사용할 준비가 된것이다.


※ MySQL Connectors가 각 언어별(C++, .Net, Python...) 접속 드라이버를 제공하는데 그 중에서 Connector/J가 Java를 위한 연결(접속) 드라이버이다. 즉 JDBC 라이브러리이다.


(2) MySQL을 독립적으로 설치하기

http://www.mysql.com/ ⇒ Downloads 탭 ⇒ Community라는 하위 탭 ⇒ 우측의 MySQL Community Server 클릭 ⇒ Download MySQL Community Server로 이동 ⇒ MySQL Community Server 5.7.17에대한 다운로드들 중 ZIP 압축파일이 아닌 MSI 형태의 Installer를 다운로드 할 것 즉 Windows (x86, 32-bit), MSI Installer를 다운로드 할 것  ⇒ 설치


※ 설치 방법은 좀 복잡한데 다음 사이트 참조

http://withcoding.com/26


(3) JSP에서 사용하기

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

<%@page import="java.sql.Statement"%>

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

<%@page import="java.sql.DriverManager"%>


... 중 략 ...

<%

Class.forName("com.mysql.jdbc.Driver");


/*

Connection java.sql.DriverManager.getConnection(String url, String user, String password) throws SQLException

Parameters:

url - a database url of the form jdbc:subprotocol:subname

user - the database user on whose behalf the connection is being made

password - the user's password

Returns:

a connection to the URL

Throws:

SQLException - if a database access error occurs

*/

//아래에서 world는 DB 이름이다.

//2번째 매개인자 aabb : world라는 DB의 계정 id

//3번째 매개인자 ccee : world라는 DB의 계정 비번

Connection conn = null;

  conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?useUnicode=true&characterEncoding=utf8", "aabb", "ccee");

String qry = "select Name, Population, CountryCode from city";

Statement stmt = null;

ResultSet rt = null;

if (conn != null){

out.println("world DB로 연결 성공<br/>");

stmt = conn.createStatement();

rt = stmt.executeQuery(qry);

%>

<table border="1" cellspacing="0" cellpadding="5" valign="middle">

<tr>

<th>국가명</th>

<th>인 구</th>

<th>국가코드</th>

</tr>

<%

  while(rt.next())

{

%>

<tr>

<td><%= rt.getString("Name") %></td>

<td><%= rt.getString("Population") %> 명</td>

<td><%= rt.getString("CountryCode") %></td>

<tr>

<%

} //while 

%>


</table>

<%

conn.close();

out.println("DB close~<br/>");

} else {

out.println("world DB로 연결 실패<br/>");

}

%>



JSP의 자바빈(JavaBeans) 사용시 <jsp:setProperty ... property="*"에 대해서


jsp:setProperty에서 property="*"는 개발자들의 손가락의 수고를 많이 덜어주는 유용한 기능이다.

JavaBeans가 다음과 같이 구성되어 있다고 할때


package com.joe.test;


public class Student {

private String sName;

private int sAge;

private int sGrade;

private int sID;

public Student() {

}


public String getsName() {

return sName;

}


public void setsName(String sName) {

this.sName = sName;

}


... 나머지는 생략 ...

}



JSP에서 자바빈 사용시 원래는 다음과 같은 방식이다.


<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<jsp:useBean id="myStudent" class="com.joe.test.Student" scope="page"/>  


... 중략 ...


<jsp:setProperty name="myStudent" property="sName" value="고길동"/>

<jsp:setProperty name="myStudent" property="sAge" value="10" />

<jsp:setProperty name="myStudent" property="sGrade" value="3"/>

<jsp:setProperty name="myStudent" property="sID" value="12345"/>


그런데 만일 폼으로부터 JSP가 JavaBeans를 이용해서 값을 넘겨 받는다면 이런식으로 처리된다.

form의 내용이 만일 다음과 같다고 할때


<form action="showStudent.jsp" method="post">

이름 : <input type="text" name="name" size="10"><br/>

나이 : <input type="text" name="age" size="3"><br/>

학년 : <input type="text" name="grade" size="3"><br/>

학번 : <input type="text" name="id" size="10"><br/>

<p/>

<input type="submit" value="전송">&nbsp;&nbsp;&nbsp;<input type="reset" value="취소">

</form>


showStudent.jsp에서는 다음과 같이 값을 받는다.


<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<jsp:useBean id="myStudent" class="com.joe.test.Student" scope="page"/>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

     

<jsp:setProperty name="myStudent" property="sName" param="name"/>

<jsp:setProperty name="myStudent" property="sAge" param="age"/>

<jsp:setProperty name="myStudent" property="sGrade" param="grade"/>

<jsp:setProperty name="myStudent" property="sID" param="id"/>


학생이름 : <jsp:getProperty name="myStudent" property="sName"/><br/>

학생나이 : <jsp:getProperty name="myStudent" property="sAge"/><br/>

학&nbsp;&nbsp;&nbsp;년 <jsp:getProperty name="myStudent" property="sGrade"/><br/>

학생번호 : <jsp:getProperty name="myStudent" property="sID"/> 

</body>

</html>


그런데 만일 form의 파라미터 이름을 JabaBeans에 있는 변수명과 동일하게 한다면


<form action="showStudent.jsp" method="post">

이름 : <input type="text" name="sName" size="10"><br/>

나이 : <input type="text" name="sAge" size="3"><br/>

학년 : <input type="text" name="sGrade" size="3"><br/>

학번 : <input type="text" name="sID" size="10"><br/>

<p/>

<input type="submit" value="전송">&nbsp;&nbsp;&nbsp;<input type="reset" value="취소">

</form>


showStudent.jsp에서는 아래 4개의 코드를 


<jsp:setProperty name="myStudent" property="sName" param="sName"/>

<jsp:setProperty name="myStudent" property="sAge" param="sAge"/>

<jsp:setProperty name="myStudent" property="sGrade" param="sGrade"/>

<jsp:setProperty name="myStudent" property="sID" param="sID"/>


다음과 같이 간단히 사용할수 있다(showStudent.jsp의 나머지 내용은 동일).


<jsp:setProperty name="myStudent" property="*" />





※ Oracle Database 11g Express Edition 중심으로

자바에서 Oracle DB를 사용할 때 JDBC 라이브러리를 사용하게 되는데 이때 JDBC를 사용하기 위해 몇가지 필요한 정보가 있다. 즉 JDBC를 통해 Oracle DB에 connection하기 위해 몇 가지 필요한 정보가 있다. 대표적으로
Oracle 사용자 계정에 대한 id, password...
그 중에서 Oracle database에 대한 url 정보가 있다.
대체로 다음과 같은 형태이다.

jdbc:oracle:thin:@localhost:1521:xe

이것이 무엇을 의미하는지에 대해서 살펴본다.
이에 대한 프로토타입은 다음과 같다.

jdbc:oracle:driver_type:[username/password]@[//]host_name[:port][/XE]

위의 프로토타입으로부터 아래 정보를 해석해 보면 다음과 같다.

jdbc:oracle:thin:@localhost:1521:xe

-. jdbc:oracle:thin은 사용하는 JDBC드라이버가 thin 타입을 의미한다. 자바용 오라클 JDBC드라이버는 크게 두가지가 있는데 하나는 Java JDBC THIN 드라이버고, 다른 하나는 OCI기반의 드라이버라고 한다.

-. username/password은 option이다. [ ]안에 있는 정보는 반드시 명기할 필요는 없다는 뜻이다.

-. :port 번호도 option이다. 다만 Oracle의 listener port인 1521을 사용하지 않을 경우는 이 값을 명기해 줘야 된다. 예를 들어서 jdbc:oracle:thin:hr/hr@//localhost:1522

-. localhost는 Oracle DB가 설치되어 있는 서버의 IP인데 위 경우는 로컬에 설치되어 있다는 뜻이다.

-. 1521 은 오라클 listener의 포트번호이다.

-. /XE는 Oracle database client의 고유한 service name이다. 디폴트로 XE를 사용하므로 이 정보도 option이다. 이에 대한 설정 정보는 Oracle이 설치된 폴더 아래의 app\oracle\product\11.2.0\server\network\ADMIN\listener.ora 파일에 다음과 같이 표시되어 있다.

DEFAULT_SERVICE_LISTENER = (XE)




java.lang.IllegalArgumentException: Control character in cookie value or attribute.


위 에러는 JSP의 쿠키(cookie) 설정에 한글을 사용할 경우 발생하는 에러이다.

다음과 같은 JSP 코드가 있다고 가정하자.


<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>쿠키 설정</title>

</head>

<body>

<%

Cookie c = new Cookie("MemberID", "12345");

c.setMaxAge(60*60);

c.setComment("회원 ID");

response.addCookie(c);

%>

<p/>

<a href="GetCookie.jsp">쿠키 확인하기</a>

</body>

</html>


위 코드를 실행하면 


JSP java.lang.IllegalArgumentException: Control character in cookie value or attribute.라는 에러가 발생한다.

에러가 발생하는 위치는 한글을 사용한 

c.setComment("회원 ID")에서 에러가 발생한다.


해결할려면 한글을 utf-8로 인코딩한 값을 set하거나 Base64로 인코딩한 값을 set하면 된다. 

물론 쿠키를 받는 곳에서 동일한 인코딩 값으로 받아야 할 것이다.



+ Recent posts