개요
회사에서 배치 프로세스를 분리해야 하는 일이 생겼습니다. 인터넷으로 이런 저런 조사를 해보는데 정상적인 문서를 찾기 힘든 것이 현실이고, 구했다 하더라도 입맛에 맞는 구조가 아닌 경우가 많아 최소한의 soruce를 통해 mybatis 연동(MariaDB)까지 정리 해보려 합니다.
본문의 순서는 다음과 같이 진행 하겠습니다.
1. Eclipse spring Boot 설치
2. Project 생성
3. Project 환경 설정
4. application.properties 설정
5. Source 코드 생성
6. 발생할 수 있는 오류
순으로 정리되어있습니다. 캡처를 할 경우 너무 여러 장을 찍어야 하기에 설치 순서는 동영상으로 대체하였습니다.
그럼 시작하겠습니다.
1. Eclipse spring Boot 설치
일단 spring boot 프로젝트를 생성하기 위해서는 Eclipse의 Spring Tool이 필요합니다. Eclipse의 Help 버튼을 눌러 Market Place에 들어가서 Spring Tool을 검색해서 Install 하고 Eclipse를 다시 시작 합니다.
Spring Tool 인스톨 영상
2. Project 생성
Project의 생성은 create a new project -> spring 검색 -> Spring Starter Project -> java 버전 선택 -> project 및 package 명 변경 -> spring batch 선택 -> Mybatis Framework 선택 -> finish 순으로 진행하였습니다.
project 생성 영상
3. Project 환경 설정
|
환경설정에 연관된 파일 |
환경설정에 연관된 파일은 2가지입니다.
1) pom.xml을 통한 라이브러리 환경 설정과
2) 프로젝트 환경 설정의 application.properties 파일입니다.
1) 라이브러리 환경설정
우선 저는 mariadb를 연결해야 하기에 mariadb의 maven 라이브러리를 pom.xml에 추가하겠습니다. maven을 통한 라이브러리 추가는 google 에서 maven +라이브러리 를 검색하거나
메이븐 사이트 https://mvnrepository.com/
위 링크로 접속하셔서 해당 라이브러리를 검색하시면 쉽게 dependency 정보를 찾을 수 있습니다.
|
mysql 드라이버 정보 |
검색된 메이븐 라이브러리중 자신에게 해당하는 버전을 클릭하면 이렇게 하단에 디팬던시 정보가 표기되어 해당 정보를 pom.xml에 붙여넣기 하면 됩니다.
|
pom.xml에 붙여넣기 |
4. application.properties 설정
application.properties에 프로젝트에 사용할 환경 설정을 추가해줍니다. application.properties 는 spring toole에서 자동 완성을 지원합니다. 구동 화면은 아래와 같습니다.
application.property 설정 영상
실제 application.properties에 수록된 내용은 다음과 같습니다.
#데이터 베이스 연결에 사용할 드라이버
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#데이터베이스 url
spring.datasource.url=jdbc:mysql://192.168.0.1:6330/test?serverTimezone=UTC&characterEncoding=UTF-8
#계정
spring.datasource.username=testUser
#비밀번호
spring.datasource.password=testUser
#mapper 파일이 적재될 위치 sql mapper 파일과 동일하게 맞춰준다.
mybatis.mapper-locations=com/springBatchTest/mapper/*.xml
#커스텀 환경변수
custom.test=test-value
5. Source 코드 생성
우선 application.properties에 설정한 위치에 mapper xml파일을 만들어줍니다.
|
환경설정 순서(클릭시 커짐) |
현재 프로젝트의 application 설정이 마이바티스 까지 연동되는 구조는 다음 순서에 따라 이루어집니다.
application에서 모델을 연결해주는 것은 mapper location.
모델과 컨트롤러의 연결은 xml 파일내의 namespace가 classPath로 역할을 하게 되더군요.
수정 및 생성한 소스프로그램은 총 4개의 파일입니다.
1) testMapper.xml
2) TestDataMapper.java
3) TestDataService.java
4) SpringBatchTestApplication.java
차례대로 기술하겠습니다.
1) testMapper.xml
mysql DB에서 데이터를 조회할 sql 문을 입력합니다. 또한 namespace에 java에서 연동할 인터페이스의 패키지 경로와 파일명을 입력합니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 인터페이스의 패키지 경로와 클래스명 -->
<mapper namespace="com.springBatchTest.mapper.TestDataMapper">
<!-- 수행할 sql -->
<select id="getTestDataList" resultType="java.util.Map">
<![CDATA[
SELECT 1 AS COL1
UNION ALL
SELECT 2 AS COL1
]]>
</select>
</mapper>
sql은 간단하게 테스트를 수행할 수 있게 정의하였습니다.
2) TestDataMapper.java
mapper.xml 에 정의된 위치에 정의된 명칭으로 생성해줍니다. 인터페이스 내부에는 xml에 정의된 sql과 동일한 명칭 그리고 동일한 데이터 형식을 갖고 있는 함수가 있어야 합니다.
package com.springBatchTest.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TestDataMapper {
List<Map<String, Object>> getTestDataList();
}
mybatis framework과 java Application간의 인터페이스 역할만 해주므로 정말 내용이 없습니다. SQL이 늘어나는 만큼 증가합니다.
3) TestDataService.java
서비스에는 인터페이스에 정의된 형식과 동일한 서비스를 구성해줍니다. 이 파일 역시 자동 연결을 위한 선언 , 서비스 선언 이외에 특별한 내용이 없습니다.
package com.springBatchTest.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import com.springBatchTest.mapper.TestDataMapper;
@Service
public class TestDataService {
@Autowired
TestDataMapper testData ;
public List<Map<String, Object>> getTestDataList() {
return testData.getTestDataList();
}
}
4) SpringBatchTestApplication.java
package com.springBatchTest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import com.springBatchTest.service.TestDataService;
@SpringBootApplication
public class SpringBatchTestApplication {
public static void main(String[] args) {
try (ConfigurableApplicationContext ctx = SpringApplication.run(SpringBatchTestApplication.class , args)) {
SpringBatchTestApplication m = ctx.getBean(SpringBatchTestApplication.class );
m.selectDataf();
}catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
}
@Autowired
TestDataService testDataService;
public void selectDataf() {
List<Map<String, Object>> tmp = testDataService.getTestDataList();
System.out.println(tmp.size());
}
}
자 이제 테스트용 코드 생성은 끝났습니다.
6. 발생할 수 있는 오류
1) 정상 처리 시 디버깅 콘솔 내용
2021-05-24 19:28:03.528 INFO 10964 --- [ main] c.s.SpringBatchTestApplication : Starting SpringBatchTestApplication using Java 15.0.1 on DESKTOP-3QN7REN with PID 10964 (D:\blogger\springBatchTest\target\classes started by jinyboys in D:\blogger\springBatchTest)
2021-05-24 19:28:03.533 INFO 10964 --- [ main] c.s.SpringBatchTestApplication : No active profile set, falling back to default profiles: default
2021-05-24 19:28:06.259 INFO 10964 --- [ main] c.s.SpringBatchTestApplication : Started SpringBatchTestApplication in 3.553 seconds (JVM running for 4.553)
2021-05-24 19:28:06.277 INFO 10964 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2021-05-24 19:28:06.771 INFO 10964 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2
2021-05-24 19:28:06.897 INFO 10964 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
945 INFO 10964 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
수행할 로직이 없기 때문에 약 3,4초만에 수행되고 종료되며 임시로 생성된 sql에서 받는 데이터 2건에 대한 사이즈 정보가 표기됩니다.
2) application.properties내의 mapper 경로가 잘못 된 경우
빨간색 글자처럼 파일을 찾을 수 없다는 메시지가 나옵니다.
2021-05-24 19:31:39.543 INFO 7172 --- [ main] c.s.SpringBatchTestApplication : Starting SpringBatchTestApplication using Java 15.0.1 on DESKTOP-3QN7REN with PID 7172 (D:\blogger\springBatchTest\target\classes started by jinyboys in D:\blogger\springBatchTest)
2021-05-24 19:31:39.553 INFO 7172 --- [ main] c.s.SpringBatchTestApplication : No active profile set, falling back to default profiles: default
2021-05-24 19:31:42.462 INFO 7172 --- [ main] c.s.SpringBatchTestApplication : Started SpringBatchTestApplication in 3.802 seconds (JVM running for 5.327)
2021-05-24 19:31:42.479 INFO 7172 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2021-05-24 19:31:42.987 INFO 7172 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2021-05-24 19:31:43.074 INFO 7172 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2021-05-24 19:31:43.086 INFO 7172 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
Invalid bound statement (not found): com.springBatchTest.mapper.TestDataMapper.getTestDataList
3) mapper.xml 파일 내부 SQL구문의 ID와 mapper.java 인터페이스가 불일치 할 경우
위와 동일한 오류가 발생합니다.
Invalid bound statement (not found): com.springBatchTest.mapper.TestDataMapper.getTestDataList
4) service.java 클래스 내에 @Autowired 설정이 없는 경우
Cannot invoke "com.springBatchTest.mapper.TestDataMapper.getTestDataList()" because "this.testData" is null
5) mapper.java 클래스가 없거나 비정상 , @mapper 설정이 없는 경우
Description:
Field testData in com.springBatchTest.service.TestDataService required a bean of type 'com.springBatchTest.mapper.TestDataMapper' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.springBatchTest.mapper.TestDataMapper' in your configuration.
Error creating bean with name 'springBatchTestApplication': Unsatisfied dependency expressed through field 'testService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testDataService': Unsatisfied dependency expressed through field 'testData'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.springBatchTest.mapper.TestDataMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
이상 스프링 배치 프로젝트 생성부터 mybatis 연동까지 그리고 발생할 수 있는 오류까지 알아봤습니다.
이렇게 쉽게 4개의 파일만 설정하면 연동할 수 있는 기본적인 형태를 이해하지 못하고 엉뚱하게 정리 해 놓은 글들이 너무 많아 직접 정리를 해 보았습니다. 누군가에게 도움이 되면 좋겠네요 ㅎㅎ.