[Spring/java] Spring Scheduler 사용법

업무 중 작은 이슈가 하나 발견되었다.

내가 담당하고 있는 업무에서 회원 가입 약관을 우리 Mall 페이지에서 REST로 가져오는데.

Mall 이 서버가 다운되면 약관을 가져오지 못해서 내 업무에서도 회원 가입을 못한다는 것.

약관을 못 가져오면 안 띄워버릴 순 없으므로.. 스케쥴로 서버 메모리에 올려놓기로 결정.

그래서 사용하기로 한게 간단한 Spring Scheduler

Java 버전 : 1.6

Spring 버전 : 3.0.5

Spring Scheduler 사용

1.xml파일 추가하기

context-scheduler.xml 파일을 추가했다. 기존 xml에 추가해도 되지만 파일을 새로 만드는게 관리하는데 편할 것 같아서 추가.

	<?xml version="1.0" encoding="UTF-8"?>
	<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:task="http://www.springframework.org/schema/task"
		xsi:schemaLocation="http://www.springframework.org/schema/beans
							http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
							http://www.springframework.org/schema/task
							http://www.springframework.org/schema/task/spring-task-3.0.xsd">
							<task:annotation-driven />
	</beans>

2.스케쥴을 정의 할 Class 파일 생성

	@Service
	public class SchedulerService {
		
		
		 @Scheduled(fixedDelay=1000)
		    public void TestScheduler(){
		        System.out.println("테스트입니다");
		    }
	}

위의 코드처럼 @Scheduled 어노테이션이 걸린 메소드가 @Scheduled 어노테이션에 준 파라미터에 따라서 주기적으로 실행된다.

@Scheduled 어노테이션 파라미터로는 3가지 값이 들어갈 수 있다.

1.cron : cron은 리눅스 cron 표현식과 동일하게 설정

2.fixedDelay : 이전 실행된 작업 종료 시간으로 부터 정의된 시간 만큼 지난 후 실행 ( 밀리세컨드 단위 )

3.fixedRate : 이전에 실행된 작업 시작시간으로 부터 정의된 시간만큼 지난 후 실행 ( 밀리세컨드 단위 )

cron 표현식도 추가 예정

[오라클] 테이블,컬럼,코멘트,인덱스 조회 등 유용한 쿼리

오라클 테이블,컬럼,코멘트,인덱스 조회 등 유용한 쿼리

테이블 조회, 컬럼 조회, 인덱스 조회 등 평상시에 자주 쓰는 쿼리문 입니다.

테이블 및 컬럼 조회

테이블,컬럼 관련 조회

  • 모든 테이블 정보 조회
      SELECT *
      FROM ALL_TABLE;
    


  • 특정 테이블 정보 조회
      SELECT *
      FROM ALL_TABLE
      WHERE TABLE_NAME='테이블 이름';
    


  • 모든 컬럼 정보 조회
      SELECT *
      FROM ALL_TAB_COLUMNS;
    


  • 특정 테이블 컬럼 정보 조회
      SELECT*
      FROM ALL_TAB_COLUMNS
      WHERE TABLE_NAME='테이블 이름';
    

코멘트 관련 조회

  • 모든 테이블 코멘트 조회
      SELECT *
      FROM ALL_TAB_COMMENTS;
    


  • 특정 테이블 코멘트 조회
      SELECT *
      FROM ALL_TAB_COMMENTS
      WHERE TABLE_NAME='테이블 이름';
    


  • 특정 테이블 컬럼 코멘트 조회
      SELECT *
      FROM ALL_COL_COMMENTS
      WHERE TABLE_NAME='테이블 이름';
    



인덱스 관련 정보 조회

  • 특정 테이블 인덱스 조회
      SELECT *
      FROM ALL_INDEXES
      WHERE TABLE_NAME='테이블 이름';
    


  • 특정 테이블 인덱스 컬럼 조회
      SELECT *
      FROM ALL_IND_INDEXES
      WHERE TABLE_NAME='테이블 이름';
    


  • 특정 테이블 인덱스이름과 인덱스 컬럼 동시 조회 (간략하게)
      SELECT A.TABLE_NAME,A.INDEX_NAME,B.COLUMN_NAME
      FROM ALL_INDEXES A,
       ALL_IND_COLUMNS B
      WHERE A.INDEX_NAME = B.INDEX_NAME AND A.TABLE_NAME='OR_ORDER_DTL';
    

[Spring/java] LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context

spring 프레임워크에서 서버 기동 시 자주 나오는 에러 입니다.

LifecycleProcessor not initialized - call ‘refresh’ before invoking lifecycle methods via the context 에러

개발환경을 새로 세팅해야 하는 상황이 발생해서 개발환경 파일을 그대로 복사해서

붙여넣고 서버를 올렸다..

한번에 될거란 생각은 1도 안했지만

어김없이 에러가 발생.

MAVEN Setting 파일이 default 파일로 되있어서 MAVEN 에러가 발생해서 하나 잡고..

이제 되겠거니 하고 서버를 올렸더니

	LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context 

에러가 발생했다.

구글링을 해보니

Spring 버전이 맞지 않아 발생 할 수 있다는 글을 발견..

spring 버전차이

Maven Clean

Maven Install 을 먼저 해보려고 했더니

또 다시 발생한 에러..

org.apache.maven.plugin.CompilationFailureException: Compilation failure
        Unable to locate the Javac Compiler in:
        [개인 로컬의 JAVA_HOME]\jre6\..\lib\tools.jar
        Please ensure you are using JDK 1.4 or above and
        not a JRE (the com.sun.tools.javac.Main class is required).
        In most cases you can change the location of your Java
        installation by setting the JAVA_HOME environment variable.

메이븐에서 Library를 제대로 받아오지 못하고 있는 것 같다.

아무래도 이걸 해결하면 될 듯 싶어서 다시 구글링을 해보니

발견한 글

JRE_HOME

JDK 설정 문제로 MAVEN Library를 제대로 받아오지 못하고 있었던 것 같다.

기존 환경과 동일하게 JDK를 설정하고 MAVEN Install 하니 정상 작동.

MAVEN Intall을 성공 시키고

서버를 올리니 서버도 정상적으로 올라갔다.

정리

  1. LifecycleProcessor not initialized - call ‘refresh’ before invoking lifecycle methods via the context 에러 발생
  2. 위의 에러는 Spring 버전 차이로 발생할 수 있음
  3. MAVEN Intall 하여 제대로 된 Library 받아오려고 시도
  4. JDK 설정 문제로 MAVEN Intall이 제대로 되지 않음
  5. JDK 설정을 제대로 하고 난 후 MAVEN Intall
  6. MAVEN Intall 성공 후 서버 올리니 해결!

[빌드/MAVEN/Jenkins]MAVEN HTTP response code: 501 에러 (Ant 포함)

MAVEN에서 발생할 수 있는 에러 입니다.

Server returned HTTP response code: 501

회사에서 젠킨스를 배포 툴로 사용하고 있는데.

정말 뜬금없이 위의 에러가 발생했다.

Server returned HTTP response code: 501

호출 한 URL은 http://repo1.maven.org/

구글링을 해보니 1월 15일부로 http 통신을 중단한다고 한다.

maven을 통해 빌드하고 있으니 pom.xml에 repository URL만 바꾸면 되겠구나 생각했다.

변경 전

	<repository>
		<id>mvn2</id>
		<url>http://repo1.maven.org/maven2/</url> 
		<releases>
			<enabled>true</enabled>
		</releases>
		<snapshots>
			<enabled>true</enabled>
		</snapshots>
	</repository>

변경 후

	<repository>
		<id>mvn2</id>
		<url>https://repo1.maven.org/maven2/</url> 
		<releases>
			<enabled>true</enabled>
		</releases>
		<snapshots>
			<enabled>true</enabled>
		</snapshots>
	</repository>

하지만 똑같이 에러가 발생.. 분명 브라우저에서 들어가면 http는 501을 뱉고있고.

https로 접속하면 정상적으로 들어가지는데 무엇이 문제였을까..

java 버전에 따른 protocol 에러.

한참을 삽질하다 발견한 java version에 따라 protocol_version이 다르다는 사실.

아래 표를 보면 java 6은 TLS 1.0이 기본.

시스템에서 java 6 버전을 쓰고 있는데

maven에서 요구하는 버전은 TLS1.2여서 동일한 에러가 발생했었다.

Java VersionSSL/TLS DefaultOther Supported Versions
Java 6TLS 1.0TLS 1.1 (update 111 and later), SSLv3.0*
Java 7TLS 1.0TLS 1.2, TLS 1.1, SSLv3.0*
Java 8TLS 1.2TLS 1.1, TLS 1.0, SSLv3.0*

따라서 TLS1.2v 으로 호출하도록 추가해주면 문제가 해결!

TLS1.2v 을 사용하게 하려면 아래의 코드를 추가하면 된다고 한다.

	-Dhttps.protocols=TLSv1.1,TLSv1.2

이클립스였으면 옵션 마지막 줄에 추가하면 되겠지만.. 젠킨스에서는 어디서 넣어야 하는가 찾는게 마지막 문제!

MAVEN으로 빌드 할 경우

MAVEN 으로 빌드를 할 경우 JVM Option 에 위의 코드를 넣어주면 된다.

JVM Option은 숨겨져 있기 때문에 Builder 항목에서 고급을 누르면 표시된다.

maven

ANT로 빌드 할 경우

이렇게 모든게 끝난 줄 알았는데..

MAVEN이 아니라 ANT로 빌드하는 시스템들이 있었다.

게다가 ANT 빌드의 경우 Jenkins 내에 JVM Option을 추가 할 수 있는 항목 또한 없었다..

결국 업체 문의 끝에 ANT Script 내에 JVM Option 추가하는 위치를 찾을 수 있었다.

빌드 할 시스템의

exec 태그 안쪽에 arg value=”-Dhttps.protocols=TLSv1.2”

를 추가 하면 된다.

ant

[JavaScript/Jquery]Input과 keyup을 이용한 테이블 실시간 검색

[JavaScript/Jquery]Input과 keyup을 이용한 테이블 실시간 검색

input과 keyup 펑션을 이용한 실시간 테이블 검색 기능 입니다.

JS를 통한 Table 실시간 검색

기능 설명 : Input에 값을 입력하면 해당 값이 있는 행만 표시해주는 코드입니다.

주석(설명) 없는 원본 코드

$("#inputSearchText").keyup(function(){
	var searchText = $(this).val();
	$("#tableTarget > tbody > tr).hide();
	var temp = $("#tableTarget > tbody > tr > td:contains('"+ searchText +"');
	$(temp).parent().show();
}

주석(설명) 있는 코드

//input에 keyup 이벤트 등록
$("#inputSearchText").keyup(function(){
	//keyup 이벤트 발생 시 해당 input의 value 가져오기.
	var searchText = $(this).val();
	//실시간 검색이 필요한 table의 모든 행(tr) 숨김 처리
	$("#tableTarget > tbody > tr).hide();
	//해당 table에서 input에 입력한 데이터가 있는 td Element 찾기.
	var temp = $("#tableTarget > tbody > tr > td:contains('"+ searchText +"');
	//입력한 데이터가 있는 Elemnet의 부모 Elemnet(td)만 표시.
	$(temp).parent().show();
}

Pagination