<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
function checkAnimal(){
var animal = $(':input[name=animal]:radio:checked').val();
if( animal ){
alert(animal+"을 선택했습니다");
return true;
}else{
alert("동물을 선택하세요");
return false;
}
}
</script>
<form onsubmit="return checkAnimal()">
<input type="radio" name="animal" value="Dog">Dog
<input type="radio" name="animal" value="Monky">Monky
<input type="radio" name="animal" value="Cat">Cat
<input type="radio" name="animal" value="Horse">Horse
<input type="submit" value="선택">
</form>
DBCP의 일반적인 설정값
DB Connection Pool을 사용하기 위해서 Apache Commons의 dbcp를 많이 사용하고 있지만 매번 설정값에 대한 정확한 정의와 설정방법을 까먹는 경향이 있어 일반적인 설정값 가이드를 아주 간단히 정리하고자 한다.
maxActive (최대 active connection 개수??)
+ 그냥 최대 Connection 개수로 생각하면된다.
+ 기본값은 8이며, 적당히? 설정하면 된다.
minIdle
+ 사용되지 않고 풀에 저장될 수 있는 최소 커넥션 개수
+ 기본값은 0이며, 기본값을 사용하게 되면 connection pool이 비어버릴 수 있기 때문에 기본값 대신 적당한 설정이 필요하다.
maxIdle
+ 사용되지 않고 풀에 저장될 수 있는 최대 커넥션 개수
+ 기본값은 8이며, 일반적으로 maxActive 개수와 동일하게 설정하는게 맞는 것 같다
maxWait
+ connection 사용이 많아져서 connection pool이 비었을 때 대기시간 (단위 1/1000초)
+ 기본값은 -1(무한대)이며, 서비스 특성에 맞게 설정하면된다. 일반적으로 기본값을 사용해도 큰 문제는 안될 것 같다.
testOnBorrow
+ connection pool에서 connection을 가져올 때 해당 connection이 유효성 검사 여부
+ 기본값은 false이며, 일반적으로 기본값을 사용한다. true설정하게 되면 매번 validationQuery를 수행하기 때문에 약간의 성능저하를 감수해야 한다.
testOnRetrun
+ testOnBorrow와 비슷한데… 다만 유효성 검사 시점이 connection을 pool에 반환할때 이다.
timeBetweenEvictionRunsMillis
+ 놀고 있는 connection을 pool에서 제거하는 시간기준 (설정된 시간동안 놀고 있는 connection을 minIdle&maxIdel 설정값을 고려하여 제거한다.)
+ 기본값은 -1이며, 단위는 1/1000초이다. 개인적으로 10분정도의 설정이 적당한 것 같다.
testWhileIdle
+ 놀고 있는 connection의 제거 여부를 검사할 때 해당 connection의 유효성 테스트 여부
+ 기본값은 false이며, 일반적으로 true로 설정하는 것이 좋은 것 같다.
validationQuery
+ connection 유효성 검사시에 사용할 쿼리문
+ DB 리소스를 최대한 적게 사용하는 쿼리를 사용하는게 좋다.
예제)
* Oracle : select * from dual
* MySql : select 1
MySQL 서브쿼리(SubQuery) 에서 Limit 사용하기
MySQL 서브쿼리(SubQuery) 에서 Limit 사용하기는 원래 MySQL 에서 허용하지 않지만,
아래와 같이, 별칭(alias)를 주는 방법으로 사용할 수는 있다….고 알려져 있다.
1. 관련 에러 메세지 :
Error Code: 1235. This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery’
2. 서브쿼리(SubQuery) 에서 Limit 사용하는 방법 :
SELECT * FROM (SELECT * FROM UserInfo WHERE CreateDate >= ‘2010-01-01’ LIMIT 0,10) AS temp_tbl;
React.js 시작해보기
mysql 인코딩 설정
[mysqld]
skip-character-set-client-handshake
mysql 오토커밋 안될때..
오토커밋 안될때..
데이터를 넣고나서 삭제할려고 하니깐 아래의 메세지가 나왔다…
You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
이건 또 뭔가 싶어..찾아보니..아래꺼를 한번 실행시켜주고 하란다.
메이븐 빌드 오류
간혹 이클립스에서 maven compile이나 package 등이 필요할 때가 있다. 일반적인 compile의 경우는 이클립스에 있는 maven 플러그인이 해 주지만, Run as -> build 등의 메뉴를 통해 직접 maven을 수행해서 jar 파일 등이 필요할 때..
헌데 workspace에 있는 다른 프로젝트가 dependency로 걸려 있다면.. 그리고 그 프로젝트는 아직 개발 중이라 maven deploy 등을 하지 않아 maven remote repository는 커녕 local repository에도 존재하지 않는 경우.. 이런 예외와 함께 실패하는 것을 볼 수 있다.
goal: clean compile
[INFO] BUILD FAILURE
[INFO] ————————————————————————
[INFO] Total time: 1.440s
[INFO] Finished at: Thu Nov 10 17:04:16 KST 2011
[INFO] Final Memory: 4M/15M
[INFO] ————————————————————————
[ERROR] Failed to execute goal on project child-project: Could not resolve dependencies for project test:child-project:jar:0.0.1-SNAPSHOT: Could not find artifact test:lib-project:jar:0.0.1-SNAPSHOT in repo (http://remote_repository:8080/nexus/content/groups/public/) -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal on project child-project: Could not resolve dependencies for project test:child-project:jar:0.0.1-SNAPSHOT: Could not find artifact test:lib-project:jar:0.0.1-SNAPSHOT in repo (http://remote_repository:8080/nexus/content/groups/public/)
at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies(LifecycleDependencyResolver.java:196)
at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies(LifecycleDependencyResolver.java:108)
at org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved(MojoExecutor.java:258)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:201)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
… (생략) …
[ERROR]
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
이 경우의 원인은 maven 명령을 실행할 때 workspace에 있는 프로젝트를 참조하지 못 해서 발생하는 경우이다. 해결 방법은.. 이클립스 maven 플러그인의 실행 화면(프로젝트 오른쪽 클릭 -> Run As -> Run Configurations…)에서 Profiles 설정 아래에 있는 “Resolve Workspace artifacts”에 체크를 해주면 된다.
단, 이 해결방법은 goal이 package인 경우는 아래와 같은 오류를 볼 수 있다.
[INFO] BUILD FAILURE
[INFO] ————————————————————————
[INFO] Total time: 13.879s
[INFO] Finished at: Thu Nov 10 16:42:27 KST 2011
[INFO] Final Memory: 19M/46M
[INFO] ————————————————————————
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project child-project: Failed to copy file for artifact [test:lib-project:jar:0.0.1:compile]: D:\workspace\Java\test\lib-project\target\classes (액세스가 거부되었습니다) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
그 이유는.. package goal을 수행하는 경우에는 packaging을 하기 위해 default-war 플러그인을 사용하는데, dependency의 실제 jar 파일이 필요하기 때문이다. 이 문제를 해결하기 위해 dependency가 걸려 있는 프로젝트를 maven local repository에 install하면 된다. child-project가 lib-project를 참조(dependency)하고 있는 경우 lib-project를 먼저 install하고 child-project를 packaging하면 된다. (개발 중이라 remote repository에 deploy하지 못 한다면.. 어차피 SNAPSHOT이라면 deploy해도 되겠지만..)
단, 이 경우는 이미 install된 파일이 local repository에 있을테니.. “Resolve Workspace artifacts”의 체크를 빼고 수행해줘야 한다. 그러지 않으면 workspace를 계속 참조하는데 jar 파일이 존재하지 않기 때문에 계속 같은 예외를 보게 될 것이다.
mysql 문자 길이
MySQL 문자열 길이 구하는 함수
1. LENGTH() : 길이를 bytes로 나타낸다.
SELECT LENGTH(‘한글’) -> 6
SELECT LENGTH(‘abc’) -> 3
2. CHAR_LENGTH() : 글자의 수를 나타낸다.
SELECT CHAR_LENGTH(‘한글’) -> 2
SELECT CHAR_LENGTH(‘abc’) -> 3
3. BIT_LENGTH() : 길이를 bit로 나타낸다.
SELECT BIT_LENGTH(‘한글a’) -> 56
SELECT BIT_LENGTH(‘한글’) -> 48
[Spring3.0] 다중파일 업로드(MultiFile upload)
단일 파일 업로드는 많이 해봤지만
다중으로 여러건 파일 업로드 처리해야할 경우들이 있습니다.
배열속성으로 처리하는 방법도 있지만
오늘은 동일한 name값으로 처리하는 방법을 알아봅시다
*-servlet.xml
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" > <property name="maxUploadSize" value="30720000" /> </bean>
form.jsp
<form name="uploadForm" method="post" enctype="multipart/form-data" action="file.spring?action=upload"> <input type="file" name="upFile"> <input type="file" name="upFile"> <input type="file" name="upFile"> </form>
Controller.java
public ModelAndView addRoomType(HttpServletRequest request, HttpServletResponse response){
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request; //다중파일 업로드
List<MultipartFile> files = multipartRequest.getFiles("upFile");
return new ModelAndView("redirect:*.spring?action=list");
}
핵심은 multipartRequest 오는 getFiles에 name명을 찾아서 처리하는 걸로 ~ 끝
다중 form submit
지금까지 우리가 학습한것은 하나의 폼은 한번 submit 된다는 것이다.
가령
<form action="abc"><input type="submit" /></form>그리고 jquery 에서는 아래와 같이 serialize 를 이용하여 전송이 가능하다.
<script>// <![CDATA[
$(function(){
$("#btn_submit").click(function(){
$.post("경로", $("#sform").serialzie(), function(data){
});
});
});
// ]]></script>
물론 onsubmit 를 이용해서 처리해도 문제는 없다.
그렇다면 다중의 폼을 한군데로 전송할 수는 없을까?
<form class="sform" action="abc"> </form> <form class="sform" action="abc"> </form>
폼 클래스 값으로 다중 form submit을 처리 할수 있다
