'분류 전체보기'에 해당되는 글 223건
- 2011.10.18 mybatis 동적쿼리 조건문에 isEmpty, isNotEmpty 를 써보자. 2
- 2011.10.18 WAS(Tomcat 또는 기타등등~) 메모리 사용현황 모니터링 JSP 3
- 2011.10.14 이클립스 상에서 maven 을 이용해 원격서버로 배포하기 3
- 2011.10.13 maven package goal 로 war나 jar 파일 생성시 생성되는 파일명 설정하기
- 2011.10.12 mybatis 쿼리, 쿼리결과 로깅을 위한 log4j.xml 설정
mybatis 동적쿼리 조건문에 isEmpty, isNotEmpty 를 써보자.
mybatis 2011. 10. 18. 12:26
iBatis 에서 mybatis 로 바뀌면서 바뀐것들 중에 하나가 동적쿼리문에서 쓰는 태그들이다.
iBatis 에 있던 <isEqual/> <isNotEqual/> 요런 것들이
mybatis 에서는 <if test="xxx == 'a'"></if> <if test="xxx != 'a'"></if> 요렇게 대체할 수 있어서 쫌더 간결해 진것 같다.
그런데 test="" 요기에서 쓸수 있는 비교연산자들 중에는 null 인지 빈 공백인지 판단하던 <isEmpty/>, <isNotEmpty/> 를 대체할만한 비교연산자가 없었다.
null 인지 공백인지 mybatis 에서 판단하기 위해서는
요렇게 쫏끔 번거롭게 쓸 수 밖에 없는것 같았다. 뭐 더 찾아보진 않았지만~
어째 다른 방법이 없나 쭉 찾아보니까~ 신기하게도 조건문에서 자바 클래스의 메소드를 호출해서 하는 방법이 있었다.
클래스를 하나 맨들고 거기에다 boolean 을 리턴해주는 static 메소드들을 뽓 맨들고 고것을 호출하는 방식이다.
내가 작성해본 클래스는 요렇다.
죠렇게 맨든 클래스를 땡겨다 쓰는 mabatis sql xml 예제는 요렇다.
뭐 쓰고보니 더 복잡해진것 같기도 하고 -_-
아무튼 딸랑 empty 체크하는 거에만 활용해서 그럴수도 있지만, 자바 메소드를 호출할수 있다는 것은 이것저것 활용할데가 많을것 같다.
iBatis 에 있던 <isEqual/> <isNotEqual/> 요런 것들이
mybatis 에서는 <if test="xxx == 'a'"></if> <if test="xxx != 'a'"></if> 요렇게 대체할 수 있어서 쫌더 간결해 진것 같다.
그런데 test="" 요기에서 쓸수 있는 비교연산자들 중에는 null 인지 빈 공백인지 판단하던 <isEmpty/>, <isNotEmpty/> 를 대체할만한 비교연산자가 없었다.
null 인지 공백인지 mybatis 에서 판단하기 위해서는
<if test="xxx == null or xxx == ''"></if>
요렇게 쫏끔 번거롭게 쓸 수 밖에 없는것 같았다. 뭐 더 찾아보진 않았지만~
어째 다른 방법이 없나 쭉 찾아보니까~ 신기하게도 조건문에서 자바 클래스의 메소드를 호출해서 하는 방법이 있었다.
클래스를 하나 맨들고 거기에다 boolean 을 리턴해주는 static 메소드들을 뽓 맨들고 고것을 호출하는 방식이다.
내가 작성해본 클래스는 요렇다.
package stove99.tistory.com; import java.lang.reflect.Array; import java.util.List; import java.util.Map; public class MyComparator { public static boolean isEmpty(Object obj){ if( obj instanceof String ) return obj==null || "".equals(obj.toString().trim()); else if( obj instanceof List ) return obj==null || ((List)obj).isEmpty(); else if( obj instanceof Map ) return obj==null || ((Map)obj).isEmpty(); else if( obj instanceof Object[] ) return obj==null || Array.getLength(obj)==0; else return obj==null; } public static boolean isNotEmpty(String s){ return !isEmpty(s); } }
죠렇게 맨든 클래스를 땡겨다 쓰는 mabatis sql xml 예제는 요렇다.
<select id="testSQL" parameterType="map" resultType="hashmap"> SELECT * FROM TB_TEST WHERE 1=1 <!-- @패키지.클래스명@호출할메소드(파라메터) --> <if test="@stove99.tistory.com.MyComparator@isEmpty(keyword)"> AND KEYWORD = #{keyword} </if> </select>@패키지명.클래스@메소드 요렇게 호출해야 되기 때문에 패키지나 클래스명은 간단하게 명명하면 좋을것 같다.
뭐 쓰고보니 더 복잡해진것 같기도 하고 -_-
아무튼 딸랑 empty 체크하는 거에만 활용해서 그럴수도 있지만, 자바 메소드를 호출할수 있다는 것은 이것저것 활용할데가 많을것 같다.
'mybatis' 카테고리의 다른 글
java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction (0) | 2011.11.28 |
---|---|
mybatis Oracle Procedure 호출하기 (0) | 2011.10.25 |
mybatis 쿼리, 쿼리결과 로깅을 위한 log4j.xml 설정 (0) | 2011.10.12 |
mybatis dynamic query 조건에서 in 조건 사용하기 (0) | 2011.09.06 |
mybatis interceptor 를 이용해서 쿼리로그를 디비에다 저장하기 (2) | 2011.08.29 |
WAS(Tomcat 또는 기타등등~) 메모리 사용현황 모니터링 JSP
Java 2011. 10. 18. 02:59
java.lang.management.ManagementFactory 클래스를 이용하면 현재 실행중인 JVM 의 여러가지 정보를 가져올수 있다.
ManagementFactory 를 통해 가져올수 있는 정보들은 대충 메소드 이름을 보면 알수 있다.
뭐 이것저것 있는것 같은데 다른것들은 나중에 시간되면 한번 써묵어 보도록 해야겠다.
아무튼 쓸 수 있는 여러가지 메소드들중
ManagementFactory.getMemoryMXBean() 메소드와 ManagementFactory.getMemoryPoolMXBeans() 메소드를 이용하면 현재 JVM 의 메모리 사용현황을 조회하는 JSP 페이지를 작성할 수 있다.
맨들 페이지의 최종 모양은 대충 요렇다.
그리고 JSP 솟스~!
이 페이지를 실행하기 위해서는 jstl-1.2.jar 파일을 WEB-INF/lib 폴더에 추가시켜 주면되고,
maven 을 이용하는 경우는 dependencies 에
ManagementFactory 를 통해 가져올수 있는 정보들은 대충 메소드 이름을 보면 알수 있다.
뭐 이것저것 있는것 같은데 다른것들은 나중에 시간되면 한번 써묵어 보도록 해야겠다.
아무튼 쓸 수 있는 여러가지 메소드들중
ManagementFactory.getMemoryMXBean() 메소드와 ManagementFactory.getMemoryPoolMXBeans() 메소드를 이용하면 현재 JVM 의 메모리 사용현황을 조회하는 JSP 페이지를 작성할 수 있다.
맨들 페이지의 최종 모양은 대충 요렇다.
그리고 JSP 솟스~!
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <%@ page import="java.lang.management.ManagementFactory"%> <%@ page import="java.lang.management.MemoryMXBean"%> <% pageContext.setAttribute("memoryBean", ManagementFactory.getMemoryMXBean()); pageContext.setAttribute("poolBeans", ManagementFactory.getMemoryPoolMXBeans()); %> <html> <head> <title>JVM Memory Monitor</title> <style type="text/css"> body{ font-family:"Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; } table{ border-collapse: collapse; } td,th{ padding: 5px; } th { background-color: navy; color: #fff; font-weight: bold; } td { text-align: right; } </style> </head> <body> <h1>TOTAL</h1> <table border="1" width="100%"> <colgroup> <col width="20%"/> <col width="20%"/> <col width="20%"/> <col width="20%"/> <col width="20%"/> </colgroup> <tr> <th>Usage</th> <th>Max</th> <th>Init</th> <th>Used</th> <th>Committed</th> </tr> <tr> <td style="text-align: left">Heap Memory Usage</td> <td><fmt:formatNumber value="${memoryBean.heapMemoryUsage.max/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${memoryBean.heapMemoryUsage.init/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${memoryBean.heapMemoryUsage.used/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${memoryBean.heapMemoryUsage.committed/(1024 * 1024)}" maxFractionDigits="1" />MB</td> </tr> <tr> <td style="text-align: left">Non-heap Memory Usage</td> <td><fmt:formatNumber value="${memoryBean.nonHeapMemoryUsage.max/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${memoryBean.nonHeapMemoryUsage.init/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${memoryBean.nonHeapMemoryUsage.used/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${memoryBean.nonHeapMemoryUsage.committed/(1024 * 1024)}" maxFractionDigits="1" />MB</td> </tr> </table> <hr/> <h1>Memory Pools</h1> <c:forEach var="bean" items="${poolBeans}"> <h2>${bean.name}(${bean.type})</h2> <table border="1" width="100%"> <colgroup> <col width="20%"/> <col width="20%"/> <col width="20%"/> <col width="20%"/> <col width="20%"/> </colgroup> <tr> <th>Usage</th> <th>Max</th> <th>Init</th> <th>Used</th> <th>Committed</th> </tr> <tr> <td style="text-align: left">Memory Usage</td> <td><fmt:formatNumber value="${bean.usage.max/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${bean.usage.init/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${bean.usage.used/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${bean.usage.committed/(1024 * 1024)}" maxFractionDigits="1" />MB</td> </tr> <tr> <td style="text-align: left">Peak Usage</td> <td><fmt:formatNumber value="${bean.peakUsage.max/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${bean.peakUsage.init/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${bean.peakUsage.used/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${bean.peakUsage.committed/(1024 * 1024)}" maxFractionDigits="1" />MB</td> </tr> <tr> <td style="text-align: left">Collection Usage</td> <td><fmt:formatNumber value="${bean.collectionUsage.max/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${bean.collectionUsage.init/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${bean.collectionUsage.used/(1024 * 1024)}" maxFractionDigits="1" />MB</td> <td><fmt:formatNumber value="${bean.collectionUsage.committed/(1024 * 1024)}" maxFractionDigits="1" />MB</td> </tr> </table> </c:forEach> </body> </html>
이 페이지를 실행하기 위해서는 jstl-1.2.jar 파일을 WEB-INF/lib 폴더에 추가시켜 주면되고,
maven 을 이용하는 경우는 dependencies 에
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>을 추가하면 된다.
'Java' 카테고리의 다른 글
Java Map 반복(Iteration)시키는 3가지 방법 (5) | 2011.11.13 |
---|---|
디폴트 패키지에 있는 자바 class 실행하기 ( Could not find the main class 에러날때 ) (1) | 2011.11.09 |
Runtime 에 jar 파일 클래스패스에 추가 시키기 : RuntimeJarLoader (1) | 2011.10.10 |
Jetty Scanner 를 이용한 특정 디렉토리 및 파일 변경사항(delete, change, add) 모니터링하기 (0) | 2011.10.05 |
java.sql.SQLException: Column count doesn't match value count at XXX 가 발생하는 경우 (0) | 2011.09.28 |
이클립스 상에서 maven 을 이용해 원격서버로 배포하기
maven 2011. 10. 14. 02:07
오늘 문득 톰캣을 새로 받을 일이 있어서 톰캣 사이트에 갔다가, 예전부터 있었겠지만 그동안 무심하게 쌩깠던 링크가 문득 눈에 들어왔다.
그것은 바로 톰캣 다운로드 받는 링크 아래 Tomcat Deployer 라는 것이였다.
요즘 개발 막바지라 이것저것 자질구래한걸 수정해달라는 요청사항이 많아서, 수정한다음에 구찮스럽게 자꾸 다시 배포를 해줘야 하는 일이 드럭게 많아졌다.
용써서 잘 맹글어 주는 것에 시간에 투자를 해야 하는데, 쓸데없는 일에 시간을 투자를 해야만 하는것이다.
구찮은걸 극도로 싫어하는 나로써는 그동안 눈에 들어오지도 않던 이 문득 보이는 Deployer 라는게 왠지 땡기기 시작했다. 나의 구세주 같은 느낌.
대충 설명서를 읽어보니 나의 로컬에서 원격서버로 배포를 시켜주는 툴인듯 했다.
그런데 받아서 압축을 풀어보니 요즘 잘 쓰지도 않는 ant 를 이용해서 뭔가를 해주는것 같았다.
그런데 또 나는 잘 쓰지도 않을 뭔가를 또 받아서 압축을 풀고 설치하는게 또 무척이나 구찮게 느껴졌다.
왠지 ant 보다도 훨씬 좋다고 느껴지는 maven에서도 누군가 머리좋은 사람이 반드시 맹글어 놨을거란 신념을 가지고 구글에게 "tomcat deployer maven" 을 찾아주세요! 라고 요청했다.
뭐 역시 뭔가가 있었다.! 고것은 바로 tomcat-maven-plugin !!
maven 을 쓰기 시작하면서 tomcat-maven-plugin 플러그인 어쩌고 하는걸 검색하다가 많이 보았는데 나는 그냥 jetty plugin 처럼 tomcat 으로 서버를 띄어주는 것인줄로만 알고 그냥 쌩깠었다 -_-
그런데!!! tomcat:deploy 요런 goal 이 있지 아니한가!!! 그렇다. 이제 이클립스에서 버튼한번만 클릭하면 현재 나의 이클립 상에 개발중인것을 고대로 원격서버에 배포를 시킬수가 있게 된 것이다.
구찮스럽게 느껴지기만 하면 배포작업도 "배포쫌 해주세염~" 그라면 "네! 기분좋게 후딱 해드릴깨요!!" 라고 사람좋은 표정을 지을수 있게 됬다.
잡설이 길어졌다. 내가 바라던 짖을 할려면 우째해야 하는가?
먼저 톰캣 매니저 사용자를 설정해 줘야 한다.
톰캣을 설치하면 기본적으로 같이 설치되는 웹어플중에 manager 라는게 있다. 톰캣 설치디렉토리/webapps 에 가보면 manager 라고 폴더가 하나 있을것이다. 이게 바로 그거다.
로컬에다 설치한 사람은 http://localhost:8080/manager/html 로 접속해 보라! 뭔 아이디랑 패스워드를 입력하라는 창이 뜰 것이다.
여기에 로그인 할 수 있는 사용자를 설정하는 곳은 톰캣설치디렉토리/conf/tomcat-users.xml 파일이다.
여기에다 살포시 요런 설정을 추가해 주면 된다. username 과 password 는 적당히 알아서 쫌 복잡하게~~
<role rolename="manager"/> <user username="admin" password="test" roles="manager"/>
그런다음 다시 톰캣을 리스타트 하면 아까 설정한 아이디와 비밀번호로 로그인할수 있다.
뭐 사실 요 manager 를 이용하면 웹상에서도 서버를 중지하고 war 파일을 업로드 해서 배포를 할 수 있긴 하다. 하지만 역시 내가 바라는건 이클립 상에서 버튼 클릭한번~
이제 maven pom.xml 파일에 플러그인을 설정할 차례이다.
내가 테스트를 위해 샘플로 작성한 pom.xml 파일은 요렇다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tistory.stove99</groupId> <artifactId>DeployTest</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <warSourceDirectory>src/main/webapp</warSourceDirectory> <webXml>src/main/webapp/WEB-INF/web.xml</webXml> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <version>1.1</version> <configuration> <url>http://127.0.0.1:8080/manager</url> <path>/</path> <username>admin</username> <password>test</password> </configuration> </plugin> </plugins> </build> </project>
대충보면 뭔 뜻인지는 알것이다. 한가지 설명할 만한것은 tomcat-maven-plugin 플러그인 설정옵션 중에 <url>http://~~~</url> 요거랑 <path>/</path>
url 에는 톰캣 매니저의 URL 을 설정하면 된다. 웹으로 접속할때는 http://localhost:8080/manager/html 이였지만 여기서는 그냥 http://localhost:8080/manager 요기까지만 설정한다.
그리고, tomcat:deploy 로 배포를 하게 되면 path 에 설정한 context 로 배포가 된다.
즉, / 요걸 설정하면 http://localhost:8080/ /test 요걸 설정하면 http://localhost:8080/test 요렇게 웹어플이 배포된다.
자~ 이제 pom.xml 까지 설정을 마쳤으니 이클립스에서 실행을 해보자.
프로젝트명에서 오른쪽 버튼 > Run As > Maven build... 요걸 클릭하면 팝업창이 뜨는데 goals 입력란에
tomcat:undeploy tomcat:deploy요렇게 입력하고 실행을 하면 짠~~ 바라던 바대로 서버에 배포가 완료된다.
tomcat:undeploy 를 추가한 이유는 tomcat:deploy 로 배포를 할려는데 이미 같은 컨텍스트가 존재하면 에러가 나기 때문에 기존에 존재하던 컨텍스트를 지우고 다시 배포를 하기 위해서이다.
※ tomcat:undeploy 를 하면 기존에 있던 폴더가 싹 지워지기 때문에 첨부파일 같은거를 해당 폴더로 업로드 되게 처리해 놨다면 첨부파일 까지 다 지워져 버린다!!!!! 이 점에 대해서 깊은 주의가 요망된다.
※ 그외 기타 쓸 수 있는 goal 들
tomcat:run 임베디드 tomcat 서버 띄우기 => localhost:8080 으로 접속할수 있게 된다., jetty:run 과 비슷한 기능임
tomcat:start 원격 서버시작시키기
tomcat:stop 원격 서버중지
tomcat:redeploy 재배포, 이것 테스트를 심도 있게 안해봤는데 잘만 작동 된다면 undeploy 했다가 다시 deploy 안해도 될것 같긴하다.
외 기타등등 몇가지 더 있음~ tomcat:help 를 해 보면 설명들이 대충 나옴. 영어로.
'maven' 카테고리의 다른 글
Sonatype Nexus #2 : 설정 및 maven 과 연결하기 (4) | 2011.10.23 |
---|---|
Sonatype Nexus #1 : 톰캣에 설치하기 (0) | 2011.10.23 |
maven package goal 로 war나 jar 파일 생성시 생성되는 파일명 설정하기 (0) | 2011.10.13 |
Maven, SVN 을 이용한 개발서버(Tomcat) 자동배포 하기 (0) | 2011.08.24 |
Maven Jetty Plugin 으로 개발하면서 css, js, html 같은 정적 파일이 저장안될때 (0) | 2011.08.24 |
maven package goal 로 war나 jar 파일 생성시 생성되는 파일명 설정하기
maven 2011. 10. 13. 11:05
아무것도 설정하지 않고 maven package 골로 빌드를 하면 artifactId-version.war 로 war 파일이 생성된다.
이 war 파일로 배포를 하는데 배포를 할때마다 ROOT.war 나 컨텍스트명.war 로 파일명을 변경해야 되서 귀찮기 그지없다.
mvn package 를 했을때 ROOT.war 나 project.war 같이 생성될 war 파일명을 설정해 보자.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tistory.stove99</groupId> <artifactId>MyProject</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <build> <!-- ROOT.war 가 생성된다. --> <finalName>ROOT</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <warSourceDirectory>WebContent</warSourceDirectory> <webXml>WebContent/WEB-INF/web.xml</webXml> </configuration> </plugin> </plugins> </build> </project>build 태그 아래에 finalName 태그를 추가한 다음 원하는 이름을 설정하면 설정한이름.war 로 war 파일이 생성된다.
'maven' 카테고리의 다른 글
Sonatype Nexus #1 : 톰캣에 설치하기 (0) | 2011.10.23 |
---|---|
이클립스 상에서 maven 을 이용해 원격서버로 배포하기 (3) | 2011.10.14 |
Maven, SVN 을 이용한 개발서버(Tomcat) 자동배포 하기 (0) | 2011.08.24 |
Maven Jetty Plugin 으로 개발하면서 css, js, html 같은 정적 파일이 저장안될때 (0) | 2011.08.24 |
Oracle JDBC Driver maven 디펜던시에 추가하기 (3) | 2011.08.22 |
mybatis 쿼리, 쿼리결과 로깅을 위한 log4j.xml 설정
mybatis 2011. 10. 12. 18:43
<logger name="java.sql.Connection"> <level value="debug" /> </logger> <logger name="java.sql.Statement"> <level value="debug" /> </logger> <logger name="java.sql.PreparedStatement"> <level value="debug" /> </logger> <logger name="java.sql.ResultSet"> <level value="debug" /> </logger>
요걸 log4j.xml 파일에 설정해 추가해 주면 실행되는 쿼리랑 쿼리 결과를 로깅할 수 있다.
※ java.sql.ResultSet 에 대한 로깅을 하면 Oracle CLOB 같은 스트림성 컬럼을 SELECT 할때 stream has already been closed 익셉션이 날수 있다.
※ java.sql.ResultSet 에 대한 로깅설정을 지우면 쿼리 결과에 대한 로깅은 제외된다.
'mybatis' 카테고리의 다른 글
java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction (0) | 2011.11.28 |
---|---|
mybatis Oracle Procedure 호출하기 (0) | 2011.10.25 |
mybatis 동적쿼리 조건문에 isEmpty, isNotEmpty 를 써보자. (2) | 2011.10.18 |
mybatis dynamic query 조건에서 in 조건 사용하기 (0) | 2011.09.06 |
mybatis interceptor 를 이용해서 쿼리로그를 디비에다 저장하기 (2) | 2011.08.29 |