3월, 2013의 게시물 표시

[javascript]Window 객체

Document 객체는 html 문서를 나타내며, Window 객체는 브라우저 창을 나타낸다. 중요성을 굳이 따지면 Window 더욱 중요하게 생각하여한다. Window객체는 프로그래밍시 전역 객체 역할을 하기 때문이다. 예를들면  var test = 42; 아래의 문법과 동일하다.  window.test = 42;

database 설계 시 주의사항

1. pk 순서를 where clause에서 사용하는대로 잡자. ...작업을 한다면 where clause 맞추는게 나을것 같다. 2. 어떤 조건으로 결과 셋을 줄여 나갈지 확인하자. 큰 범위의 결과는 되도록 뒤에 두자. 3. 식별자 관계 - 부모 pk를 자식의 pk 속성이 되는 관계 비식별자 관계는 부모 pk가 자식 pk의 속성이 아닌경우 식별자 관계시 자식 테이블을 대상으로 하는 query식이 점점 늘어난다. 비 식별자 관계일 경우 join문이 복잡하게 쓰일 수 있다. 이력테이블 관리. 이력테이블은 시간의 따라 레코드가 증가하는 테이블. 레코드가 많을 경우 처리시간이 오래 걸리는 특징이 있다. 관리 방법은 기본이 되는 그냥 한 테이블로 관리하는 방법과 마지막 상태를 저장하는 테이블과 이력테이블을 한쌍으로 관리 하는 방법이 있다. 주의 할점은...역시나 인덱스를 타느냐 마느냐. 적은 범위의 인덱스를 태울수 있는가에 대한 방법이다. 테이블 분리와 통합 통합된다면 너무 많음 트랜젝션이 몰릴 수 있는가? 없는가? 제약사항 조건을 거는데 문제가 있는가 고려할 것 분리된다면 조인에 의한 개발 및 성능에 영향과 테이블 관계의 복잡도을 고려 가장 명확한 구분 방법은 논리적 구조 판단 ㅡㅡ;;;; pk를 잡는이유는 테이블의 특성과 fk로 활용할 경우 무결성이 보장 되기 때문이다.

Spring Batch (6) - Test & Debug

이슈 사항  - 특정 폴더 내의 파일을 읽어 들여야 한다.  : MultiResourceItemReader을 이용하여 문제 사항 처리    (단 MultiResourceItemReader에 delegate할 Reader는 ResourceAwareItemReaderItemStream를 implement 해야한다.    이번 경우는 직접 Reader를 구현하였기 때문에 implement에 ResourceAwareItemReaderItemStream를 추가 하였음     - DB 조회 하여 조회 된 결과가 있으면 입력 값을 수정 하여야 한다.  : 해당이슈는 Processor에서 DB를 조회(Mybatis 이용)해야하는데 org.springframework.dao.TransientDataAccessResourceException: Cannot change the ExecutorType when there is an existing transaction 위와 같은 오류가 발생 Transaction문제로 판단되어서 org.mybatis.spring.SqlSessionFactoryBean에 대한 Bean을 추가 등록하여 Processor에서 조회하는 DAO에 적용 하니 문제가 해결되었음 (이번 케이스는 readOnly이고 조회 밖에 안하니깐 트랜젝션의 Propagation는 상관 없음..그러나 insert를 한다면 =_=; Writer를 써야 할듯) - Writer 이슈 : affected row가 반드시 있어야 한다. : batch 재 시작시 처음 부터 다시 시작한다는 정책 변경으로 batch repository를 mysql에서 내부 db로 변경 하였다. 그로 인해 중복된 데이터의 insert를 막기 위해 해당 테이블에는 unique key가 설정 하였다.(뭐 그게 아니더라도 당연히 했어야 하지만) 그래서 writer에서 사용하는 insert...

mybatis cache

[레퍼런스 번역 문서 참조] cache MyBatis 는 쉽게 설정가능하고 변경가능한 쿼리 캐싱 기능을 가지고 있다. MyBatis 3 캐시 구현체는 좀더 강력하고 쉽게 설정할 수 있도록 많은 부분이 수정되었다. 성능을 개선하고 순환하는 의존성을 해결하기 위해 필요한 로컬 세션 캐싱을 제외하고 기본적으로 캐시가 작동하지 않는다. 캐싱을 활성화하기 위해서, SQL 매핑 파일에 한줄을 추가하면 된다. <cache/> 하나의 간단한 구문에 다음과 같은 순서로 영향을 준다.  매핑 구문 파일내 select 구문의 모든 결과가 캐시 될 것이다.  매핑 구문 파일내 insert, update 그리고 delete 구문은 캐시를 지울(flush) 것이다.  캐시는 Least Recently Used (LRU) 알고리즘을 사용할 것이다.  캐시는 스케줄링 기반으로 시간순서대로 지워지지는 않는다. (예를 들면. no Flush Interval)  캐시는 리스트나 객체에 대해 1024개의 참조를 저장할 것이다. (쿼리 메서드가 실행될때마다)  캐시는 읽기/쓰기 캐시처럼 처리될 것이다. 이것은 가져올 객체는 공유되지 않고 호출자에 의해 안전하게 변경된다는 것을 의미한다. 모든 프로퍼티는 cache 요소의 속성을 통해 변경가능하다. 예를 들면: <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/> 좀더 많은 프로퍼티가 셋팅된 이 설정은 60초마다 캐시를 지우는 FIFO 캐시를 생성한다. 이 캐시는 결과 객체 또는 결과 리스트를 512개까지 저장하고 각 객체는 읽기 전용이다. 캐시 데이터를 변경하는 것은 개별 쓰레드에서 호출자간의 충돌을 야기할 수 있다. 사용가능한 캐시 전략은 4가지이다.  LRU – Least Recently Used: 가장 오랜시간 사용하지 않는 객...

Spring Batch (5) - Processor 만들기

이미지
Reader에서 parsing된 문자열은 한 레코드가 2개의 테이블에 Write되야 한다. 이를 위해서는 한 레코드를 2개의 테이블에 insert할 수 있게 변환 작업을 해줘야 하는데 이때 사용되는 bean이 processor이다. 예전 버전 (Spring batch 1.X)에서는 다음과 같은 구조로 플로우가 진행되었다. 그리고 이번에 사용할 Spring batch 2.0에서는 다음과 같은 플로우로 진행된다. 뭐 =_=;; 사실 이거나 저거나 reader와 writer 사이에서 변환하는 작업이 필요한건 매 한가지 이고 ㅡㅡ;; Processor작성 방법은 ItemProcessor를 구현하면 되므로 =_=;; 간단하게 처리. 이제 Job 테스트만 하면 작업 끝~ ^^

java 정규표현식

  정규식  설명 예제  . 임의의 한 문자 (필수)를 의미 합니다. ab.(abc, abd,abe) ..  ? 바로 앞에 문자가 없거나 하나가 있음 을 의미 합니다. a?c (ac, abc, bc) ..  * 바로 앞에 문자가 없거나 하나이상 반복 을 의미 합니다. ab* (a, ab, aaa) ..  + 바로 앞에 문자가 하나이상 반복 을 의미 합니다. ab+ (ab, abb, abbb) ..  ^ 문자열의 시작 을 의미 합니다. ^ab (abc, abcd, abcde) ..  [^] ^이후의 괄호안 형식을 제외함 을 의미 합니다. [^ab]cd (ecd, fcd, gcd) .. $ 문자열의 끝 을 의미 합니다. abc$ (pupu abc, story abc) ..  [] []안의 형식 일치 를 의미 합니다. [abc] (a, b, c, ab, bc, abc) ...  {} {}앞 문자열(혹은 문자) 반복 갯수 를 의미 합니다. ab{2} (abab) ab{2,} (2개이상) ab{1,2} (1부터 2까지)  () ()안의 내용 을 하나의 묶음으로 사용 함 을 의미 합니다. (ab){2} (abab) (ab)+ (ab, abab, ababab ..)  | or연산 을 의미 합니다. (a|b|c)  (a, b, c, ab,abc ..)  [0-9] (부터 - 까지)의 숫자 를 의미 합니다. [0-9] (0, 1, 2, 3, 4 ..) [a-z] (부터 - 까지)의 소문자 를 의미 합니다. [a-z] (a, b, c, d ..)  [a-zA-Z] (부터 - 까지)의 대,소문자 를 의미 합니다.  [a-zA-Z] (a, b, A, B ..)  \p(Alpha) 대,소문자 아파벳 을 의미 합니다...

java reflect

1: Class clazz = Class.forName("클래스명"); - 클래스명을 이용하여 클래스 객체 얻어옴 2: Constructor<클래스명> constructor =  clazz .getConstructor(new Class[]{Integer.class, String.class ...}); - 1번에서 얻어온 객체의 생성자를 얻어옴 - 파라미터의 Class[]는 생성자에 지정된 파라미터 파입의 리스트 3: Object object = constructor.newInstance(new Object[]{1, "테스트"}); - 생성자 객체를 이용하여 실제 생성자에 쓰이는 객체 리스트 전달 하여 얻고자 하는 객체를 얻어옴 4: Method method = clazz.getMethod(methodName, new Class[] { Data.class }); - Class[]의 요소가 파라미터 타입인 methodName에 해당 되는 매소드 객체를 가져옴 5: Object resultObj = method.invoke(object, new Object[] { data }); - 매소드 객체를 호출 

linux에서 일반 계정으로 mysql 설치 하기

1. mysql 다운로드 (Source 버전)  -  http://www.mysql.com/downloads/mysql/#downloads 2. 서버로 복사 (pscp를 사용) 3. 압축해제  - tar -xvzf mysql-5.6.10.tar.gz 4. 압축 해제한 문서에서 아래의 명령어 실행  cmake -DCMAKE_INSTALL_PREFIX=/<path>/ \ -DWITH_EXTRA_CHARSETS=all \ -DMYSQL_DATADIR=/data -DENABLED_LOCAL_INFILE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DSYSCONFDIR=/<path>/etc \ -DMYSQL_DATADIR=/<path>/data \ -DMYSQL_UNIX_ADDR=/<path>/tmp \ -DDEFAULT_CHARSET=utf8 \ -DWITH_EXTRA_CHARSETS=all \ -DMYSQL_TCP_PORT=4406 make & make install cmake 설정 정보 http://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html#option_cmake_sysconfdir 5. /<path>/etc에 my.cnf 작성 [client] port = 4406 #mysqld에 로커로 접속할 때 사용할 socket 정보 위치. 아래 mysqld의 socket과 일치하면 된다. socket = /home/ktc/mysql-5.6.10/tmp/mysqld.sock [mysqld_safe] pid-file = /home/ktc/mysql-5.6.10/pid/mysqld.pid err-log = //home/ktc/mysql-5.6.10/log/mysql.log # The MySQL server [mysqld] user=ktc...

Spring Batch (4) - Writer 만들기

...아.. 그냥 기본을 쓰는게 없네 ㅠㅠ writer마저 custom을 하면 맨붕이 올거 같다. 이번에 만들 writer는 다음과 같은 요구 사항이 있다. reader에서 출력되는 결과는 hashmap 구조의 데이터 이고, 다음에 만들어야 할 processor에서 hashmap을 두개 Model이 조합되어 있는 하나의 객체로  변환해 주는 부분이 들어 가겠고, 변환된 데이터는 2개의 테이블에 insert되야하는 사항이다. 뭐 CompositeItemWriter를 쓰면 되겠구나. 생각했는데.. 딱 거기서 이슈가 발생 ㅠㅠ 이슈 : A라는 테이블에 auto-increment 된 값을 B라는 테이블에 insert를 해야 한다. 일단 db dao는 mybatis를 이용하여 구성하였으니.. service를 만들어서 이를 구현할까 =_=;; 고민하다가 딱 좋은 글을 발견 ^^;; 해당 사항은 mybatis에서만 유효하다. mybatis에 insert 테그 속성에 useGeneratedKeys 가 있는데 keyProperty와 keyColumn를 같이 설정하면 auto_increment인 값을 얻어올수 있다. 예를 들어 <insert id = "insertInteractionMetadata" parameterType = "com.my.batch.interactions.item.InteractionRecordToWriteInMultipleTables" useGeneratedKeys = "true" keyProperty = "interaction.interactionMetadata.id" keyColumn = "id" > <!-- the insert statement using #{interaction.interactionMetadata.property,jdbcType=...} --> <...

Spring Batch (3) - Reader 만들기

스프링 배치에서 Reader의 구현체는 주로 3가지를 사용하는것 같다. 1. 파일을 다루는 Reader  - FlatFileItemReader 2. xml를 사용하는 Reader 3. DB를 사용하는 Reader 이번에 작업할 프로젝트에서는 1번째에 해당되는 파일을 다루는 리더가 필요했다. 그런데... 문제는 Flat파일 리더는 한 라인에 하나의 레코드가 들어 가야한다. 뭐..다수의 라인을 Pattern을 이용하여 하나의 레코드를 구성하는 방법도 있지만 이번에 파싱할 파일 구조가 좆망할 구조라서 ㅠㅠ <파싱 파일 구조> !!!KEY!!! key입니다. !!!BODY!!! body입니다. 근데 두줄입니다.  !!!KEY!!! key2입니다. !!!BODY!!! body입니다. 근데 두줄입니다.  위 파일을 리딩 하려면 잘 구현된 FlatFileItemReader를 버리고 새로운 리더를 작성해야 했다. 작업하기 앞서 고민되는 사항은 오류 시 이전 작업 위치를 저장하고 재시작하는 기능이 스프링 배치에 있는데 새로운 리더에서 작동을 할까 부담이 되었다. 하지만 FlatFileItemReader와 부모에 해당되는 AbstractItemCountingItemStreamItemReader를 분석 해보니 작업 위치 저장과 재시작 관련된 부분은 AbstractItemCountingItemStreamItemReader에 이미 구현이 되어 있어서 이를 상속 받아 새로운 리더를 작성을 하면 제대로 동작 하는 듯 보였다. 더 테스트는 해야겠지만 (작성 시 FlatFileItemReader를 참조하면 작성하기 쉬움) Reader의 테스트는 Template로 만든 디렉토리내의 test하위에 있는 ExampleItemReaderTest를 참고 하면 된다.

Spring Batch (2) - DataSource를 mysql 변경하기

DataSource 변경 하기 Spring batch template의 테스트 코드를 mysql로 변경 하기 위해 아래와 같이 properties 파일만 변경해 보았다. 참고로 spring batch에서는 dataSouce에 대한 지정이 안되어있으면 기본으로는 HSQLDB가 설정 되어있다. >> 여기서 고민해야 할 부분은 repository에 대한 영속성을 가질 것이냐 말것이냐. 일단 영속성이 필요로 할것 같아 batch.properties를 아래와 같이 변경하였다. batch.jdbc.driver=com.mysql.jdbc.Driver batch.jdbc.url=jdbc:mysql://localhost/tablespace?characterEncoding=utf8 batch.jdbc.user=userid batch.jdbc.password=password batch.schema.script=classpath:/org/springframework/batch/core/schema-mysql.sql 문제는 이렇게 변경하고 2회째 수행 할 경우 다음과 같은 오류가 발생한다. Table 'batch_job_instance' already exists HSQLDB를 사용하였을 경우는 실행시 마다 테이블을 생성 해도 문제가 발생하지 않지만 (메모리 DB이기 때문에) MYSQL를 사용하였을 경우는 초회 실행시 테이블이 생성되고, 반복 실행 시 생성 스크립트가 호출되서 문제가 발생 한것 같다. 관련 properties batch.schema.script=classpath:/org/springframework/batch/core/schema-mysql.sql 관련 bean context config <jdbc:initialize-database data-source="dataSource"> <jdbc:script location="${batch.schema.s...

Spring Batch (1) - 개발 환경 구축

프로젝트 생성 > Spring Template Project > Batch > Simple Spring Batch Project 테스트 코드 실행 > Run Configuration   * Main Class 설정     : org.springframework.batch.core.launch.support.CommandLineJobRunner   * Arguments 설정     : launch-context.xml job1 테스트는 성공하는데..어디서 부터 시작해야 할지 난감하네.. 차근 차근 해봐야 겠다.