본문 바로가기
DEV/Spring Boot

Spring Boot Batch - MongoDB 연동하기

by wooki4307 2020. 12. 6.

다음 글이 늦었습니다.

 

저번에는 MongoDB를 단순 클래스파일 내에서 MongoDB를 연결하고 샘플로 데이터까지 INSERT하고 SELECT를 해보았습니다.

 

혹시 관련글 보고 싶으시면 아래 링크 참조해 주세요!

 

wooki92.tistory.com/10

 

Spring Boot - MongoDB 연동하기

음... 얼마전에서 부턴가 갑자기 Mongo DB 에 대해 끌리게 되었다. 이유는... 없었다...ㅎㅎ 굳이 있다면 웹서핑 하다 MongoDB Atlas가 무료로 어느정도 지원을 해주는것을 봤기 때문일까... 1주일간 여러

wooki92.tistory.com

저번엔 좀 날림으로 작성한 느낌이 있는데 이번엔 좀 공들여서 써보겠습니다.

 

요즘엔 Vue랑 Spring Boot를 연동해 웹 페이지를 제작하고 있는데 이 내용은 나중에 정리 되면 공유드리겠습니다.

 

자 이제 본론으로 넘어갈게요!

 

Spring Boot를 연동하게 되면 막막~ 합니다... 어려운 글도 많고, 영어가 거의 대부분이어서... 제가 초보개발자라 그 심정으로 알려드릴게요

 

빠른 보기를 원하시면 1번째~8번째 까지 검색하시면 됩니다.

1번째. Maven / Gradle에 Dependency를 추가합니다.

총 1개의 Dependency를 추가합니다. (Batch관련 Dependency는 여기서는 제외했습니다)

다른 Dependency인 org.mongodb 는 Java에서 실행할때 사용하는 거라 현재로는 필요가 없습니다.

 

해당 Dependency의 역할은 JPA Dependency의 역할과 동일하다고 보시면 됩니다.

 

저장, 검색, 삭제의 메소드도 있고 MongoDB 설정과 관련한 메소드도 같이 제공하고 있어서 확인이 필요하신 분은 디컴파일 해서 확인해보시면 좋을거같아요

 

2번째. 사용하려는 클래스 파일에 다음의 어노테이션을 선언해 주세요

- @Configuration

  > 하나 이상의 Bean메소드를 선언하여 Spring 실행중에 해당 클래스의 내용을 요청하여 생성 및 처리하는 경우에 사용

- @RequiredArgsConstructor

  > 필수 인수로 생성자를 생성합니다. 필수 인수는 @NonNull과 같은 제약 조건이있는 최종 필드 및 필드입니다.

- @EnableBatchProcessing

  > 배치 프로세스 중에 사용되는 경우 선언

 

3번째. 배치 구동을 위한 변수 선언

MongoTemplate의 경우 해당 클래스의 내용은 MongoDB의 정보를 받아오거나, 새로 세팅을 하는 경우, 혹은 Select / Insert / Delete등의 RDB를 사용하기 위한 세팅이 가능한 클래스 파일입니다.

 

4번째. Job실행을 위한 메소드 생성!

저는 여기서 배치 실행을 위해 다음과 같이 메소드를 만들어서 작업했습니다. sampleJob의 경우 해당 Job은 실행하면 다음의 경우 실행이 안되요! Job 실행은 한번!이기 때문이죠! 지속적인 Job을 원하시면 Step을 나누어 주시면 될거 같습니다. 저는 간단한 용도니^^;

5번째. Reader 메소드 생성한다.

MongoItemReader라는 내용이 필요한데요. 이 클래스는 다른 배치에서 사용하든 ItemReader를 위해 사용하는 클래스 입니다.

 

mongoItemReader라는 변수 생성한 이후부터 같이 살펴보면,

 

MongoItemReader가 참조할 Template를 세팅해주고, Collection을 지정해줍니다. collection은 RDB로 따지면 Table(?) 정도 되겠네요

 

TargetType은 해당 쿼리를 통해 어느 클래스의 모델을 참조할 건지 지정해줍니다. Model혹은 DTO가 될 수 있겠죠? 안에는 클래스로 세팅 되어야 해요~

 

PageSize는 옵션이니깐 ^^ 설명은 안하겠습니다^^7 (귀찮은거 아님...)

 

그다음 제일 중요한 쿼리를 세팅하는 일입니다. 

 

NoSql이다 보니 RDB에서 사용하는 쿼리랑 조금 다르죠? MongoDB를 몇번 사용해보시면 금방 아실 수 있으실 거예요~

 

처음 주석은 RDB의 경우 다음과 같이 표현 가능하고 

   > storeLoaction = 'San Diego' 

 

주석이 없는 경우 item.name은 item Json의 name이라는 key값이 있어 해당의 경우 다음과 같이 접근 가능합니다.

 

두개를 and조건으로 묶었다고 보시면 됩니다.

 

   > storeLocation = 'SAN DIEGO' AND item.name = 'envelops'

 

그 이후 Sort를 해주는 값을 정해주고 넣으면 Reader는 끝!!

 

6번째. 그 다음은 Process 메소드를 만들어 준다.

이번엔 간단한 생성자로 실행하는 방법이예요. 한 클래스에 작성할 수 있으나, 혹시나 분리 하시길 원하시면 ^^

 

실제 Process의 내용은 간단하게 만들었습니다.

 

반환할 Model에 customer에 해당 데이터를 넣어주는게 답니다. ^^ 이역시도 귀찮은게 아닌 저의 테스트 용이라서 ^^7

 

7번째. Writer를 만들어준다.

하위 메소드도 메인 Configuration에 다음과 같이 만들어 줍니다.

실제 Writer는 다음과 같이 세팅해서 메소드를 만들어 줬습니다.

 

제 블로그까지 오신 분들이라면, 어떤 사이트는 MongoOperation을 사용해라, 어떤곳은 MongoTemplate으로 저장해라 하는 글들을 보셨을 거 같습니다. 

 

두개를 비교하자면 그렇게 큰 차이는 없습니다.

 

굳이 말하자면 Batch에는 MongoOperation, 웹에는 MongoTemplate? 가 낫다 라고 볼 수 있을 거 같아요.

 

MongoOperation의 경우 bulkOperation기능이 있어 대량으로 삽입이 가능해요. 배치 프로그램은 대용량, 빠른 속도가 필수니 이게 좀더 나을 거 같고요~

 

Web의 경우 Paging처리를 진행하다 보니 대용량대신 많은 메소드로 기능을 제공하는 MongoTemplate가 나을거 같네요

 

제 개인적인 생각이라 ^^; 이 글은 batch를 안쓰시는 분들도 있으니 mongoTemplate로 했습니다.

 

물론 MongoOperation으로도 동일하게 가능해요!

 

8번째. 실행하고 결과를 본다!

 

원하는 데이터가 들어간게 확인이 됐네요 ㅎㅎ

 

음... 제일 중요한건 MongoOperation과 MongoTemplate의 차이? 정도 될것 같네요!

 

앞뒤 두서없는 블로그 내용 봐주셔서 감사합니다.

 

외국 사이트는 무슨 말인지 몰라서... API를 찾아본다고 봤는데 ... ㅎㅎ

 

모두 도움이 되셨으면 좋겠습니다.

 

즐거운 개발 하세요~

 

p.s. 몽고 DB Setting에 대해 누락되었네요~

저의 경우는 MongoDB Atals에서 샘플데이터를 사용해서 유튭이나 다른 사이트에서 생성하는 방법이 나와있어요~

 

한번 연습삼아 만들어 보심을 추천드립니다~

 

참조:

www.tutorialsbuddy.com/spring-batch-with-mongodb-example

'DEV > Spring Boot' 카테고리의 다른 글

Spring Boot 1개에 DB 2개 연결?  (0) 2021.01.23
Spring Boot - MongoDB 연동하기  (0) 2020.11.29
Spring - Batch(배치)  (0) 2020.02.12