maven (3)
스프링 부트(Spring boot)에서 mybatis(oracle) 적용하기

2016/09/19 - [개발/JAVA] - 스프링 부트(Spring boot)에서 logback 적용하기


이어서.. 스프링 부트에서 마이바티스를 연동해 보도록 하겠습니다.

실무에서 주로 사용되는 mapper xml을 이용한 방법을 살펴보겠습니다.

DB는 오라클을 사용하지만 드라이버만 바꾸면 다른 종류의 DB도 사용이 가능합니다.


pom.xml

오라클 드라이버는 메이븐 중앙 저장소에 없기 때문에 오라클 저장소를 추가해 줍니다.

parent와 동일 레벨로 저장소를 추가합니다.


<repositories>

        <repository>

            <id>oracle</id>

            <name>ORACLE JDBC Repository</name>

            <url>http://maven.jahia.org/maven2</url>

        </repository>

    </repositories>

그리고 오라클 드라이버와 mybatis spring goot starter 종속성을 추가해줍니다.

마이바티스에서 스프링 대응하여 나온 것으로 기존 마이바티스는 필요없습니다.

(http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure)

<dependency>

        <groupId>org.mybatis.spring.boot</groupId>

        <artifactId>mybatis-spring-boot-starter</artifactId>

        <version>1.1.1</version>

    </dependency>

         

    <dependency>

        <groupId>com.oracle</groupId>

        <artifactId>ojdbc6</artifactId>

        <version>11.1.0.7.0</version>

    </dependency>


application.yml

spring.datasource 설정 부분이 추가되었으며, mybatis 설정 부분이 추가되었습니다.

mybatis-config.xml형식으로 설정을 하고 싶으면 mybatis.config-location설정을 쓰시면 됩니다.

다양한 설정 항목들이 있으니 스프링, 마이바티스 문서를 참고해 주세요.

datasource항목은 대부분 개발과 상용이 다를테니 샘플보다는 프로파일별로 옮겨서 관리를 하시는게 좋습니다.

spring:
  profiles: 
    active: dev
  timerName: exampleTimer
  datasource:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@111.222.111.222:1521:SIDHERE
    username: donnert
    password: password
---
mybatis:
  mapper-locations: classpath:mapper/**/*.xml
  configuration:
    lazyLoadingEnabled=true
    aggressiveLazyLoading=false
    mapUnderscoreToCamelCase=true
---
spring:
  profiles: local
  task:
    fixedDelay: 1000
    name: localTask
---
spring:
  profiles: dev
  task:
    fixedDelay: 5000
    name: devTask

Application.java

기존에 사용하시던대로 MapperScan어노케이션으로 매퍼 패키지 위치를 정의해 줍니다.

package net.donnert.spring.boot;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
@MapperScan("net.donnert.spring.boot")
public class Application {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

TestMapper.java

쿼리 xml과의 인터페이스를 제공해줍니다.

package net.donnert.spring.boot;

public interface TestMapper {
	public String getValueFromDatabase();
}


testMapper.xml

src/main/resources하위에 mapper폴더 생성 후 testMapper.xml을 생성해 줍니다.

내용은 위에서 정의한 인터페이스 쿼리를 작성해줍니다.




    

Timer.java

매퍼 빈을 주입 받아서 그냥 호출하면 됩니다.

package net.donnert.spring.boot;

import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;

@Component
public class Timer {
	Logger logger = LoggerFactory.getLogger(this.getClass());
	private AtomicInteger loopCounter = new AtomicInteger();
	
	@Autowired
	private StopWatch watch;
	
	@Autowired
	private TestMapper testMapper;
	
	@Value("${spring.task.name}")
	private String taskNamePrefix;
	
	@Value("${spring.timerName}")
	private String timerName;
	
	@PostConstruct
	public void init() {
		logger.info("{} init", timerName);
		watch.start();
	}

	@Scheduled(fixedDelayString = "${spring.task.fixedDelay}")
	public void tick() throws InterruptedException{
		watch.stop();
		logger.info(testMapper.getValueFromDatabase());
		String taskName = taskNamePrefix + "-" + String.valueOf(loopCounter.getAndIncrement());
		watch.start(taskName);
	}

	@Bean
	public StopWatch watch() {
		return new StopWatch();
	}
}

테스트

실행해 보면 아래처럼 쿼리 로그와 결과가 정상적으로 찍히는 모습을 볼 수 있습니다.

2016-09-20 13:56:08.904  INFO(12012)[main] [net.donnert.spring.boot.Timer:33] exampleTimer init
2016-09-20 13:56:09.286  INFO(12012)[main] [o.s.j.e.a.AnnotationMBeanExporter:431] Registering beans for JMX exposure on startup
2016-09-20 13:56:09.349  INFO(12012)[main] [o.s.s.a.ScheduledAnnotationBeanPostProcessor:244] No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
2016-09-20 13:56:09.372  INFO(12012)[main] [n.d.spring.boot.Application:57] Started Application in 3.229 seconds (JVM running for 3.793)
2016-09-20 13:56:10.812 DEBUG(12012)[pool-2-thread-1] [n.d.s.b.T.getValueFromDatabase:145] ==>  Preparing:  SELECT NAME FROM TEST WHERE ROWNUM=1
2016-09-20 13:56:10.902 DEBUG(12012)[pool-2-thread-1] [n.d.s.b.T.getValueFromDatabase:145] ==> Parameters: 
2016-09-20 13:56:10.930 DEBUG(12012)[pool-2-thread-1] [n.d.s.b.T.getValueFromDatabase:145] <==      Total: 1
2016-09-20 13:56:10.932  INFO(12012)[pool-2-thread-1] [net.donnert.spring.boot.Timer:40] 테스트이름

간단한 예제같지만 프로파일, 로깅, DB연결 등 필요한 부분들은 모두 들어가 있기 떄문에 실무에서도 

배치나 데몬 프로세스로 충분히 사용하실 수 있습니다.

스프링 부트를 이용하면 복잡한 설정도 필요없고

이미 구현된 것들을 설정만 해서 쓰는 방식이기 때문에 개발 시간이 많이 단축됩니다.


완성소스

https://github.com/donnert/spring-boot/tree/master/spring-boot-batch


2  Comments,   0  Trackbacks
  • 크로노
    정말 정말 감사합니다^^
    계속 해맷는데 이제야 되는 소스를 찾았네요^^
  • jepark3452
    pom.xml에 오라클 추가시 에러나시는분들은

    <!-- dependencies 태그 위쪽에 추가 하세요.-->
    <repositories>
    <repository>
    <id>oracle</id>
    <name>ORACLE JDBC Repository</name>
    <url>https://maven.atlassian.com/3rdparty/</url>
    </repository>
    </repositories>

    <!-- dependencies 태그 안쪽에 추가하세요. -->
    <dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>12.1.0.1-atlassian-hosted</version>
    </dependency>


    참고하세요~

    ※ 참고 : https://github.com/regenea8/GroupWare/blob/master/GroupWare/pom.xml
댓글 쓰기
스프링 부트(Spring boot)에서 프로퍼티 사용하기

개요

개발을 하다보면 당연하지만 properties 파일을 사용합니다.

간단하게 스프링 부트에서 사용하는 방식을 살펴보겠습니다.

마찬가지로 이전 글과 이어집니다.

2016/09/07 - [개발/JAVA] - 스프링 부트(Spring boot)로 scheduling 개발하기


프로퍼티 생성

new-Source Folder를 선택하여 src/main/resources폴더를 생성합니다.

그리고 생성된 폴더에 application.properties만들고 다음과 같이 작성합니다.

spring.task.fixedDelay=2000

spring.task.name=donnert



Timer 수정

package net.donnert.spring.boot;

import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;

@Component
public class Timer {
	Logger logger = LoggerFactory.getLogger(this.getClass());
	private AtomicInteger loopCounter = new AtomicInteger();
	
	@Autowired
	private StopWatch watch;
	
	@Value("${spring.task.name}")
	private String taskNamePrefix;
	
	@PostConstruct
	public void init() {
		watch.start();
	}

	@Scheduled(fixedDelayString = "${spring.task.fixedDelay}")
	public void tick() throws InterruptedException{
		watch.stop();
		logger.info(watch.prettyPrint());
		String taskName = taskNamePrefix + "-" + String.valueOf(loopCounter.getAndIncrement());
		watch.start(taskName);
	}

	@Bean
	public StopWatch watch() {
		return new StopWatch();
	}
}


마무리

Application.java를 돌려보면 아래처럼 설정에서 읽어돠 2초마다 수행이 된 것을 볼 수 있습니다.

application.properties는 스프링 부트에서 기본으로 읽어오는 프로퍼티입니다.

-----------------------------------------

ms     %     Task name

-----------------------------------------

00157  002%  

02000  020%  donnert-0

02002  020%  donnert-1

02002  020%  donnert-2

02001  020%  donnert-3

02000  020%  donnert-4


0  Comments,   0  Trackbacks
댓글 쓰기
스프링 부트(Spring boot)로 개발하기

프로젝트 생성

new-project-Maven Project를 생성한다.

groupId와 artifactId를 적고 프로젝트 생성을 하면 이미지처럼 나오게 된다.

(그냥 아무 프로젝트 만들어서 우클릭-configure-convert to maven project로 해도 된다)


Spring boot 라이브러리 추가

pom.xml을 열어서 dependencies와 동일 레벨로 parent를 추가한다.

  
    org.springframework.boot
    spring-boot-starter-parent
    1.4.0.RELEASE
   

dependencies 하위 항목으로 다음을 추가한다.

        
	        org.springframework.boot
	        spring-boot-starter
        


메인 소스 작성

Application 클래스를 생성하여 다음과 같이 작성 해준다.

package donnert.spring.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

테스트

실행을 해보면 다음과 같이 스프링이 돌아가는걸 볼 수 있다.

아무것도 없는 기본 예제지만 스프링 기반의 환경(?)이 만들어 졌다.


다음글로 계속..

2016/09/07 - [개발/JAVA] - 스프링 부트(Spring boot)로 scheduling 개발하기



  .   ____          _            __ _ _

 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \

( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )

  '  |____| .__|_| |_|_| |_\__, | / / / /

 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::        (v1.3.5.RELEASE)


2016-09-07 11:06:27.631  INFO 5216 --- [           main] net.donnert.spring.boot.Application      : Starting Application on ezen-PC with PID 5216 (D:\Java\workspace\Ezens\paynow_simulator\spring.boot\target\classes started by donne in D:\Java\workspace\Ezens\paynow_simulator\spring.boot)

2016-09-07 11:06:27.635  INFO 5216 --- [           main] net.donnert.spring.boot.Application      : No active profile set, falling back to default profiles: default

2016-09-07 11:06:27.718  INFO 5216 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6765f738: startup date [Wed Sep 07 11:06:27 KST 2016]; root of context hierarchy

2016-09-07 11:06:28.888  INFO 5216 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup

2016-09-07 11:06:28.907  INFO 5216 --- [           main] net.donnert.spring.boot.Application      : Started Application in 1.674 seconds (JVM running for 2.058)

2016-09-07 11:06:28.908  INFO 5216 --- [       Thread-1] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6765f738: startup date [Wed Sep 07 11:06:27 KST 2016]; root of context hierarchy

2016-09-07 11:06:28.910  INFO 5216 --- [       Thread-1] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown



0  Comments,   0  Trackbacks
댓글 쓰기