하... 거의 5일만에 포스팅이다..
티스토리 스킨제작을 한다고 시간을 보냈다~~
포스팅 하고싶었으나 하나에 집중하면 다른 하나는 잘 못하는 본인이라. .ㅋ;;
지난시간에는 일정 시간이 될때 특정 메소드(?)를 호출하여 System.out.println을 콘솔창에 출력시키는 것을 확인하였다
이번에는 지난 코드에 이어서 MyBatis까지 연동을 하여 특정 시간에 DB를 조회하는 샘플을 진행
해보도록 하겠다
본인은 SELECT쿼리를 진행 해보도록 하겠음
CRUD 관련은 포스팅 샘플을 기준으로 응용을 하시길...
해당 포스팅의 코드를 기준으로 기본 Mybatis 연동을 해보도록 하자
위와같은 구조로 정의를 하였다
그럼 일정 시간에 CALL 해주는 DB에 대하 DAO 코드 와 쿼리XML 코드를 각각 다음과 같이 정의
해보도록 하자
sql.xml
<select id="testquery" resultType="java.lang.String"> SELECT 'TEST 쿼리' </select>
Dao.java
@Repository public class Dao { @Autowired private SqlSession sql; public String testquery() throws SQLException { return sql.selectOne("sql.testquery"); } }
특정 시간 DB 호출을 위한 Scheduler.java 코드
package com.crontab; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.crontab.dao.Dao; @Component public class Scheduler { @Autowired private Dao dao; @Scheduled(cron = "00 45 23 * * *") public void cronTest1(){ try { //일정시간이 되면 DAO를 통하여 DB에 쿼리문 조회 String test = dao.testquery(); System.out.println("DB조회값:"+test); } catch (Exception e) { e.printStackTrace(); } } }
스프링3(spring3) 을 이용하여 간단 스케쥴러 세팅을 하도록 하자 (8) | 2014.09.20 |
---|---|
zxing 라이브러리를 이용하여 QR코드/큐알코드/바코드 이미지를 색상별로 생성해보도록 하자 (0) | 2014.08.29 |
class파일내에서 classpath에 존재하는 리소스 파일읽어오기 (0) | 2014.07.30 |
스프링3(Spring3) - 메이븐(maven) pom.xml에서 오라클 JDBC(ojdbc14.jar) 라이브러리 추가하기 (0) | 2014.07.30 |
스프링3(Spring3) - RedirectAttributes를 이용하여 리다이렉트 POST 방식으로 데이터 전송하기 (0) | 2014.07.30 |
우리는 프로젝트를 진행하면서 스케쥴러(일명 : 크론탭 배치실행) 를 종종 사용할때가 존재한다
보통 어떠한 데이터를 시간이 되면 DB에 insert를 한다던가
혹은 DB정보를 읽어 특정 파일을 생성을 하다던가 등이 존재한다
이러한 경우를 위해 간단하게 샘플을 만들어 보도록 하겠음
이번장은 크론탭 연동만 소개하고 다음 포스팅에는 db연동을 하여
위에 설명한 내용중 하나인 DB내용을 읽어서 파일을 생성하는 내용에 대하여 포스팅 해보도록 하겠다
그럼 세팅을 시작해보도록 하겠음
※ 본인의 포스팅은 STS를 기준으로 작업을 진행하였음
- 프로젝트명 : crontab
- spring version : 3.2.3
생성후 프로젝트 우클릭후 Maven -> Update Project를 해주는거 잊지말자
Tomcat에 생성한 프로젝트를 Add를 해준다음 크론탭 연동을 진행하도록 하겠음
※ 기존 웹프로젝트의 경우는 ContextRoot 설정을 기본으로 잡아주었지만
스케쥴러는 별도의 컨텍스트 설정이 필요없다
위와같이 기본설정이 mvc-config.xml이 잡혀있을텐데 beans 태그를 다음과 같이 변경해주자
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd">
이어 beans 태그내에 다음 코드를 추가하자
<!-- 스케쥴러파일이 존재하는 패키지 설정 --> <context:component-scan base-package="com.crontab" /> <!-- 해당 태그들은 크론탭을 설정에 필요한 태그들 --> <task:scheduler id="jobScheduler" pool-size="10" /> <task:annotation-driven scheduler="jobScheduler" />
위 설정을 잡아다면 다음으로 xml설정 잡은 것처럼 패키지 생성을 하도록 하자
위 구조로 잡아주었다
crontab내에 여러개의 클래스를 잡아서 설정을 잡아 줄수도 있다
but, 본인은 하나의 클래스로만 작업을 ...
이제는 스케쥴러를 돌리기위한 코드를 작성하자
package com.crontab; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class Scheduler { /** * 1. 오후 05:50:00에 호출이 되는 스케쥴러 */ @Scheduled(cron = "0 50 17 * * *") public void cronTest1(){ System.out.println("오후 05:50:00에 호출이 됩니다 "); } /** * 2. 오후 05:51:00에 호출이 되는 스케쥴러 */ @Scheduled(cron = "0 51 17 * * *") public void cronTest2(){ System.out.println("오후 05:51:00에 호출이 됩니다 "); } }
위의 설정한 cron expression은 본인의 현재 시간에대 맞추어 테스트 해보도록 하자
본인은 현재 포스팅 시간대 기준으로 작업을 해본 것이다
예를들어 위 코드에서
"0 51 17 * * *"
라는 코드를 작성하였는데
앞에서부터 설명하자면
"초 분 시 일 월 요일"
이라는 것이다
'*' 이라는 expression은 모두 또는 항상을 의미한다
즉 상단 expression을 설명하면
17시 51분이 되면 해당 스케쥴러 호출이라는 의미다.
일/월/요일에 대해서는 '*' 설정을 잡아 주었으니 "매일 17시 51분이 되면 해당 스케쥴러를 호출하라"
라는 의미가 되는것이다
실행화면을 보도록 하자
상단 코드 작성후 tomcat start를 하고 기다리고 있었다
동작결과 정상적으로 코드 작성한 놈들이 특정 시간에 따라 호출이 정상적으로 되었다
다음 포스팅에는 DB연동을 하여 파일 생성하는 스케쥴러 제작을 진행하겠다
1. 지속적인 구독을 원하신다면 네이버 이웃추가 부탁드립니다
2. 도움이 되셨다면 공감한번 꾹! 눌러주세요
3. 궁금하신점이 있으시다면 댓글 GOGO
스프링3(spring3) 을 이용하면서 쿼츠/배치/스케쥴러 연동하기 -DB연동 (4) | 2014.09.28 |
---|---|
zxing 라이브러리를 이용하여 QR코드/큐알코드/바코드 이미지를 색상별로 생성해보도록 하자 (0) | 2014.08.29 |
class파일내에서 classpath에 존재하는 리소스 파일읽어오기 (0) | 2014.07.30 |
스프링3(Spring3) - 메이븐(maven) pom.xml에서 오라클 JDBC(ojdbc14.jar) 라이브러리 추가하기 (0) | 2014.07.30 |
스프링3(Spring3) - RedirectAttributes를 이용하여 리다이렉트 POST 방식으로 데이터 전송하기 (0) | 2014.07.30 |
이번포스팅은 테이블에 데이터 INSERT 후 시퀀스값 SELECT 해오는 것에 대하여 포스팅 하도록 하겠음
우선은 테스트 테이블을 생성 해보도록 하자
테이블명은 DBMS와 무관하게 동일하게 잡도록 해보겠음
테이블명 : seq_test
컬럼명 |
타입 |
idx |
bigint or number |
title |
varchar(20) |
MySQL 테이블 생성
CREATE TABLE seq_test(
idx bigint primary key auto_increment, title varchar(20) )
MS-SQL 테이블 생성
CREATE TABLE seq_test( idx bigint IDENTITY(1,1) primary key , title varchar(20) )
ORACLE 테이블 생성 (별도의 시퀀스 생성 필요)
CREATE TABLE seq_test( idx number primary key , title varchar(20) ); create sequence idx_test_seq start with 1 increment BY 1 maxvalue 10000;
테이블을 생성 하였다면 임의의 controller,dao,vo를 생성해보도록 하자
VO
public class Test { private int idx; private String title; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getIdx() { return idx; } public void setIdx(int idx) { this.idx = idx; } }
CONTROLLER
@Autowired private Dao dao; @RequestMapping(value="/insertSelectSeq") public void insertSelectSeq(Test test) { try { test.setTitle("insert test"); System.out.println("등록전 idx 값 :"+test.getIdx()); dao.insertSelectSeq(test); System.out.println("등록후 idx 값 :"+test.getIdx()); } catch (Exception e) { e.printStackTrace(); } }
DAO
@Autowired private SqlSession sql; public int insertSelectSeq(Test test) throws SQLException { return sql.insert("sql.insertSelectSeq",test); }
위의 소스에서 보다시피 dao에서는 int 형으로 return을 주지만
컨트롤러에서는 별도로 받는 vo객체가 존재하지 않는다.
그냥 dao에 parameter로 넘겨준 test객체에 담기는 것이다.
DBMS별로 INSERT 후 시퀀스값을 SELECT 해오는방법중 본인은 2가지 방식을 설명
하도록 하겠음
1. MySQL, MS-SQL 처럼 시퀀스가 자동 증가인 DBMS일 경우
사용가능
<insert id="insertSelectSeq" parameterType="com..model.Test" useGeneratedKeys="true" keyProperty="idx"> INSERT INTO seq_test (title) VALUES(#{title}) </insert>
위 코드처럼 정해주면 된다
※ keyProperty는 vo에 정의해준 변수명이다.
(시퀀스 컬럼값과 일치 시켜줘야함)
그럼 위의 코드로 테스트를 해보도록 하자
본인은 MySQL로 진행을 해보도록 하겠음
실행결과
위의 결과처럼 INSERT 호출전 VO객체의 들어있던 idx 의 값은 0이었으나 INSERT 처리를 한 후에는
자동증가값이 들어가있는 것을 확인 하였다.
2. 오라클처럼 시퀀스를 별도록 등록해주어야 하는 경우
※ 해당 방법은 꼭 오라클이 아니고 MySQL,MS-SQL
모두 사용이 가능 한 방법이다
<!--oracle--> <insert id="insertSelectSeq" parameterType="com.model.Test"> INSERT INTO seq_test(idx,title) VALUES(idx_test_seq.nextval,#{title}) <selectKey keyProperty="idx" resultType="Integer" order="AFTER"> SELECT idx_test_seq.currval FROM dual </selectKey> </insert> <!--mysql--> <insert id="insertSelectSeq" parameterType="com.model.Test"> INSERT INTO seq_test(title) VALUES(#{title}) <selectKey keyProperty="idx" resultType="Integer" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> </insert> <!--mssql--> <insert id="insertSelectSeq" parameterType="com.model.Test"> INSERT INTO seq_test(title) VALUES(#{title}) <selectKey keyProperty="idx" resultType="Integer" order="AFTER"> SELECT IDENT_CURRENT('seq_test') </selectKey> </insert>
DBMS 종류별로 각각의 Mybatis의 쿼리XML은 위와 같다.
※ MS-SQL 버전에서의 IDENT_CURRENT('seq_test') 의
seq_test는 insert했던 테이블 명을 적어주면 된다
그럼 위의 코드로 테스트를 해보도록 하자
본인은 오라클로 진행을 해보도록 하겠음
실행결과
위와같이 결과가 나왔다.
DBMS 무관하게 결과는 모두 동일하게 나올것이다.
1. 지속적인 구독을 원하신다면 네이버 이웃추가 부탁드립니다
2. 도움이 되셨다면 공감한번 꾹! 눌러주세요
3. 궁금하신점이 있으시다면 댓글 GOGO
ibatis vs mybatis LIKE절 검색하기 (0) | 2014.08.04 |
---|---|
ibatis vs mybatis 조건문 + mybatis 공백조건 비교시 안될경우 및 두개이상 조건주기 (0) | 2014.08.01 |
ibatis(iterate) vs mybatis(foreach) 비교 샘플 (0) | 2014.07.31 |
요즘 모바일이 활성화되면서 사용되는 출력물 중 하나라고 생각되어서 포스팅 하게 되었다.
zxing 라이브러리를 이용하여 QR코드/큐알코드/바코드 이미지를 생성하고자 한다.
이번포스팅은 무척 심플하다
1. pom.xml dependency 추가를 해주도록 하자
<dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.1.0</version> </dependency>
2. QR코드 유틸제작
유틸이라고 하기엔 그렇고 그냥 만들어보았음
클래스명을 QRUtil라고 주고 생성메서드를 makeQR이라고 만들어봄
import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.client.j2se.MatrixToImageConfig; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; public class QRUtil { /** * QR코드 유틸 * @param url : QR에 작성할 URL이다 * @param width : QR 이미지 가로사이즈 * @param height : QR 이미지 세로사이즈 * @param file_path : 생성할파일의 디렉토리경로 * @param file_name : 생성할 파일의 파일명 */ public static void makeQR(String url,int width, int height, String file_path, String file_name){ try { File file = null; file = new File(file_path); if(!file.exists()) { file.mkdirs(); } QRCodeWriter writer = new QRCodeWriter(); url = new String(url.getBytes("UTF-8"), "ISO-8859-1"); BitMatrix matrix = writer.encode(url, BarcodeFormat.QR_CODE,width, height); //QR코드 색상 int qrColor = 0xFF2e4e96; MatrixToImageConfig config = new MatrixToImageConfig(qrColor,0xFFFFFFFF); BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(matrix,config); ImageIO.write(qrImage, "png", new File(file_path+file_name)); } catch (Exception e) { e.printStackTrace(); } } }
3. QR 생성테스트를 위한 임의의 컨트롤러 호출
꼭 컨트롤러가 아니여도 상관없다 핵심은 QRUtil에 들어있는 makeQR이 핵심임
@RequestMapping(value="/makeqr") public void makeqr() throws WriterException, IOException { String url = "http://roqkffhwk.tistory.com"; int width = 50; int height = 50; String file_path = "D:"+File.separator+"qr"+File.separator; String file_name = "myblog.png"; QRUtil.makeQR(url, width, height, file_path, file_name); }
실행결과 브라우저에는 오류페이지만 뜨겠고, 우리가 여기서 확인해야 할 부분은
지정한 디렉토리 + 파일로 정상적으로 QR코드가 생성되었는지가 핵심이다.
※ 참고로 본인은 int qrColor 변수의 값을 변경하면서 다양한 색상으로 생성을 해보았다.
색상코드값 |
결과화면 |
0xFF2d64e9 |
|
0xFF2e4e96 |
|
0xFF106f63 |
|
0xFF766c15 |
|
0xFF004555 |
|
0xFF557615 |
|
0xFF764515 |
|
0xFFad1004 |
|
0xFFbd4700 |
|
위와같이 다양한 색깔로 잘 나왔다. 잘 사용하시길 ^^
1. 지속적인 구독을 원하신다면 네이버 이웃추가 부탁드립니다
2. 도움이 되셨다면 공감한번 꾹! 눌러주세요
3. 궁금하신점이 있으시다면 댓글 GOGO
스프링3(spring3) 을 이용하면서 쿼츠/배치/스케쥴러 연동하기 -DB연동 (4) | 2014.09.28 |
---|---|
스프링3(spring3) 을 이용하여 간단 스케쥴러 세팅을 하도록 하자 (8) | 2014.09.20 |
class파일내에서 classpath에 존재하는 리소스 파일읽어오기 (0) | 2014.07.30 |
스프링3(Spring3) - 메이븐(maven) pom.xml에서 오라클 JDBC(ojdbc14.jar) 라이브러리 추가하기 (0) | 2014.07.30 |
스프링3(Spring3) - RedirectAttributes를 이용하여 리다이렉트 POST 방식으로 데이터 전송하기 (0) | 2014.07.30 |
간혹가다 spring + mybatis가 아닌 spring + ibatis 연동을 원하는 분들을 위해 포스팅 하게되었음.
2014/07/22 - [스프링연동하기/spring3 mvc 설정] - 스프링3(Spring3) MVC 연동 (1) - STS 다운로드 및 헬로월드 출력하기
2014/07/22 - [스프링연동하기/spring3 mvc 설정] - 스프링3(Spring3) MVC 연동 (2) - 폼값 전송 + 인코딩 설정
2014/07/22 - [스프링연동하기/spring3 mvc 설정] - 스프링3(Spring3)MVC 연동 (3) - 서버값 웹페이지로 전송하기
2014/07/22 - [스프링연동하기/spring3 mvc 설정] - 스프링3(Spring3) MVC 연동 (4) - 서버에 파일전송
spring 기본 연동이 되었다면 다음과 같이 ibatis 연동을위한 pom.xml설정을 잡아보도록 하자
설명은 MySQL 기준으로 진행함
● POM.xml dependency 추가
<dependency> <groupId>org.apache.ibatis</groupId> <artifactId>ibatis-sqlmap</artifactId> <version>2.3.4.726</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.31</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring-framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring-framework.version}</version> </dependency>
● resources -> spring -> application-config.xml다 다음과 같은 코드 추가
<context:component-scan base-package="com.spring.web"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="apmsetup" /> </bean> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:/sqlmap/sql-map-config.xml"/> <property name="dataSource" ref="dataSource"/> </bean>
● resources -> sql, sqlmap 폴더 생성
● application-config.xml에서 작성한 코드중 sqlMapClient bean의
configLocation이라는 property 속성의 value를 보면 sql-map-config.xml 을
바라보게 되있다.
● resources -> sqlmap 폴더안에 다음 파일을 추가
● resources -> sql 폴더내부에는 쿼리xml 파일들이 존재해야함
샘플파일은 하단에 첨부
※ 각파일들이 추가될때마다 sql-map-config.xml에 리소스 경로 추가해주어야함
● HelloWorldController클래스에 하단에 있는 코드추가
@Autowired private SpringDao dao; @RequestMapping("/ibatisTest") public void ibatisTest(){ try { ArrayList<String> list = dao.ibatisTest(); for(String str : list) { System.out.println(str); } } catch (SQLException e) { e.printStackTrace(); } }
com.spring.web.dao 패키지 생성 후 내부에 SpringDao.java 클래스를 생성
package com.spring.web.dao; import java.sql.SQLException; import java.util.ArrayList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.ibatis.sqlmap.client.SqlMapClient; @Repository public class SpringDao { @Autowired private SqlMapClient sql; @SuppressWarnings("unchecked") public ArrayList<String> ibatisTest() throws SQLException { return (ArrayList<String>)sql.queryForList("sql.showtable"); } }
spring3 + ibatis 연동완료!
트랜잭션은 제외한 샘플링임
트랜잭션 설정을 원한다면 mybatis에 트랜잭션 설정 부분을 참고하시길...
2014/07/25 - [스프링연동하기/spring3 mybatis 설정] - 스프링3(Spring3) - mybatis 연동(2) 트랜잭션설정
ibatis용 다중 db접속에 대한 설정은
2014/07/28 - [스프링연동하기/spring3 mybatis 설정] - 스프링3(Spring3) - mybatis 연동(3) 다중DB 접속 + 트랜잭션 설정
포스팅을 참고하면 되겠지만 추후에 별도로 ibatis용 다중DB접속에 대한 포스팅을 할 예정임
/ibatisTest URL 호출시 화면은 나오지 않을것임
단순 db통신후 데이터를 정상적으로 받을수 있는지 테스트를 하기 위한것일뿐
● 이클립스 콘솔실행 화면
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
스프링3(Spring3) - mybatis 연동(3) 다중DB 접속 + 트랜잭션 설정 (6) | 2014.07.28 |
---|---|
스프링3(Spring3) - mybatis 연동(2) 트랜잭션설정 (2) | 2014.07.25 |
스프링3(Spring3) - mybatis 연동(1) (6) | 2014.07.23 |