2016년 12월 27일 화요일

JSP에서 MySQL 사용하기





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/>");
}
%>

2016년 12월 22일 목요일

MySQL insert시 홑 따옴표(single quotes) 처리하는 법





MySQL 테이블에 데이터를 insert하다보면 어떤 데이터는 insert가 실패하는 경우가 있다.
이때 exception을 발생하는 것도 아니고 mysqli_query()의 반환 값을 false로 반환하는 정도 선에서 끝난다.
그래서 80개의 레코드를 가진 테이블을 읽어 와서 새로운 테이블에 insert 작업을 하는데 
78개만 insert가 된다거나와 같은 상황이 발생하는 것이다.
이유와 원인은 홑따옴표(') 처리에서의 문제다.
게시판의 경우 제목이나 내용에 홑따옴표(')가 포함되는 경우가 있다.
이 경우 insert는 보기 좋게 실패한다.

예를들어 $result에 select한 결과 셋이 있다고 할때

while($data = mysqli_fetch_array($result))
{
... 전략 ...
$title = $data['title'];
$con = $data['content'];
... 후략...
    $qry = "insert into my_table (...생략... title, content ...생략...)
                  values (...생략... '$title', '$con' ...생략... )";
    mysqli_query($qry, $connect);
}


이 경우 title 내용이나 content에 홑따옴표가 있다면 해당 레코드가 insert가 되지 않는다.
해법은 title과 content에 addslashes()함수를 사용한다. 그렇게 되면 홑따옴표에 \를 추가해서 MySQL에 insert를 하게 되고 정상적으로 입력이 된다.
다음과 같이...
$title = addslashes($data['title']);
$con = addslashes($data['content']);

Python에서 list 항목 치환시 slice 사용의 주의할 점





Python의 list를 다룰 때 특히 list의 특정 항목을 다른 항목으로 치환하고자 할 때 사용하는 slice에서 자칫 잘못하면
원래의 list 항목을 날려 먹거나 원치 않는 value가 끼워넣어지는 문제가 발생한다.
그래서 list의 length가 원치 않게 변해 버리는 문제가 발생한다.
아래 코드가 전형적으로 이런 문제를 유발하는 예제이다.

#-*- coding: utf-8 -*-
a = []
b = [101, 102, 103, 104, 105]
for i in range(10):
   a.insert(i, i)

print("원본", a)
print('길이', len(a))

#아래 코드는 index 2~4까지를 바꾼다. 총3개를 바꾼다.
#그런데 list b에 있는 값은 5개이다. 따라서 b의 앞 3개는
#치환이 되지만 나머지 2개(104, 105)는 끼워넣기가 되어 버린다.
#따라서 list a가 원래 10개였는데 아래 코드 실행 후 len()은 12개가 된다
#a[2:5] = b[0:] 
#print(a)
#print("길이", len(a)) #12가 나온다


#아래 코드는 index 1~7까지 총 7개를 바꾸는데 바꿀 내용인 
#list b에는 값이 5개 뿐이다(101 ~ 105). 이럴 경우 발생하는 현상은
#list a의 index 1~5까지는 101~105로 각각 치환이 되고 
#list a에서 나머지 index 6~7에 해당하는 값은 사라져 버린다.
#그래서 아래 코드 실행후 list a의 len()은 8이 되어져 버린다.
#a[1:8] = b[0:] #이 코드를 실행하고자 하면 위 a[2:5] = b[0:]를 주석 처리 할 것
#print(a)
#print("길이", len(a)) #8이 나온다.

#이러한 문제를 해결하기 위해서는 다음과 같이 처리해 주어야 안전하다.
a[1:len(b)+1] = b[0:]
print(a)
print("길이", len(a))

2016년 12월 20일 화요일

putty로 접속한 vi editor 색상 조합 설정하기





putty나 telnet으로 원격 리눅스 서버에 접속해서 vi로 php 코드나 프로그램 소스를 작성/수정하는 작업을 할 일이 있는데 
이때 vi의 화면 색상들이 눈에 잘 띄는 색상조합이 아니다.
다음과 같이 특히 주석 부분이 검정 바탕에 파랑색이어서 보기가 많이 불편하다.
이것을 자신이 원하는 색상으로 변경할 수 있다.



vi의 색상을 변경할려면 자신의 home 디렉토리 root로 이동해서 .vimrc 파일에 다음 내용을 입력해 넣으면 된다.
만일 .vimrc 파일이 없다면 새로 만들어서 색상 설정 값을 입력한다.

highlight Comment term=bold cterm=bold ctermfg=2
highlight String ctermfg=3

여기서 중요한 값은 ctermfg이다. 터미널 foreground 색상을 뭘로 할지를 설정하는 부분이다.
여기서 사용할수 있는 컬러 값은 아래와 같다.

1 빨강
2 녹색
3 노랑
4 파랑
5 보라색
6 cyon
7,8,9 흰색

ctermfg=2를 했을 때는 녹색으로 글자색상이 표시된다.

그 다음으로 어떤 항목의 글자색상을 설정할지를 지정해 주어야 하는데
위의 경우 Comment는 소스 코드의 주석에 대해서 2(녹색)으로 설정하겠다는 것이고
그 다음으로 String은 " "안에 있는 문자열의 색상을 3(노랑)으로 설정하겠다는 뜻이다.
이렇게 .vimrc를 작성했으면 logout했다가 다시 login해서 vi로 열어보면 다음과 같은 형태로 변경이 되어 있을 것이다.



여기서 색상을 설정할 수 있는 어떤 항목들이 있는지를 볼려면 vi 화면상에서
:highlight를 입력하고 엔터키를 치면 다음과 같이 색상 설정을 할수 있는 항목들 리스트가 보인다.









2016년 12월 1일 목요일

Python 코드 상에서 한글 사용하기





Python은 좀 특이한 언어이다. 들여쓰기가 그렇게 의미 있는 행동이다.
또 공백이 있고 없고가 큰 차이를 만들어내는 경우도 있다.
대표적으로 Python 코드는 기본적으로 ASCII 문자로 처리해서 해석을 한다.
따라서 소스 코드 상에서 한글을 사용하면 컴파일 단계에서 에러 발산한다.
심지어는 #로 시작하는 주석에서 한글을 사용해도 컴파일 에러 발생한다.
에러 메시지는 다음과 같은 걸 뿜는다.

SyntaxError: Non-ASCII character '\xec' in file test.py on line 16, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details


따라서 파이썬에서 한글을 사용할려면 다음의 코드를 소스 맨 첫줄에 삽입해 주어야 한다.

#-*- coding: utf-8 -*-

그런데 다음과 같이 하면 여전히 한글을 사용할수 없는 상황이 변하지 않는다.

#-*- coding : utf-8 -*-

coding과 콜론(:) 사이에 있는 공백 때문이다. 

참고로 이 글은 Python 버전 2.7에서 실행했을 때의 상황이다.
Python 버전 3에서는 이상의 문제 발생하지 않는다.