이클립스 WTP server.xml 설정이 적용되지 않을 때

<Connector connectionTimeout=”20000″ port=”8080″ protocol=”HTTP/1.1″ redirectPort=”8443″ />

server.xml에 이런 설정이 들어있는데 이것을 인코딩 문제로

<Connector connectionTimeout=”20000″ port=”8080″ protocol=”HTTP/1.1″ redirectPort=”8443″ useBodyEncodingForURI=”true”/>

이렇게 변경했습니다. 그런데 변경한 설정이 먹질 않더군요.

server를 우클릭하고 cleanup도 해봤습니다. 적용되지 않았습니다.

그래서 server를 더블클릭하고 HTTP/1,1 포트를 변경한 다음에 서버를 재가동 해봤더니 설정이 적용되서 원하는 결과를 얻을 수 있었습니다.

다시 포트를 원래대로 돌린다음에 실행해 봤더니 이번에도 적용이 됐습니다.

server.xml을 직접 편집할 경우 설정이 제대로 안 먹을 수 있으니, server를 더블클릭해서 어떤 설정을 변경한 다음 저장하고 다시 시도해보시기 바랍니다. 저처럼 될지도 몰라요~

톰캣 인코딩 설정해야 하는 경우

updated 090623

<Connector connectionTimeout=”20000″ port=”8080″ protocol=”HTTP/1.1″ useBodyEncodingForURI=”true”/>

————————————————————————–
검색창에 한글만 입력하면 다음과 같은 에러가 발생한다.

org.postgresql.util.PSQLException: ERROR: character 0xc3a7 of encoding “UTF8” has no equivalent in “EUC_KR”

웹 페이지도 EUC-KR로 설정되어 있고 Postgres DB도 EUC-KR을 사용하고 있다. web.xml에 인코딩 필터를 확인해봤더니, 그것도 역시 EUC-KR로 설정되어 있다.

알턱이 없으니 사부에게 문의해서 알아냈다.

톰캣 5.5 이상 부터는 Post 방식에는 인코딩 필터를 적용할 수 있지만 GET 방식은 서버가 connector에 설정한  (server.xml) URIEncoding의 값으로 인코딩 함.

<Connector port=”8209″ protocol=”AJP/1.3″ redirectPort=”8543″ URIEncoding=”euc-kr” />

위는 아파치랑 연동되어 있어서 아파치와 연동하는 부분에 인코딩 설정. 아마도 저 값의 기본값이 UTF-8이었거나 아파치쪽의 기본값이 UTF-8 이었나보다. 몰겠다. 자세히는;

MySQL 인코딩 설정 바꾸기

MySQL 설정 파일을 변경하여 인코딩 변경하기 => UTF8기반으로 쓰기위한 Mysql 세팅방법
DB 생성할 때 인코딩 옵션 주기 =>

UTF8을 쓰기 위한 MySQL 테이블 및 데이터 취급 방법

create database test DEFAULT CHARACTER SET utf8 collate utf8_general_ci

Stream 인코딩 바꾸기

제 블로그 RSS URL을 날리면 어떤 HTML이 날아오는지 보고 싶습니다.

String request – “http://whiteship.tistory.com”;
URL url = new URL(request);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();

이렇게 커넥션 객체를 생성한 다음에.. 이 커넥션에서 다시 InputStream을 얻어서 다시 아래 처럼 InputStreamReader로 그리고 이걸 다시 버퍼를 사용해서 읽을 수 있도록 BufferedReader에 연결 시킵니다.[footnote]정말 이 부분은 외워 지지가 않네요. 매번 코드를 찾아보게 되는 부분입니다.[/footnote]

BufferedReader br = BufferedReader(new InputStreamReader(connection.getInputStream()));

그리고 이후에는 br.readLine() 으로 한줄씩 읽어서 StringBuilder에 쌓아 뒀다가 출력해보면 됩니다.

그렇게 해봤습니다.
[#M_ more.. | less.. | <?xml version=”1.0″ encoding=”UTF-8″?>
<rss version=”2.0″>
    <channel>
        <title>Whiteship&#039;s Note</title>
        <link>http://whiteship.tistory.com/</link>
        <description>?뻾蹂듯븳 媛쒕컻?옄媛? ?릺?졄?땲?떎.</description>
        <language>ko</language>
        <pubDate>Tue, 27 Feb 2007 23:16:34 +0900</pubDate>
        <generator>Tistory 1.1</generator>
        <image>
        <title>Whiteship&#039;s Note</title>
        <url><![CDATA[http://fs.tistory.com/attach/8148/1301078737.gif]]></url>
        <link>http://whiteship.tistory.com/</link>
        <description>?뻾蹂듯븳 媛쒕컻?옄媛? ?릺?졄?땲?떎.</description>
        </image>
        <item>
            <title>DAUM 留ㅼ돩?뾽 ?썑湲?</title>
            <link>http://whiteship.tistory.com/504</link>
            <description>?쑕.. ?뾼泥??궃 ?뿰媛뺤쓣 ?뱽怨? ?솕?뜑?땲 ?뵾怨ㅽ븯?꽕?슂. 5?떆 10遺? 遺??꽣 9?떆源뚯?? ?씠?뼱吏? 媛뺤쓽????뒿?땲?떎. ?꽕?씠踰꾩?? DAUM?쓽 ?삤?뵂API ?궗?슜踰뺢낵 ?떎?젣 ?삁?젣 肄붾뱶瑜? 蹂댁뿬 二쇱뀲?뒿?땲?떎. ?궗?떎 ?쟾 硫섑넗媛? ?쁿?뿉 遺숈뼱?꽌 ?떎?뒿?쓣 ?뻽?떎?뒗 吏??궃 25?씪?뿉 李몄뿬瑜? ?븯怨? ?떢?뿀?뒗?뜲 ?뿬?뻾?쓣 媛??빞?븯湲? ?븣臾몄뿉 ?븘?돺寃? 媛뺤쓽留? ?엳?뒗 ?삤?뒛?씠?씪?룄 李몄뿬?빐?꽌 ?떎?쓬 留ㅼ돩?뾽?쓽 遺꾩쐞湲곕?? ?뙆?븙?뻽?떎?뒗 寃껋쑝濡? 留뚯”?빐?빞 寃좎뒿?땲?떎. 媛뺤쓽媛? ?엳?뒗 諛⑹씠 ?쑀由щ줈 ?몮?윭 ?뙎?뿬 ?엳?뼱?꽌 諛뽰씠 蹂댁???뒗?뜲 ?뒭??? ?떆媛꾩뿉?룄 ?뿴?떖?엳 ?씪..&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://whiteship.tistory.com/504&quot;&gt;湲? ?쟾泥대낫湲?&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description>
            <category>Thinking</category>
            <category>?떎?쓬 留ㅼ돩?뾽</category>
            <author>湲곗꽑</author>
            <guid>http://whiteship.tistory.com/504</guid>
            <comments>http://whiteship.tistory.com/504#entry504comment</comments>
            <pubDate>Tue, 27 Feb 2007 23:14:06 +0900</pubDate>
        </item>

_M#]이상한 글씨들이 콘솔창에 출력됩니다. OTL..

인코딩 문제인데 구글신에게 물어보니까 InputStreamReader의 생성자를 이용해서 인코딩을 바꿀 수 있다고 합니다. 현재 인코딩을 찍어보니까[footnote]InputStreamReader의 String getEncoding()을 사용하면됩니다.[/footnote] MS949라고 출력됩니다.

RSS나 기타 오픈API를 사용한 결과물은 UTF-8을 사용한다고 합니다. 그리고 InputStreamReader의 생성자를 보니까 다음과 같이 네개의 생성자가 있었습니다.
사용자 삽입 이미지
이 중에서 제일 아래 녀석을 사용해서 다음과 같이 수정해 줍니다.

br = BufferedReader(new InputStreamReader(connection.getInputStream(), “UTF-8”));

결과물을 확인해 보니 제대로 출력이 되는 걸 볼 수 있었습니다.
[#M_ more.. | less.. | <?xml version=”1.0″ encoding=”UTF-8″?>
<rss version=”2.0″>
    <channel>
        <title>Whiteship&#039;s Note</title>
        <link>http://whiteship.tistory.com/</link>
        <description>행복한 개발자가 되렵니다.</description>
        <language>ko</language>
        <pubDate>Tue, 27 Feb 2007 23:16:34 +0900</pubDate>
        <generator>Tistory 1.1</generator>
        <image>
        <title>Whiteship&#039;s Note</title>
        <url><![CDATA[http://fs.tistory.com/attach/8148/1301078737.gif]]></url>
        <link>http://whiteship.tistory.com/</link>
        <description>행복한 개발자가 되렵니다.</description>
        </image>
        <item>
            <title>DAUM 매쉬업 후기</title>
            <link>http://whiteship.tistory.com/504</link>
            <description>휴.. 엄청난 연강을 듣고 왔더니 피곤하네요. 5시 10분 부터 9시까지 이어진 강의였습니다. 네이버와 DAUM의 오픈API 사용법과 실제 예제 코드를 보여 주셨습니다. 사실 전 멘토가 옆에 붙어서 실습을 했다는 지난 25일에 참여를 하고 싶었는데 여행을 가야하기 때문에 아쉽게 강의만 있는 오늘이라도 참여해서 다음 매쉬업의 분위기를 파악했다는 것으로 만족해야 겠습니다. 강의가 있는 방이 유리로 둘러 쌓여 있어서 밖이 보였는데 늦은 시간에도 열심히 일..&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://whiteship.tistory.com/504&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description>
            <category>Thinking</category>
            <category>다음 매쉬업</category>
            <author>기선</author>
            <guid>http://whiteship.tistory.com/504</guid>
            <comments>http://whiteship.tistory.com/504#entry504comment</comments>
            <pubDate>Tue, 27 Feb 2007 23:14:06 +0900</pubDate>
        </item>

_M#]

SimpleFormController 에피소드2

아래 발생한 문제는 SimpleFormController와는 전혀 관계가 없는 내용일 수도 있다는 것을 미리 알려드리고 시작해야겠습니다. 이유는 결론을 보시면 알게 되실듯.

사용자 삽입 이미지위와 같은 리스트가 있습니다. 오호 분명히 “기선”이라는 사람이 매우 많이 있습니다. 왼쪽에 있는 search로 이동해서 “기선”을 찾아 봅시다.

사용자 삽입 이미지이렇게 기선을 입력하고 enter 또는 search 버튼을 클릭했더니 다음과 같은 화면이 출력 됐습니다.

사용자 삽입 이미지헐…출력할 것이 없다니.. 도대체 어디서 문제가 생긴거야???

1. 소스코드를 점검하기 시작합니다. JSP와 Controller를 점검하기 시작했습니다.
[#M_ more.. | less.. |

 컨트롤러

public class SearchMemberController extends SimpleFormController {

    private MemberRepository memberRepository;

    public SearchMemberController() {
        setCommandName(“memberCommand”);
        setCommandClass(MemberCommand.class);
        setFormView(“search”); // 생략가능.
        setSuccessView(“searchResult”);
    }

    public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    @Override
    protected ModelAndView onSubmit(Object command) throws Exception {
        MemberCommand searchingMember = (MemberCommand) command;
//        System.out.println(“message 출력: ” + search.getName());
        ModelAndView mav = new ModelAndView(getSuccessView())
            .addObject(“resultMember”, memberRepository.findByName(searchingMember.getName()))
            .addObject(“memberCommand”, searchingMember);
        return mav;
    }
}

search.jsp

<jsp:root version=”1.2″ xmlns:jsp=”http://java.sun.com/JSP/Page”
    xmlns:display=”urn:jsptld:http://displaytag.sf.net”
    xmlns:form=”http://www.springframework.org/tags/form”>
    <jsp:directive.page contentType=”text/html; charset=UTF-8″ />
    <jsp:include page=”inc/header.jsp” flush=”true” />

    <html>
    <head>
    <title>Search For Members</title>
    </head>
    <body>
    <h2>Search For Members</h2>
    <form:form commandName=”memberCommand” method=”post”>
        <table>
            <tr>
                <td>Name:</td>
                <td><form:input path=”name” /></td>
            </tr>
            <tr>
                <td colspan=”2″><input type=”submit” value=”Search” /></td>
            </tr>
        </table>
    </form:form>
    </body>
    </html>

    <jsp:include page=”inc/footer.jsp” flush=”true” />

</jsp:root>

searchResult.jsp

<jsp:root version=”1.2″ xmlns:jsp=”http://java.sun.com/JSP/Page”
    xmlns:display=”urn:jsptld:http://displaytag.sf.net”
    xmlns:c=”http://java.sun.com/jstl/core_rt”>
    <jsp:directive.page contentType=”text/html; charset=UTF-8″ />
    <jsp:include page=”inc/header.jsp” flush=”true” />

    <jsp:scriptlet>
        java.util.List members = (java.util.List)request.getAttribute(“resultMember”);
        request.setAttribute(“test”, members);
    </jsp:scriptlet>

    <h2>Search Results</h2>

    <display:table name=”test” export=”true”>
        <display:column property=”name” title=”이름”/>
        <display:column property=”email” autolink=”true”/>
        <display:column property=”phone” title=”연락처”/>
        <display:column property=”blogAddress” title=”Blog” autolink=”true”/>
        <display:column property=”messengerId” title=”MSN”/>
    </display:table>

    <jsp:include page=”inc/footer.jsp” flush=”true” />

</jsp:root>

_M#]
처음에는 command 객체에 값이 들어가지 않는 것 같다는 생각이 들었습니다. 중간에 출력문을 한번 넣어보면 될 것을[footnote]소스코드에 주석처리 된 부분입니다.[/footnote] 아직까지도 SimpleFormController가 어떻게 동작하는 것인지 제대로 모르기 때문에 그 떈 더욱 더 Command 객체에 값이 언제 들어가는 것인지 알 수가 없었습니다.

그리고 두번째는 지난 글에서 의문이 들었던 command 객체를 도메인 객체로 써야 하는건가? 싶어서 Member로 바꿔서도 해봤습니다. 결과는… 여전했습니다.

2. 조금더 공부하다가 Command 객체에 값이 들어갔는지 확인해봤습니다. 세상에 값이 들어가 있었습니다. 값이 들어가 있긴 한데… 한글이 깨져있더군요.

message 출력: ?¸°???

-_-;; 난감했습니다. 이전에 DB 인코딩 문제로 한참을 해맸었는데 또다시 인코딩문제인가.. ㄷㄷㄷ 거리고 있었는데 다행히 한수형이 알려주셔서 web.xml에 다음과 같이 코드를 넣어줬더니 한글이 제대로 보였습니다.
[#M_ more.. | less.. |     <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>_M#]
3. 좋았습니다. 이제 콘솔에 찍어보니 한글도 제대로 보이고 검색을 날렸는데… 여전히!! 못찾는겁니다. 왜?? 도대체 왜!! 못찾는거야.. 하면서 iBATIS에 SQL을 확인하러 갔습니다… 세상에…ㅠ.ㅠ
[#M_ more.. | less.. |     <!– find –>
    <select id=”find” resultMap=”memberMap”>
        SELECT id, name, messengerId, email, blogAddress, phone
        FROM Member
        WHERE
        <isNotNull property=”phone”>phone = #phone#</isNotNull>
        <isNotNull property=”blogAddress”>blogAddress = #blogAddress#</isNotNull>
        <isNotNull property=”email”>email = #email#</isNotNull>
        <isNotNull property=”messengerId”>messengerId = #messengerId#</isNotNull>
        <isNotNull property=”name”>name = #name#</isNotNull>
    </select>_M#]like로 바꿔야 겠어요. 흐흐흐흐흐흐흐