React.js 시작해보기
http://reactkr.github.io/react/docs/getting-started-ko-KR.html
[mysqld]
skip-character-set-client-handshake
오토커밋 안될때..
데이터를 넣고나서 삭제할려고 하니깐 아래의 메세지가 나왔다…
이건 또 뭔가 싶어..찾아보니..아래꺼를 한번 실행시켜주고 하란다.
간혹 이클립스에서 maven compile이나 package 등이 필요할 때가 있다. 일반적인 compile의 경우는 이클립스에 있는 maven 플러그인이 해 주지만, Run as -> build 등의 메뉴를 통해 직접 maven을 수행해서 jar 파일 등이 필요할 때..
헌데 workspace에 있는 다른 프로젝트가 dependency로 걸려 있다면.. 그리고 그 프로젝트는 아직 개발 중이라 maven deploy 등을 하지 않아 maven remote repository는 커녕 local repository에도 존재하지 않는 경우.. 이런 예외와 함께 실패하는 것을 볼 수 있다.
goal: clean compile
… (생략) …
[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인 경우는 아래와 같은 오류를 볼 수 있다.
그 이유는.. 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 문자열 길이 구하는 함수
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
단일 파일 업로드는 많이 해봤지만
다중으로 여러건 파일 업로드 처리해야할 경우들이 있습니다.
배열속성으로 처리하는 방법도 있지만
오늘은 동일한 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명을 찾아서 처리하는 걸로 ~ 끝
지금까지 우리가 학습한것은 하나의 폼은 한번 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을 처리 할수 있다
사실 이문제 때문에 여러 자료를 찾아봤지만 속시원한 해결책이 별로 없었다
그러던 중 간단히 해결할 수 있는 방법을 알아냈다..
var dataString = $("#Form1").serialize(); $.ajax({ url:"SurveyPreviewSingle.aspx", type: "POST", data:dataString, contentType: "application/x-www-form-urlencoded; charset=UTF-8", dataType: "text", success:function(data){ alert('success'); } });
위에서 보듯 contentType 과 dataType 만 잘 지정해주면 된다.
물론 호출하는 페이지에서 굳이 content-type에서 charset 을 utf-8로 명시할 필요도 없이 잘된다.
프로그램 개발 환경 및 상황에 따라서 달라지겠지만 asp.net 환경에서는 위의 코딩만으로 form 변수를 정상적으로 한글까지 처리할 수 있었다.
파싱할때 JSOUP 라이브러리 참 많이 사용하게된다
그중에 유용한 메서드 기록한다
바로 첫번째로 select한 text값 지정
아래와같이 사용하면된당 ㅋㅋ
select().first().ownText();
이번에 일일 집계를 만들면서 spring batch를 처음 써봤다.
인터넷에 batch에 대한 이론 자료는 많으므로 여기엔 딱히 쓰진 않겠다.
spring batch는 스케줄 등록하는 기능이 없다.
그래서 Jenkins로 시간을 설정해서 빌드하고 batch는 spring batch를 썼다.
하루동안 사람들이 쓴 글의 총 수를 TEXT 테이블에서 셀렉트 해온 후
그 데이터를 AGGT(집계) 테이블에다가 넣는 예제이다.
(1) 비지니스 로직 없이 select 후 바로 insert 하기
1. XML에 JOB을 설정한다.
<job id="aggt" incrementer="incrementer" xmlns="http://www.springframework.org/schema/batch"> <step id="txt_cnt"> -- 한 job에 스텝 여러개 추가 가능 <tasklet> <chunk reader="aggtReader" writer="aggtWriter" commit-interval="1" /> </tasklet> </step> </job> <bean id="aggtReader" class="org.springframework.batch.item.database.IbatisPagingItemReader"> <property name="queryId" value="aggt.selectTextCnt" /> -- query의 namespace+id <property name="sqlMapClient" ref="dataSqlMapClient" /> -- database 선택, select, insert 하는 곳이 서로 다른 DB일 때 설정해놓은 id를 이렇게 불러서 쓰면 된다! </bean> <bean id="aggtWriter" class="org.springframework.batch.item.database.IbatisPagingItemWriter"> <property name="queryId" value="aggt.insertTextCnt" /> <property name="sqlMapClient" ref="aggtSqlMapClient" /> </bean>
JAVA에서 아무 조작 없이 셀렉트 해온 값을 Map에 들고있다가 바로 Insert 하게 된다.
* commit-interval 은 단위인데..
만약 commit-interval이 5고, 총 100건을 돌린다 할 때
5개 단위로 가고, 중간에 실패하면 5 단위로 된 곳부터 시작한다고 함.
2. query.xml (iBatis를 쓴다)
<sqlMap namespace="aggt"> <resultMap id="textAggt" class="객체 위치"> <result property="aggtDate" column="AGGT_DATE" /> <result property="textCnt" column="TEXT_CNT" /> </resultMap> <select id="selectTextCnt" resultMap="textAggt"> /* 셀렉트 해오는 쿼리 */ </select> <insert id="insertTextCnt"> /* 위에서 셀렉트 한 값을 인서트하는 쿼리 */ </insert>
(2) 비지니스 로직 삽입
1. XML에 JOB 설정
bean 설정 대신 직접 구현한다.
<job id="aggt" incrementer="incrementer" xmlns="http://www.springframework.org/schema/batch"> <step id="txt_cnt"> <tasklet> <chunk reader="aggtReader" writer="aggtWriter" commit-interval="1" /> </tasklet> </step> </job>
때에 따라서 reader, writer 사이에 processor=”클래스명” 속성을 넣어줄 수도 있다.
reader 이후 비지니스가 필요할 때 processor에서 데이터를 가공하면 된다.
2. reader 구현
내 경우랑은 좀 달라서 테스트는 안해봤는데
다른 예제들을 찾아보면 bean에서 파라미터들을 넘겨주는 경우가 있다.
그 때 파라미터 개수만큼 reader가 호출되는 듯 하다.
그래서 전역변수를 설정해놓고 리턴할 값이 null인지를 체크해야 하며,
null이 리턴되면 reader는 끝난다.
파라미터 없는 경우는 한번불리고 끝나는거 같다.
public class AggtReader implements ItemReader<TextAggt> { ... 중략 public TextAggt read() { TextAggt textAggt = new TextAggt(); // TODO : null 체크 하여 null을 리턴하던지 writer에 쓸 객체를 리턴할 것 TextCntService result = textCntService.selectTextCnt(); return result; // 리스트를 리턴하지 말고 객체 하나를 리턴할 것 } }
3.
중간에 프로세서가 있다면 프로세서를 구현하고, 나는 프로세서를 생략하겠다.
라이터는 데이터를 받아올 때 리스트로 받는다.
처음할 때 리더에서 리스트 보냈다가 라이터에서 List> 받으려 하다가 쌩고생함..
public class AggtWriter implements ItemWriter<TextAggt> { .... public void write(List<? extends TextAggt> list) { textCntService.insertTextCnt(list); } }