<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>[나는 취하고싶다.]</title>
	<link>http://xuny.egloos.com</link>
	<description>지극히 개인적인 블로그 ^^;
멜: xunyss@gmail.com</description>
	<language>ko</language>
	<pubDate>Fri, 20 Nov 2009 06:28:53 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>[나는 취하고싶다.]</title>
		<url>http://pds17.egloos.com/logo/200910/09/87/d0029487.jpg</url>
		<link>http://xuny.egloos.com</link>
		<width>80</width>
		<height>103</height>
		<description>지극히 개인적인 블로그 ^^;
멜: xunyss@gmail.com</description>
	</image>
  	<item>
		<title><![CDATA[ 개펌 - HttpSessionBindingListener ]]> </title>
		<link>http://xuny.egloos.com/2476933</link>
		<guid>http://xuny.egloos.com/2476933</guid>
		<description>
			<![CDATA[ 
  <p>HttpSessionBindingListener 는 웹에서 동시 사용자의 수 또는 하나의 아이디로 동시접속을 제한 할때 유용한 인터페이스 이다.&nbsp; HttpSessionBindingListener 는 두개의 메소드를 지니는데 valueBound() 와 valueUnbound() 메소드 이다. </p><p>valueBound() 는 HttpSessionBindingListener 클래스의 인스턴스가 세션에 attribute로 등록될떄 호출된다&nbsp; session.setAttribute(플래그, 값) valueUnbound()는 Session.removeAttribute(플래그); 사용 시 또는 세션 종료 시&nbsp; session.invalidate()호출된다.</p><p>다음은 이를 이용한 동시 사용자및 중복 로그인 방지 프로그램이다.</p><ul><li><strong>LoginManager.java</strong> </li></ul><div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span>package cookie;</pre></div><div class="csharpcode"><pre><span class="lnum">   2:  </span> </pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">   3:  </span>import javax.servlet.http.HttpSession;</pre></div><div class="csharpcode"><pre><span class="lnum">   4:  </span>import javax.servlet.http.HttpSessionBindingListener;</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">   5:  </span>import javax.servlet.http.HttpSessionBindingEvent;</pre></div><div class="csharpcode"><pre><span class="lnum">   6:  </span>import java.util.Hashtable;</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">   7:  </span>import java.util.Enumeration;</pre></div><div class="csharpcode"><pre><span class="lnum">   8:  </span> </pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">   9:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> LoginManager implements HttpSessionBindingListener</pre></div><div class="csharpcode"><pre><span class="lnum">  10:  </span>{</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  11:  </span>    <span class="kwrd">private</span> <span class="kwrd">static</span> LoginManager loginManager = <span class="kwrd">null</span>;</pre></div><div class="csharpcode"><pre><span class="lnum">  12:  </span>    <span class="kwrd">private</span> <span class="kwrd">static</span> Hashtable loginUsers = <span class="kwrd">new</span> Hashtable();</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  13:  </span>    <span class="kwrd">private</span> LoginManager()</pre></div><div class="csharpcode"><pre><span class="lnum">  14:  </span>    {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  15:  </span>                  super();</pre></div><div class="csharpcode"><pre><span class="lnum">  16:  </span>    }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  17:  </span>    <span class="kwrd">public</span> <span class="kwrd">static</span> synchronized LoginManager getInstance()</pre></div><div class="csharpcode"><pre><span class="lnum">  18:  </span>    {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  19:  </span>        <span class="kwrd">if</span>(loginManager == <span class="kwrd">null</span>)</pre></div><div class="csharpcode"><pre><span class="lnum">  20:  </span>        {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  21:  </span>            loginManager = <span class="kwrd">new</span> LoginManager();</pre></div><div class="csharpcode"><pre><span class="lnum">  22:  </span>        }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  23:  </span>        <span class="kwrd">return</span> loginManager;</pre></div><div class="csharpcode"><pre><span class="lnum">  24:  </span>    }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  25:  </span>    </pre></div><div class="csharpcode"><pre><span class="lnum">  26:  </span>    <span class="rem">//아이디가 맞는지 체크</span></pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  27:  </span>    <span class="kwrd">public</span> boolean isValid(String userID, String userPW)</pre></div><div class="csharpcode"><pre><span class="lnum">  28:  </span>    {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  29:  </span>        <span class="kwrd">return</span> <span class="kwrd">true</span>;   <span class="rem">//자세한 로직은 미구현</span></pre></div><div class="csharpcode"><pre><span class="lnum">  30:  </span>    }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  31:  </span>    </pre></div><div class="csharpcode"><pre><span class="lnum">  32:  </span>    <span class="rem">//해당 세션에 이미 로그인 되있는지 체크</span></pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  33:  </span>    <span class="kwrd">public</span> boolean isLogin(String sessionID)</pre></div><div class="csharpcode"><pre><span class="lnum">  34:  </span>    {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  35:  </span>        boolean isLogin = <span class="kwrd">false</span>;</pre></div><div class="csharpcode"><pre><span class="lnum">  36:  </span>        Enumeration e = loginUsers.keys();</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  37:  </span>        String key = <span class="str">""</span>;</pre></div><div class="csharpcode"><pre><span class="lnum">  38:  </span>        <span class="kwrd">while</span>(e.hasMoreElements())</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  39:  </span>        {</pre></div><div class="csharpcode"><pre><span class="lnum">  40:  </span>            key = (String)e.nextElement();</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  41:  </span>            <span class="kwrd">if</span>(sessionID.equals(key))</pre></div><div class="csharpcode"><pre><span class="lnum">  42:  </span>            {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  43:  </span>                isLogin = <span class="kwrd">true</span>;</pre></div><div class="csharpcode"><pre><span class="lnum">  44:  </span>            }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  45:  </span>        }</pre></div><div class="csharpcode"><pre><span class="lnum">  46:  </span>        <span class="kwrd">return</span> isLogin;</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  47:  </span>    }</pre></div><div class="csharpcode"><pre><span class="lnum">  48:  </span>    </pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  49:  </span>    <span class="rem">//중복 로그인 막기 위해 아이디 사용중인지 체크</span></pre></div><div class="csharpcode"><pre><span class="lnum">  50:  </span>    <span class="kwrd">public</span> boolean isUsing(String userID)</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  51:  </span>    {</pre></div><div class="csharpcode"><pre><span class="lnum">  52:  </span>        boolean isUsing = <span class="kwrd">false</span>;</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  53:  </span>        Enumeration e = loginUsers.keys();</pre></div><div class="csharpcode"><pre><span class="lnum">  54:  </span>        String key = <span class="str">""</span>;</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  55:  </span>        <span class="kwrd">while</span>(e.hasMoreElements())</pre></div><div class="csharpcode"><pre><span class="lnum">  56:  </span>        {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  57:  </span>            key = (String)e.nextElement();</pre></div><div class="csharpcode"><pre><span class="lnum">  58:  </span>            <span class="kwrd">if</span>(userID.equals(loginUsers.get(key)))</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  59:  </span>            {</pre></div><div class="csharpcode"><pre><span class="lnum">  60:  </span>                isUsing = <span class="kwrd">true</span>;</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  61:  </span>            }</pre></div><div class="csharpcode"><pre><span class="lnum">  62:  </span>        }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  63:  </span>        <span class="kwrd">return</span> isUsing;</pre></div><div class="csharpcode"><pre><span class="lnum">  64:  </span>    }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  65:  </span>    </pre></div><div class="csharpcode"><pre><span class="lnum">  66:  </span>    <span class="rem">//세션 생성</span></pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  67:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> setSession(HttpSession session, String userID)</pre></div><div class="csharpcode"><pre><span class="lnum">  68:  </span>    {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  69:  </span>        loginUsers.put(session.getId(), userID);</pre></div><div class="csharpcode"><pre><span class="lnum">  70:  </span>        session.setAttribute(<span class="str">"login"</span>, <span class="kwrd">this</span>.getInstance());</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  71:  </span>    }</pre></div><div class="csharpcode"><pre><span class="lnum">  72:  </span>    </pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  73:  </span>    <span class="rem">//세션 성립될 때</span></pre></div><div class="csharpcode"><pre><span class="lnum">  74:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> valueBound(HttpSessionBindingEvent <span class="kwrd">event</span>)</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  75:  </span>    {</pre></div><div class="csharpcode"><pre><span class="lnum">  76:  </span>    }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  77:  </span>    </pre></div><div class="csharpcode"><pre><span class="lnum">  78:  </span>    <span class="rem">//세션 끊길때</span></pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  79:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> valueUnbound(HttpSessionBindingEvent <span class="kwrd">event</span>)</pre></div><div class="csharpcode"><pre><span class="lnum">  80:  </span>    {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  81:  </span>        loginUsers.remove(<span class="kwrd">event</span>.getSession().getId());</pre></div><div class="csharpcode"><pre><span class="lnum">  82:  </span>    }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  83:  </span>    </pre></div><div class="csharpcode"><pre><span class="lnum">  84:  </span>    <span class="rem">//세션 ID로 로긴된 ID 구분</span></pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  85:  </span>    <span class="kwrd">public</span> String getUserID(String sessionID)</pre></div><div class="csharpcode"><pre><span class="lnum">  86:  </span>    {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  87:  </span>        <span class="kwrd">return</span> (String)loginUsers.get(sessionID);</pre></div><div class="csharpcode"><pre><span class="lnum">  88:  </span>    }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  89:  </span>    </pre></div><div class="csharpcode"><pre><span class="lnum">  90:  </span>    <span class="rem">//현재 접속자수</span></pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  91:  </span>    <span class="kwrd">public</span> <span class="kwrd">int</span> getUserCount()</pre></div><div class="csharpcode"><pre><span class="lnum">  92:  </span>    {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  93:  </span>        <span class="kwrd">return</span> loginUsers.size();</pre></div><div class="csharpcode"><pre><span class="lnum">  94:  </span>    }</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  95:  </span>};</pre></div><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><ul><li><strong>Bind_login.jsp</strong> </li></ul><div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span><span class="asp">&lt;%@ page contentType="text/html;charset=euc-kr" import="cookie.LoginManager"%&gt;</span></pre><pre><span class="lnum">   2:  </span><span class="asp">&lt;%</span> LoginManager loginManager = LoginManager.getInstance(); <span class="asp">%&gt;</span></pre><pre class="alt"><span class="lnum">   3:  </span><span class="kwrd">&lt;</span><span class="html">html</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   4:  </span><span class="kwrd">&lt;</span><span class="html">body</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:  </span><span class="kwrd">&lt;</span><span class="html">center</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   6:  </span>현재 접속자수 : <span class="asp">&lt;%</span>= loginManager.getUserCount() <span class="asp">%&gt;</span><span class="kwrd">&lt;</span><span class="html">p</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   7:  </span><span class="kwrd">&lt;</span><span class="html">hr</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   8:  </span><span class="asp">&lt;%</span></pre><pre class="alt"><span class="lnum">   9:  </span>    <span class="kwrd">if</span>(loginManager.isLogin(session.getId()))  <span class="rem">//세션 아이디가 로그인 중이면</span></pre><pre><span class="lnum">  10:  </span>    {</pre><pre class="alt"><span class="lnum">  11:  </span>        <span class="kwrd">out</span>.println(loginManager.getUserID(session.getId())</pre><pre><span class="lnum">  12:  </span>        +<span class="str">"님 안녕하세요&lt;br&gt;"</span>+<span class="str">"&lt;a href=bind_logout.jsp&gt;로그아웃&lt;/a&gt;"</span>);</pre><pre class="alt"><span class="lnum">  13:  </span>    }</pre><pre><span class="lnum">  14:  </span>    <span class="kwrd">else</span>  <span class="rem">//그렇지 않으면 로그인 할 수 있도록</span></pre><pre class="alt"><span class="lnum">  15:  </span>    {</pre><pre><span class="lnum">  16:  </span><span class="asp">%&gt;</span></pre><pre class="alt"><span class="lnum">  17:  </span><span class="kwrd">&lt;</span><span class="html">form</span> <span class="attr">name</span><span class="kwrd">="login"</span> <span class="attr">action</span><span class="kwrd">="bind_login_ok.jsp"</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">  18:  </span>아이디: <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">type</span><span class="kwrd">="text"</span> <span class="attr">name</span><span class="kwrd">="userID"</span><span class="kwrd">&gt;&lt;</span><span class="html">br</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  19:  </span>비밀번호: <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">type</span><span class="kwrd">="text"</span> <span class="attr">name</span><span class="kwrd">="userPW"</span><span class="kwrd">&gt;&lt;</span><span class="html">br</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">  20:  </span><span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">type</span><span class="kwrd">="submit"</span> <span class="attr">value</span><span class="kwrd">="로그인"</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  21:  </span><span class="kwrd">&lt;/</span><span class="html">form</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">  22:  </span><span class="asp">&lt;%</span>}<span class="asp">%&gt;</span></pre><pre class="alt"><span class="lnum">  23:  </span><span class="kwrd">&lt;/</span><span class="html">center</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">  24:  </span><span class="kwrd">&lt;/</span><span class="html">body</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">  25:  </span><span class="kwrd">&lt;/</span><span class="html">html</span><span class="kwrd">&gt;</span></pre></div><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><ul><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><li><strong>Bind_login_ok.jsp</strong> </li></ul><div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span><span class="asp">&lt;%@ page contentType="text/html;charset=euc-kr" import="cookie.LoginManager"%&gt;</span></pre></div><div class="csharpcode"><pre><span class="lnum">   2:  </span><span class="asp">&lt;%</span> LoginManager loginManager = LoginManager.getInstance(); <span class="asp">%&gt;</span></pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">   3:  </span><span class="asp">&lt;%</span></pre></div><div class="csharpcode"><pre><span class="lnum">   4:  </span>request.setCharacterEncoding(<span class="str">"euc-kr"</span>);</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">   5:  </span>&nbsp;</pre></div><div class="csharpcode"><pre><span class="lnum">   6:  </span>String userID = request.getParameter(<span class="str">"userID"</span>);</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">   7:  </span>String userPW = request.getParameter(<span class="str">"userPW"</span>);</pre></div><div class="csharpcode"><pre><span class="lnum">   8:  </span>&nbsp;</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">   9:  </span><span class="kwrd">if</span>(loginManager.isValid(userID, userPW))</pre></div><div class="csharpcode"><pre><span class="lnum">  10:  </span>{</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  11:  </span>    <span class="kwrd">if</span>(!loginManager.isUsing(userID))</pre></div><div class="csharpcode"><pre><span class="lnum">  12:  </span>    {</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  13:  </span>        loginManager.setSession(session, userID);</pre></div><div class="csharpcode"><pre><span class="lnum">  14:  </span>        response.sendRedirect(<span class="str">"bind_login.jsp"</span>);</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  15:  </span>    }</pre></div><div class="csharpcode"><pre><span class="lnum">  16:  </span>    <span class="kwrd">else</span></pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  17:  </span>    {</pre></div><div class="csharpcode"><pre><span class="lnum">  18:  </span>        <span class="kwrd">throw</span> <span class="kwrd">new</span> Exception(<span class="str">"이미 로그인중"</span>);</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  19:  </span>    }</pre></div><div class="csharpcode"><pre><span class="lnum">  20:  </span>}</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  21:  </span><span class="kwrd">else</span></pre></div><div class="csharpcode"><pre><span class="lnum">  22:  </span>{</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  23:  </span>    <span class="kwrd">throw</span> <span class="kwrd">new</span> Exception(<span class="str">"ID/PW 이상"</span>);</pre></div><div class="csharpcode"><pre><span class="lnum">  24:  </span>}</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">  25:  </span><span class="asp">%&gt;</span></pre></div><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><ul><li><strong>Bind_logout.jsp</strong> </li></ul><div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span>&lt;%@ page contentType=<span class="str">"text/html;charset=euc-kr"</span>%&gt;</pre></div><div class="csharpcode"><pre><span class="lnum">   2:  </span>&lt;%</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">   3:  </span>    session.invalidate();</pre></div><div class="csharpcode"><pre><span class="lnum">   4:  </span>    response.sendRedirect(<span class="str">"bind_login.jsp"</span>);</pre></div><div class="csharpcode"><pre class="alt"><span class="lnum">   5:  </span>%&gt;</pre></div>			 ]]> 
		</description>
		<category>{ Codez }</category>

		<comments>http://xuny.egloos.com/2476933#comments</comments>
		<pubDate>Fri, 20 Nov 2009 06:28:53 GMT</pubDate>
		<dc:creator>xuny</dc:creator>
	</item>
	<item>
		<title><![CDATA[ insertAdjacentHTML ]]> </title>
		<link>http://xuny.egloos.com/2460400</link>
		<guid>http://xuny.egloos.com/2460400</guid>
		<description>
			<![CDATA[ 
   insertAdjacentHTML<br />
<br />
종류: - 적용: object(a, acronym, address, ...) <br />
<br />
 <br />
<br />
지정된 위치에 HTML 문자열을 삽입한다.<br />
<br />
MethodSyntax();<br />
<br />
 Script object.insertAdjacentHTML(sLoc,sText) <br />
<br />
인수/파라메터<br />
sLoc<br />
필수적인 요소이며, HTML 문자열을 삽입할 위치를 나타내는 문자열이다. beforeBegin HTML 문자열 sText를 개체의 바로 전에 삽입한다. <br />
afterBegin HTML 문자열 sText를 개체가 시작되고 모든 다른 내용들 전에 삽입한다. <br />
beforeEnd HTML 문자열 sText를 개체가 종료되기 전에 모든 다른 내용들 다음에 삽입한다. <br />
afterEnd HTML 문자열 sText를 개체가 종료된 바로 다음에 삽입한다. <br />
<br />
sText<br />
필수적인 요소이며, 삽입될 지정된 HTML 문자열이다. 문자열은 텍스트와 HTML 태그를 혼합할 수 있다. HTML 문자열이 유효하지 않으면 이 메서드는 실패할 것이다.<br />
<br />
반환값<br />
반환값은 없다.<br />
<br />
 <br />
<br />
특기<br />
텍스트가 HTML 태그를 포함하고 있으면, 이 메서드는 파스(parse)하고 택스트를 삽입한 상태로 양식화 한다.<br />
<br />
문서가 로딩되는 동안에는 삽입할 수 없다.<br />
이 메서드를 사용하기 위해서는 onload가 발생될 떄까지 기다려야 한다.<br />
<br />
insertAdjacentHTML 메서드를 스크립트를 삽입하는데 사용할 때, script 엘레멘트의 defer 애트리부트를 설정하여야 한다.<br />
			 ]]> 
		</description>

		<comments>http://xuny.egloos.com/2460400#comments</comments>
		<pubDate>Thu, 29 Oct 2009 00:59:57 GMT</pubDate>
		<dc:creator>xuny</dc:creator>
	</item>
	<item>
		<title><![CDATA[ [HTML]텍스트로 인해 테이블이 늘어나는 것을 방지 ]]> </title>
		<link>http://xuny.egloos.com/2445314</link>
		<guid>http://xuny.egloos.com/2445314</guid>
		<description>
			<![CDATA[ 
  <p><span style="COLOR: #177fcd; FONT-SIZE: 100%">테이블 안에 내용이 길거나 스페이스가 없어 자동으로 줄바꿈이 되지 않을때 테이블 또는 셀 자체가 늘어나는 경우가 많다.</span></p><p><span style="COLOR: #177fcd; FONT-SIZE: 100%">셀에 스타일을 적용해서 원하는 크기를 유지할 수 있다.</span></p><p><span style="FONT-SIZE: 100%"></span>&nbsp;</p><p><span style="FONT-SIZE: 100%">&lt;td width="350" style='word-break:break-all'&gt;</span></p><p style="MARGIN: 15px 0px 0px">출처 : <a title="제목 부분을 클릭하면&#10;원 게시물을 볼 수 있습니다." href="http://tong.nate.com/boxitem/post.do?action=read&amp;_boxID=1104263&amp;_tongID=283716&amp;_boxItemID=23114914&amp;_reloadTag=y" target="_new">Tong - 민뎅님의 javascript통</a></p>			 ]]> 
		</description>
		<category>{ Computer }</category>

		<comments>http://xuny.egloos.com/2445314#comments</comments>
		<pubDate>Fri, 09 Oct 2009 07:42:23 GMT</pubDate>
		<dc:creator>xuny</dc:creator>
	</item>
	<item>
		<title><![CDATA[ SVN (subversion) ]]> </title>
		<link>http://xuny.egloos.com/2210344</link>
		<guid>http://xuny.egloos.com/2210344</guid>
		<description>
			<![CDATA[ 
  <strong>subversion</strong> 홈페이지 : <a href="http://subversion.tigris.org/">http://subversion.tigris.org/</a><br />
<br />
<strong><span style="FONT-SIZE: 130%">1. subversion 다운로드</span></strong><br />
<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100">http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100</a><br />
<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91">http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91</a><br />
둥중에 하나에서 최선버젼을 찾아 다운로드 한다. 목록이 쭈루룩 나오는데.. 그중에서 잘 골라서 다운받는다.<br />
위에 링크는 Apache 2.2.x 라고 하고, 아래는 Apache 2.0.x 라고 하나 둘이 무슨차이가 있는지 전혀 모르겠다.<br />
그래서 위에 링크에서 최신버젼을 찾기로 했다. 왠지 그냥...<br />
<br />
매우 다양한 버젼이 존재하나, install 패키지를 다운받아 사용하기로 했다.<br />
위 링크에서 전체를 선택하고. 검색어에 .exe 나, .msi 로 필터링한 결과에서 최신버젼을 찾은 결과<br />
설치할 프로그램을 얘로 결정이 되었다.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds11.egloos.com/pds/200901/21/87/d0029487_4976d173663c9.png" width="500" height="56.6318926975" onclick="Control.Modal.openDialog(this, event, 'http://pds11.egloos.com/pds/200901/21/87/d0029487_4976d173663c9.png');" /><br />
<br />
<strong><span style="FONT-SIZE: 130%">2. 설치</span></strong><br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds14.egloos.com/pds/200901/21/87/d0029487_4976d1d4d1e83.png" width="499" height="392" onclick="Control.Modal.openDialog(this, event, 'http://pds14.egloos.com/pds/200901/21/87/d0029487_4976d1d4d1e83.png');" /><br />
그냥 next 만 지겹게 누르면 설치 완료<br />
<br />
<strong><span style="FONT-SIZE: 130%">3. 저장소 만들기</span></strong><br />
저장소를 만들기 전에 저장소들을 저장할 폴더를 "D:\xuny_svn_datas" 라고 만든다.<br />
그 다음.. 저장소들을 저장할 폴더로 이동한 후 그곳에 "xframe_prj" 이란 이름의 저장소를 만든다.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds14.egloos.com/pds/200901/21/87/d0029487_4976d53327d3a.png" width="500" height="152.654867257" onclick="Control.Modal.openDialog(this, event, 'http://pds14.egloos.com/pds/200901/21/87/d0029487_4976d53327d3a.png');" /><br />
탐색기에서 확인해 보면 저장소가 생긴걸 확인할 수 있는데.. 더 잘 확인하기 위해서.. 아래처럼 체크아웃 한번 해본다.<br />
아래 그림처럼 체크아웃된 리비젼 0 이라고 나오면 정상 상태.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds13.egloos.com/pds/200901/21/87/d0029487_4976d63677f73.png" width="500" height="103.982300885" onclick="Control.Modal.openDialog(this, event, 'http://pds13.egloos.com/pds/200901/21/87/d0029487_4976d63677f73.png');" /><br />
<br />
<strong><span style="FONT-SIZE: 130%">4. 환경설정</span></strong><br />
탐색기로 위에서 생성한 저장소 폴더에 가보면 conf 라는 폴더가 생성되어 있다. 그 안을 살펴보면.. 이딴 파일들이 있다.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds11.egloos.com/pds/200901/21/87/d0029487_4976d730442b9.png" width="500" height="200.757575758" onclick="Control.Modal.openDialog(this, event, 'http://pds11.egloos.com/pds/200901/21/87/d0029487_4976d730442b9.png');" /><br />
빨간 똥그라미 쳐진 두 파일들을 조금 수정을 해 주어야 한다.<br />
<br />
[svnserve.conf]<br />
<pre class="xcode">### This file controls the configuration of the svnserve daemon, if you<br />
### use it to allow access to this repository.&nbsp; (If you only allow<br />
### access through http: and/or file: URLs, then this file is<br />
### irrelevant.)<br />
 <br />
### Visit <a href="http://subversion.tigris.org/">http://subversion.tigris.org/</a> for more information.<br />
 <br />
[general]<br />
### These options control access to the repository for unauthenticated<br />
### and authenticated users.&nbsp; Valid values are "write", "read",<br />
### and "none".&nbsp; The sample settings below are the defaults.<br />
<strong><span style="COLOR: #cc0000">anon-access = read<br />
auth-access = write</span></strong><br />
### The password-db option controls the location of the password<br />
### database file.&nbsp; Unless you specify a path starting with a /,<br />
### the file's location is relative to the directory containing<br />
### this configuration file.<br />
### If SASL is enabled (see below), this file will NOT be used.<br />
### Uncomment the line below to use the default password file.<br />
<strong><span style="COLOR: #cc0000">password-db = passwd</span></strong><br />
### The authz-db option controls the location of the authorization<br />
### rules for path-based access control.&nbsp; Unless you specify a path<br />
### starting with a /, the file's location is relative to the the<br />
### directory containing this file.&nbsp; If you don't specify an<br />
### authz-db, no path-based access control is done.<br />
### Uncomment the line below to use the default authorization file.<br />
# <strong><span style="COLOR: #3366ff">authz-db = authz</span></strong><br />
### This option specifies the authentication realm of the repository.<br />
### If two repositories have the same authentication realm, they should<br />
### have the same password database, and vice versa.&nbsp; The default realm<br />
### is repository's uuid.<br />
<strong><span style="COLOR: #cc0000">realm = Here is xuny's Repository</span></strong><br />
 <br />
[sasl]<br />
### This option specifies whether you want to use the Cyrus SASL<br />
### library for authentication. Default is false.<br />
### This section will be ignored if svnserve is not built with Cyrus<br />
### SASL support; to check, run 'svnserve --version' and look for a line<br />
### reading 'Cyrus SASL authentication is available.'<br />
# use-sasl = true<br />
### These options specify the desired strength of the security layer<br />
### that you want SASL to provide. 0 means no encryption, 1 means<br />
### integrity-checking only, values larger than 1 are correlated<br />
### to the effective key length for encryption (e.g. 128 means 128-bit<br />
### encryption). The values below are the defaults.<br />
# min-encryption = 0<br />
# max-encryption = 256<br />
</pre>위 파일에 빨간색 칠해진 부분이 수정한 부분이다.<br />
anon-access = read : 일반유저의 접근권한<br />
auth-access = write : 인증유저의 접근권한<br />
password-db = passwd : 사용자(인증유저)의 패스워드가 있는 파일<br />
realm = Here is xuny's Repository : 저장소 인증시 나오는 타이틀<br />
그룹 사용자로 묶고자 한다면 파란색 부분, authz-db 의 주석을 해제하고, authz 파일을 수정하면 된다.<br />
<br />
[passwd]<br />
<pre class="xcode">### This file is an example password file for svnserve.<br />
### Its format is similar to that of svnserve.conf. As shown in the<br />
### example below it contains one section labelled [users].<br />
### The name and password for each user follow, one account per line.<br />
 <br />
[users]<br />
<strong><span style="COLOR: #cc0000">harry = harrypw<br />
sally = sallypw</span></strong><br />
</pre>빨간 부분.. 해리의 비밀번호는 harrypw 구나.ㅋ 사용자가 추가되면 아래로 쭉 써나가면 됨.<br />
<br />
<strong><span style="FONT-SIZE: 130%">5. SVN 서버의 실행</span></strong><br />
아래 그림과 같이 svnserve 를 실행한다. 마지막 인자는 저장소들이 있는 폴더의 절대경로이다.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds11.egloos.com/pds/200901/21/87/d0029487_4976dc601c521.png" width="500" height="115.781710914" onclick="Control.Modal.openDialog(this, event, 'http://pds11.egloos.com/pds/200901/21/87/d0029487_4976dc601c521.png');" /><br />
위와 같이 실행하면 xuny_svn_datas 폴더 아래의 모든 저장소들에 대한 서비스가 이루어진다.<br />
만약에 xuny_svn_datas/xframe_prj 저장소만 서비스하려면 당연히 이렇게 실행하면 된다.<br />
<pre class="xcode">D:\&gt;svnserve -d -r D:\xuny_svn_datas\xframe_prj<br />
</pre>아쉬운점은 SVN 서버가 실행되고 있을동안 항상 저 시커먼 창이 떠 있어야 한다는 것이다. 여간 보기흉한게 아니다.<br />
<br />
서버가 잘 돌아가고 있는지 확인을 해보자.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds11.egloos.com/pds/200901/21/87/d0029487_497702bba73d1.png" width="500" height="161.290322581" onclick="Control.Modal.openDialog(this, event, 'http://pds11.egloos.com/pds/200901/21/87/d0029487_497702bba73d1.png');" /><br />
D:\ 에 SVN 서버에 있는 xframe_prj 를 체크아웃하였다. 체그아웃 메시지가 위처럼 정상적으로 나온다면 정상 상태.<br />
정상적이면 위 명령에서 SVN 서버에 있는 xframe_prj 가 D:\ 로 다운로드가 된다.<br />
저장소가 두개 이상 생성되어 있을 경우 만약 명령을<br />
<pre class="xcode">D:\&gt;svn checkout svn://127.0.0.1<br />
</pre>처럼 했다면 리파지토리에 있는 모든 저장소에 대한 다운로드가 이루어졌을 것이다.<br />
얘는 테스트를 위한 작업이니.. 위 작업을 따라 했다면 D:\xframe_prj 폴더를 통채로 지우자.<br />
<br />
<strong><span style="FONT-SIZE: 130%">6. SVN 서버를 자동으로 실행</span></strong><br />
조금 전에 말했듯이 SVN 서버를 돌리는 모습은 제정신으로 보고있기가 힘들다.<br />
여기 똑똑한 누군가가 만들어 논 훌륭한 프로그램이 있다.<br />
<a href="http://www.pyrasis.com/main/SVNSERVEManager">SVNSERVE Manager</a><br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds13.egloos.com/pds/200901/21/87/d0029487_4977091fc6ff9.png" width="300" height="208" onclick="Control.Modal.openDialog(this, event, 'http://pds13.egloos.com/pds/200901/21/87/d0029487_4977091fc6ff9.png');" /><br />
홈페이지를 살펴보니 꽤 오랫동안 업데이트가 되지않고 있는것 같아 사라질지 모르니 프로그램을 올려놓아야 겠다.<br />
설치 : <a href="http://pds13.egloos.com/pds/200901/21/87/SVNManager-1.1.1-Setup.msi">SVNManager-1.1.1-Setup.msi</a><br />
압축 : <a href="http://pds13.egloos.com/pds/200901/21/87/SVNManager-1.1.1.zip">SVNManager-1.1.1.zip</a><br />
사용방법은 따로 설명하지 않겠다. 그냥 사용하면 되니까..<br />
<br />
<strong><span style="FONT-SIZE: 130%">7. subversion 과 apache</span></strong><br />
설명 진짜 쥰뇌 잘된 싸이트 링크하겠음!<br />
<a href="http://www.pyrasis.com/main/Subversion-HOWTO">http://www.pyrasis.com/main/Subversion-HOWTO</a><br />
<br />
<br />
SVN 클라이언트 이클립스 플러그인... (Eclipse Update site URL 에 유의할 것)<br />
<a href="http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA">http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA</a><br />
<a href="http://blog.naver.com/sungback?Redirect=Log&amp;logNo=90026224453">http://blog.naver.com/sungback?Redirect=Log&amp;logNo=90026224453</a><br />
그밖에...<br />
<a href="http://neodreamer.tistory.com/106">http://neodreamer.tistory.com/106</a><br />
<a href="http://neodreamer.tistory.com/104">http://neodreamer.tistory.com/104</a><br />
<a href="http://neodreamer.tistory.com/107">http://neodreamer.tistory.com/107</a><br />
<br />
SVN 에서 폴더 수정/삭제 (update -&gt; commit)<br />
<a href="http://osdir.com/ml/version-control.subversion.subclipse.user/2006-08/msg00037.html">http://osdir.com/ml/version-control.subversion.subclipse.user/2006-08/msg00037.html</a>			 ]]> 
		</description>
		<category>{ Computer }</category>

		<comments>http://xuny.egloos.com/2210344#comments</comments>
		<pubDate>Tue, 01 Sep 2009 04:52:00 GMT</pubDate>
		<dc:creator>xuny</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Jeus 5.0 시작, 종료 스크립트 ]]> </title>
		<link>http://xuny.egloos.com/2411551</link>
		<guid>http://xuny.egloos.com/2411551</guid>
		<description>
			<![CDATA[ 
  시작은.<br />
<pre class="xcode">jeus -xml -Uadministrator -Pjeusadmin</pre><br />
종료는.<br />
<pre class="xcode">jeusadmin xuny-com -Uadministrator -Pjeusadmin jeusexit</pre><br />
hot deploy.<br />
<pre class="xcode">ejbadmin xuny-com_mis -Uadministrator -Pjeusadmin reload ${project_name}</pre><br />
<br />
위는.. 다음을 한꺼번에 처리하는 것 임.<br />
<br />
시작.<br />
prompt1&gt; jeus.cmd (jeus manager process 가동)<br />
<br />
prompt2&gt; jeusadmin xuny-com (해당노드로 로그인)<br />
nodename&gt; administrator/jeusadmin<br />
nodename&gt; boot (로그인한 노드의 엔진컨테이너들 가동)<br />
nodename&gt; down (로그인한 노드의 엔진컨테이너들 종료)<br />
nodename&gt; jeusexit (jeus.cmd 로 가동한 manager 종료)<br />
nodename&gt; exit (prompt로 나옴)<br />
			 ]]> 
		</description>

		<comments>http://xuny.egloos.com/2411551#comments</comments>
		<pubDate>Fri, 28 Aug 2009 04:57:58 GMT</pubDate>
		<dc:creator>xuny</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 이글루스에서 javascript 사용하기 ]]> </title>
		<link>http://xuny.egloos.com/2270496</link>
		<guid>http://xuny.egloos.com/2270496</guid>
		<description>
			<![CDATA[ 
  <blockquote>이글루스에서는 기본적으로 &lt;script&gt; 태그를 입력 할 수 없다.<br />
그런데 이 태그를 다음과 같이 작성하면 &lt;script&gt; 태그와 동일하게 동작하게 할 수 있다.<br />
<pre class="xcode"><span style="color:#cc0000;">&lt;script xuny="&lt;&gt;"&gt;</span> (javascript 소스..) <span style="color:#cc0000;">&lt;/script xuny="&lt;&gt;"&gt;</span></pre></blockquote><br />
<script xuny="<>" type="text/javascript">function foo() { alert('hello world!'); }</script xuny="<>"><a href="javascript:foo();">click me!</a><br />
위 링크를 클릭하면 alert 창이 뜨는 것을 확인할 수 있다.. 앗싸.. 자바스크립트를 실행했다.<br />
소스는 아래와 같다.<br />
<pre class="xcode">&lt;script xuny="&lt;&gt;" type="text/javascript"&gt;<br />
    function foo() {<br />
        alert('hello world!');<br />
    }<br />
&lt;/script xuny="&lt;&gt;"&gt;<br />
&lt;a href="javascript:foo();"&gt;click me!&lt;/a&gt;</pre><br />
이글루스에서 자바스크립트를 사용하는데 주의 할 점이 있다.<br />
<br />
먼저,<br />
<strong>글쓰기 화면에서 반드시 html 입력 모드로 글을 작성하여야 한다는 것.</strong><br />
열심히 포스트를 작성하고도 한번 [에디터 입력] 탭을 클릭하게 되면 작성한 자바스크립트 부분이 다 지워진다.<br />
<br />
두번째.<br />
<strong>script 태그가 시작하고 끝나는 동안 절대 엔터를 치면 안된다. 즉, 줄바꿈을 하면 안된다는 것이다.</strong><br />
고맙게도 이글루스 글쓰기에서는 [html 입력] 모드라 할 지라도 자동으로 <br/> 태그를 넣어주기 때문이다.<br />
그렇다. 위에 적은 소스는 거짓말이였다.. 사실 진짜 소스는 이거다.<br />
<pre class="xcode xscroll">&lt;script xuny="&lt;&gt;" type="text/javascript"&gt; function foo() { alert('hello world!'); } &lt;/script xuny="&lt;&gt;"&gt;&lt;a href="javascript:foo();"&gt;click me!&lt;/a&gt;</pre><br />
<br />
<img width="0" height="0" src="http://images.google.co.kr/images/res_small2.gif" onload="alert('xxxxx');" />			 ]]> 
		</description>
		<category>My...</category>

		<comments>http://xuny.egloos.com/2270496#comments</comments>
		<pubDate>Thu, 27 Aug 2009 09:23:00 GMT</pubDate>
		<dc:creator>xuny</dc:creator>
	</item>
	<item>
		<title><![CDATA[ eclipse 와 weblogic 8.1 의 연동 ]]> </title>
		<link>http://xuny.egloos.com/2398175</link>
		<guid>http://xuny.egloos.com/2398175</guid>
		<description>
			<![CDATA[ 
  <span style="FONT-SIZE: 130%"><strong>Eclipse Galileo Packages</strong></span><br />
WebLogic 으로 WebApplication 을 하나 작성할 일이 생겨서.. 이클립스싸이트에 한번 들어가 봤더니. 새 버젼이 나왔다.<br />
<a href="http://www.eclipse.org/downloads/packages/"><strong>Eclipse Galileo Packages</strong></a><br />
아.. 난 이클립스 프로젝트이름들이 너무 마음에 든다. 나도 나중에 뭐 만들어서 이름 지을일 있으면 이렇게 멋지게 지어야겠다.<br />
<br />
자 그럼 Galileo 에 WebLogic 8.1 을 연결해 보자.<br />
늘상 그래왔듯 eclipse 의 wtp 는 기본적으로 WebLogic 서버를 깔아주지 않으니..<br />
이클립스 전매특허 온라인 플러그인 찾기 기능을 활용해 본다.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200908/16/87/d0029487_4a86ff71b804e.png" width="500" height="255.617977528" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200908/16/87/d0029487_4a86ff71b804e.png');" /><br />
위 다운로드 링크를 클릭만 하면 친절하게 사용가능한 서버들 목록을 인터넷에서 모두 찾아준다.. 착한 놈.<br />
이들 중에서 WebLogic 서버를 찾아서 클릭 &gt; 설치만 하면 된다. 어라 근데 설치할수 없다는 오류만 뜬다.<br />
에러메시지를 보니.. galileo 에서 사용할 수 있는 플러그인이 아닌 놈을 찾아낸 것 같다.<br />
software update site 목록엔 'http://download.oracle.com/otn_software/oepe/ganymede' 주소가 등록되어 있기도 하고 ㅡ.ㅡ<br />
이는 새 버젼을 릴리즈 하면서 미쳐 생각치 못한 간단한 오류같다. 아마 빠른시일 내에 정정 될것이라고 생각한다.<br />
Help &gt; Install New Software 로 들어가서 galileo 전용 weblogic server tool 플러그인을 찾아서 설치해야 한다.<br />
<br />
<blockquote><br />
BEA 를 잡아 삼킨 오라클은 이클립스 플러그인을 지원하고 이클립스 업데이트 싸이트를 이클립스 버젼별로 제공한다.<br />
그 각각의 update site 주소는 다음과 같다.<br />
<span style="COLOR: #990000"><strong>Europa</strong></span> - <a href="http://download.oracle.com/otn_software/oepe/europa">http://download.oracle.com/otn_software/oepe/europa</a><br />
<span style="COLOR: #990000"><strong>Ganymede</strong></span> - <a href="http://download.oracle.com/otn_software/oepe/ganymede">http://download.oracle.com/otn_software/oepe/ganymede</a><br />
<span style="COLOR: #990000"><strong>Galileo</strong></span> - <a href="http://download.oracle.com/otn_software/oepe/galileo">http://download.oracle.com/otn_software/oepe/galileo</a><br />
<strong>참고사이트</strong><br />
<a href="http://www.eclipse.org/downloads/packages/">http://www.eclipse.org/downloads/packages/</a><br />
<a href="http://download.oracle.com/docs/cd/E15315_01/help/oracle.eclipse.tools.common.doc/html/install.html">http://download.oracle.com/docs/cd/E15315_01/help/oracle.eclipse.tools.common.doc/html/install.html</a></blockquote><br />
지금은 Galileo 버젼을 사용중이니 당연히 http://download.oracle.com/otn_software/oepe/galileo 를 추가하고<br />
WebLogic Server Tools 를 선택, 설치한다.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200908/16/87/d0029487_4a870c69c14db.png" width="442" height="136" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200908/16/87/d0029487_4a870c69c14db.png');" /><br />
아래와 같이 서버목록에서 WebLogic 8.1 을 볼 수 있다.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200908/13/87/d0029487_4a8400e35047c.png" width="500" height="548.571428571" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200908/13/87/d0029487_4a8400e35047c.png');" /><br />
<br />
<em>software update 를 사용해서 Weblogic Server 를 설치하는 일은 지금까지도 없었고,<br />
이 작은 오류가 해결되면 앞으로도 없을 것이다.</em><br />
<br />
<span style="FONT-SIZE: 130%"><strong>WebLogic Server Tools plugin</strong></span><br />
오늘 eclipse 에 설치된 WebLogic Server Tools plugin 이 약 1년전에 사용 했던 거랑 조금 다르다는 것을 발견했다.<br />
좀더 확인해본 결과, 버젼업이 된 것이였다.<br />
그런데.. 버젼업이 되었다면, 좀 더 좋아졌어야 하는데 내 눈엔 안좋은 점만 몇가지 보였다.<br />
(WebLogic 8.1 에서만 플러그인의 기능이 제한적이라고 한다. 8.1은 오라클이 아예 사장시킬 생각)<br />
일단, 웹 어플리케이션을 디플로이할때 workspace 에 있는 웹 모듈을 직접 stand-alone 으로 실행할 수 없다.<br />
그 전 버젼에선 직접 디플로이 할지 임시 폴더를 사용할지 옵션을 설정할 수 있었는데.. 얜 무조건 임시폴더로 모듈을 복사한다.<br />
그리고. weblogic.xml 파일을 자동으로 만들어 주지 않는다. 젠장. 사실 이것 때문에 지금 이렇게 포스팅을 하고 있다.<br />
<br />
그래서 난 예전버전을 구해서 사용하기로 했다.<br />
문제는.. 이클립스의 [software update] 나 [Download addtional server adapters] 를 이용해서는 내가 원하는 버젼의 WebLogic Server Tools 플러그인을 설치할 수 없다는 것이다. 그냥 이클립스가 찾은 버젼만 설치가 가능했다.<br />
결국 플러그인만 따로 구해서 직접 설치하는 수 밖에 없다.<br />
다행히 오라클 홈페이지에서 WebLogic Server Tools eclipse plugin 다운로드를 제공한다.<br />
<br />
<a href="http://www.oracle.com/technology/software/products/oepe/index.html">http://www.oracle.com/technology/software/products/oepe/index.html</a><br />
여기서 원하는 버젼의 플러그인을 수동으로 설치하면 되는 것이다.<br />
젤 위에 있는 <u>Oracle Enterprise Pack for Eclipse 11gR1</u> 가 이클립스에서 자동으로 찾아지는 최신버젼(오늘날짜 기준)으로 Ganymede 와 Galileo 에서 사용이 가능한 버젼이다.<br />
가장 아래에 있는 <u>Oracle Enterprise Pack for Eclipse 1.0</u> 이 내가 사용하고자 하는 버젼이다.<br />
얘는 Europa 와 Ganymede 에서 사용이 가능하다.<br />
이 버젼을 사용하기 위해선 이클립스 Galileo 를 사용할 수 없다는 얘기다. 그래서 난 Ganymede 사용할거다.<br />
이제 얘 받아서 직접 플러그인 설치하면 된다. 오예..<br />
<br />
ㅠㅠ.. 헉.. 다운로드 링크가 깨졌다. - <a href="http://www.oracle.com/technology/software/products/oepe/oepe_1.html">http://www.oracle.com/technology/software/products/oepe/oepe_1.html</a><br />
Eclipse 3.3 (Europa) Edition 용 플러그인은 다운로드가 되는데..Eclipse 3.4 (Ganymede) Edition 만 깨졌다. 괴롭다.<br />
<br />
[Download addtional server adapters]를 클릭해서 찾아지는 서버들은 가동중인 이클립스 버젼과 관계가 있어보인다.<br />
그래서 이클립스의 최근 몇개 버젼(<a href="http://wiki.eclipse.org/Older_Versions_Of_Eclipse">http://wiki.eclipse.org/Older_Versions_Of_Eclipse</a>) 에서 모두 시도해 보았다.<br />
이클립스 버젼별로 각각 아래와 같은 플러그인 버젼이 설치되는 것을 확인할 수 있었다. 매우 놀라운 사실이다. O.O<br />
Eclipse Ganymede Packages (3.4.0) 에서는 WebLogic Server Tools 플러그인의 구버젼을 찾아내고 있었다.. 음.. ;;<br />
<br />
Eclipse Ganymede Packages (version 3.4.0) - <strong>Oracle Enterprise Pack for Eclipse 1.0</strong><br />
Eclipse Ganymede SR1 Packages (version 3.4.1) - Oracle Enterprise Pack for Eclipse 11gR1<br />
Eclipse Ganymede SR2 Packages (version 3.4.2) - Oracle Enterprise Pack for Eclipse 11gR1<br />
<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200908/16/87/d0029487_4a871b69bd7fe.png" width="491" height="55" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200908/16/87/d0029487_4a871b69bd7fe.png');" /><br />
[Eclipse Ganymede Packages]<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200908/16/87/d0029487_4a871ba450f6c.png" width="486" height="52" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200908/16/87/d0029487_4a871ba450f6c.png');" /><br />
[Eclipse Ganymede SR1 Packages], [Eclipse Ganymede SR2 Packages]<br />
<br />
Eclipse Ganymede Packages(3.4.0) 가 내가 원하는 버젼의 플러그인을 찾아주었으니, 그냥 얘를 사용하면 된다.<br />
그런데.. 오라클이 WebLogic 8.1 다운로드도 못하게 없애버리고 플러그인 링크도 깨버리고 하는데.. 그냥 얘을 쓴다고 해도 얼마 지나지 않아.. Oracle Enterprise Pack for Eclipse 1.0 을 자동으로 설치하게 해 주지 않을게 틀림없다.<br />
그래서 플러그인을 구할 수 있을 때 백업해 두기로 했다. 아까 오라클 홈페이지에서 받아야 했었지만 링크가 깨져서 못받은 파일을 내가 직접 만드는 것이다.<br />
<br />
<a href="http://pds17.egloos.com/pds/200908/17/87/oepe-ganymede-1.alz">oepe-ganymede-1.alz</a><br />
<a href="http://pds15.egloos.com/pds/200908/17/87/oepe-ganymede-1.a00">oepe-ganymede-1.a00</a><br />
<a href="http://pds17.egloos.com/pds/200908/17/87/oepe-ganymede-1.a01">oepe-ganymede-1.a01</a><br />
오라클 홈페이지에선 링크 깨진.. 하지만 내가 고대로 만든 플러그인..<br />
이 플러그인은 Eclipse Ganymede SR2 Packages 에서는 자동으로 찾아주진 않지만..<br />
Eclipse Ganymede SR2 Packages 에도 설치해서 사용 할 수 있다.<br />
<br />
<br />
<u><strong>※ 이클립스로 weblogic 서버를 가동할 때 주의할 점.</strong></u><br />
이클립스에 등록한 weblogic 서버의 [Add and Remove] 를 사용하여 간편하게 어플리케이션을 배포할 수 있는데..<br />
여기에 Add 를 해논 어플리케이션 프로젝트가 지워지기라도 하는 날엔..<br />
startWebLogic 스크립트가 실행될 때 마다 미친듯이 exception 을 내뱉는다.<br />
게다가 그 있지도 않은 어플리케이션 배포정보를 삭제할 곳은 콘솔화면 그 어느곳에도 없다.<br />
필요없어진 어플리케이션을 지울땐 반드시 이클립스에서 remove를 해서 undeploy 를 하던지.. 콘솔에서 하던지 해야한다.<br />
어쩌다 이렇게 됬다하면.. 해당 도메인의 서버에 배포설정된 그 지워진 어플리케이션을 찾아서 지우던지..<br />
못찾겠으면.. bea/user_projects/domains/ 에 해당도메인을 그냥 지워버리고 새로 하면 된다.<br />
도메인이 하나면 user_projects 디렉토리를 지워버리는게 기분상 좋다.			 ]]> 
		</description>

		<comments>http://xuny.egloos.com/2398175#comments</comments>
		<pubDate>Thu, 13 Aug 2009 12:06:30 GMT</pubDate>
		<dc:creator>xuny</dc:creator>
	</item>
	<item>
		<title><![CDATA[ weblogic 에 EJB모듈(.jar) 한방에 오만개 deploy 하기 ]]> </title>
		<link>http://xuny.egloos.com/2396334</link>
		<guid>http://xuny.egloos.com/2396334</guid>
		<description>
			<![CDATA[ 
  weblogic console 화면에서.. EJB 모듈을 하나씩 디플로이 하자면.. 짜증이 개 날수 밖에 없다.<br />
그래서 한방에 올릴 수 있는 방법을 찾던 중. 비교적 간단한 방법이 있었다.<br />
<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200908/11/87/d0029487_4a812f8ef064b.png" width="357" height="335" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200908/11/87/d0029487_4a812f8ef064b.png');" /><br />
바로 저 선택된 저.. applications 디렉토리에 EJB모듈(.jar) 를 복사해다 놓고..<br />
웹로직을 스타트 하면.. mydomain 이 올라가면서.. 같이 자동으로 디플로이 된다.<br />
<br />
in addition..<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200908/11/87/d0029487_4a81407686f98.png" width="500" height="254.297994269" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200908/11/87/d0029487_4a81407686f98.png');" /><br />
weblogic console 에서.. ejb모듈을 디플로이 하는 방법은 두가지가 있는데..<br />
1) upload your file 을 클릭하면 파일선택 다이알로그를 사용하여 .jar 파일을 선택, 서버로 업로드를 할 수 있다.<br />
그리하면, 선택한 .jar 파일은 맨 위 디렉토리 그림에서 보이는<br />
bea / user_project / domains / mydomain / myserver / upload 디렉토리로 복사가 되고, 디플로이 된다.<br />
2) .jar 파일이 존재하는 경로를 지정해 주는 방식이다.<br />
이렇게 하면 파일은 복사되지 않는다.<br />
<br />
1) 과 2) 방법 마다의 장,단점이 있지만.. 여기서 별로 이야기 하고싶지는 않다.ㅋ			 ]]> 
		</description>

		<comments>http://xuny.egloos.com/2396334#comments</comments>
		<pubDate>Tue, 11 Aug 2009 08:46:29 GMT</pubDate>
		<dc:creator>xuny</dc:creator>
	</item>
	<item>
		<title><![CDATA[ jMonkeyEngin with Eclipse ]]> </title>
		<link>http://xuny.egloos.com/2362673</link>
		<guid>http://xuny.egloos.com/2362673</guid>
		<description>
			<![CDATA[ 
  <strong>1. installing jme_2.x (죽어도 안됨)</strong><br />
<a href="http://www.jmonkeyengine.com/wiki/doku.php?id=downloading_and_installing_jme_2.x">http://www.jmonkeyengine.com/wiki/doku.php?id=downloading_and_installing_jme_2.x</a><br />
<br />
<strong>2, video tutorial - setting up eclipse to build jme_2 (동영상인데, 난 안봤음)</strong><br />
<a href="http://www.jmonkeyengine.com/wiki/doku.php?id=video_tutorial_-_setting_up_eclipse_to_build_jme_2">http://www.jmonkeyengine.com/wiki/doku.php?id=video_tutorial_-_setting_up_eclipse_to_build_jme_2</a><br />
<br />
<strong>3. setting up eclipse 3.4 to build JME2, JMEPhysics2 (됨)</strong><br />
<a href="http://www.jmonkeyengine.com/wiki/doku.php?id=setting_up_eclipse_to_build_jme_2">http://www.jmonkeyengine.com/wiki/doku.php?id=setting_up_eclipse_to_build_jme_2</a><br />
<br />
SVN client 는.. subclipse 를 추천 함.<br />
<a href="http://subclipse.tigris.org/">http://subclipse.tigris.org/</a><br />
<br />
<strong>4. 첫 project [HelloJme] 작성하기</strong><br />
1) 일반 java application 으로 프로젝트 생성<br />
2) 특이사항은 단 하나. jme(라이브러리) 프로젝트를 build path 에 추가하는 것.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds13.egloos.com/pds/200907/02/87/d0029487_4a4c87adb9ff0.png" width="500" height="241.843971631" onclick="Control.Modal.openDialog(this, event, 'http://pds13.egloos.com/pds/200907/02/87/d0029487_4a4c87adb9ff0.png');" /><br />
3) source<br />
<pre class="xcode">package com.jmedemo;<br />
 <br />
import com.jme.app.SimpleGame;<br />
import com.jme.bounding.BoundingBox;<br />
import com.jme.math.Vector3f;<br />
import com.jme.scene.shape.Box;<br />
 <br />
public class HelloJme extends SimpleGame {<br />
&nbsp;   @Override<br />
&nbsp;   protected void simpleInitGame() {<br />
&nbsp;&nbsp;      // TODO Auto-generated method stub<br />
&nbsp;&nbsp;      Box box = new Box("mybox", new Vector3f(), 1, 1, 1);<br />
&nbsp;      &nbsp;box.setModelBound(new BoundingBox());<br />
&nbsp;&nbsp;      box.updateModelBound();<br />
&nbsp;&nbsp;      rootNode.attachChild(box);<br />
&nbsp;   }<br />
&nbsp;<br />
&nbsp;   public static void main(String[] args) {<br />
&nbsp;&nbsp;      HelloJme game = new HelloJme();<br />
&nbsp;&nbsp;      game.setConfigShowMode(ConfigShowMode.NeverShow);<br />
      &nbsp;&nbsp;game.start();<br />
&nbsp;   }<br />
}</pre>			 ]]> 
		</description>

		<comments>http://xuny.egloos.com/2362673#comments</comments>
		<pubDate>Thu, 02 Jul 2009 10:12:19 GMT</pubDate>
		<dc:creator>xuny</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Windows Vista 서비스팩 설치후 백업파일 삭제 ]]> </title>
		<link>http://xuny.egloos.com/2356254</link>
		<guid>http://xuny.egloos.com/2356254</guid>
		<description>
			<![CDATA[ 
  서비스팩을 설치하면 설치 이전상태로 돌릴때 사용될 이전 버젼의 시스템 파일들이 백업된다고 한다.<br />
서비스팩 통합본으로 윈도우즈를 설치해도 이런 파일들이 존재하는지는 잘 모르겠지만..<br />
하여튼..<br />
서비스팩을 설치후 제거하지 않을것이 확실하다면.. 백업된 시스템 파일들을 지워서 디스크 공간을 확보하는게 좋다.<br />
하기 싫으면.. 말던가..<br />
<br />
<strong>비스타 서비스팩1</strong> 의 경우 제거방법은 아래와 같다..<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200906/25/87/d0029487_4a4312ff10838.png" width="500" height="185.131195335" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200906/25/87/d0029487_4a4312ff10838.png');" /><br />
쥰내 간단하다..<br />
<br />
<strong>비스타 서비스팩2</strong><br />
<strike>비스타 서비스팩2 는 내가 안깔아서.. 이미지 캡쳐는 못하는데..</strike><br />
<strong><span style="FONT-FAMILY: Verdana; COLOR: #000099">compcln</span></strong> 라는 프로그램을 실행하면 된다고 한다.<br />
<br />
서비스팩2 깔았다.<br />
<img border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200907/02/87/d0029487_4a4c412ac009a.png" width="420" height="248" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200907/02/87/d0029487_4a4c412ac009a.png');" />			 ]]> 
		</description>

		<comments>http://xuny.egloos.com/2356254#comments</comments>
		<pubDate>Thu, 25 Jun 2009 06:05:37 GMT</pubDate>
		<dc:creator>xuny</dc:creator>
	</item>
</channel>
</rss>
