๊ด€๋ฆฌ ๋ฉ”๋‰ด

<Hello Hosung๐Ÿ˜Ž/>

[SpringBoot]Scheduling ๋ณธ๋ฌธ

๐Ÿ’ป Java/ใ…คJava(SpringBoot)

[SpringBoot]Scheduling

์ขŒ์ถฉ์šฐ๋Œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ผ๊ธฐ๐Ÿง 2024. 8. 16. 09:45


Spring Boot ์—์„œ ์Šค์ผ€์ค„ ๋งŒ๋“ค๊ธฐ
 
๋‹ค์Œ ์˜ˆ์ œ๋Š” ์—…๋น„ํŠธ open api ์™€ Spring Boot์˜ ์Šค์ผ€์ฅด๋Ÿฌ ๊ธฐ๋Šฅ์„ ํ†ตํ•˜์—ฌ ๋งค ์‹œ๊ฐ„ ๋งˆ๋‹ค ์—…๋น„ํŠธ์˜ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ Mysql ์— ์ ์žฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„œ์ˆ ํ•œ๋‹ค.

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

import com.example.demo.vo.UserInfo;
@EnableScheduling
@SpringBootApplication
public class StartApplication {

	public static void main(String[] args) {
		SpringApplication.run(StartApplication.class, args);
	}

}

 
๋จผ์ € spring boot ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์ง€์ ์— "@EnableScheduling" ์„ ์ž‘์„ฑํ•ด์ค€๋‹ค. ๊ทธ ์ดํ›„ ์œ„ ์˜ ์ž‘์„ฑํ•œ ์ž๋ฐ” ํŒŒ์ผ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€์— ์Šค์ผ€์ค„ class๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ค€๋‹ค.

package com.example.demo;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.common.Common;
/**
 * ๋ฐฐ์น˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
 * @author kimhosung
 *
 */
@Component
public class BatchScheduler {
	Logger logger = LoggerFactory.getLogger(this.getClass());
	
	
	// ์—…๋น„ํŠธ์— ์žˆ๋Š” ์ข…๋ชฉ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
	@Scheduled(fixedRate = 10000)
	public void scheduleFixedRateTask() {
	        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
	        Date now = new Date();
	        String strDate = sdf.format(now);
	        System.out.println("์ž‘์—… ๋‚ ์งœ ์‹œ๊ฐ„ fixedRate::" + strDate);
	        
	        Common.openapi("http://localhost:8081/batch/list");
	}
}

 
Common.openapi ๋ฉ”์†Œ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜์˜€๋‹ค.

package com.common;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
/**
 * ๊ณตํ†ต ๋ฉ”์†Œ๋“œ 
 * @author kimhosung
 *
 */
public class Common {
	
	//๋‹จ์ˆœ url call 
	public static void openapi(String url) {
        try {
	        HttpClient client = HttpClientBuilder.create().build();
	        HttpGet request = new HttpGet(url);
	        request.setHeader("Content-Type", "application/json");
			HttpResponse response = client.execute(request);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 
๊ทธ๋Ÿผ ๊ฒฐ๊ตญ "http://localhost:8081/batch/list" url ์„ ํ†ตํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด REST ๋ฐฉ์‹์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ• ๊ฒƒ์ด๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์˜ ์†Œ์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

package com.upbit.openapi;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.mapper.LoginMapper;
import com.example.demo.mapper.MarketListMapper;
import com.example.demo.vo.MartListVO;
import com.example.demo.vo.UserInfo;

@RestController
@CrossOrigin(origins = "http://localhost:8080") // ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์„ค์ •
@Service
public class BatchProgram {
	
	@Autowired
	MarketListMapper mrMapper;
	
	/*
	 * ๋งˆ์ผ“์˜ ์ข…๋ชฉ์˜ ๋ช…์นญ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. 
	 */
	@RequestMapping(value="/batch/list", method=RequestMethod.GET)
	public void testpp() {
		
		try {
	        HttpClient client = HttpClientBuilder.create().build();
	        HttpGet request = new HttpGet("https://api.upbit.com/v1/market/all");
	        request.setHeader("Content-Type", "application/json");

	        HttpResponse response = client.execute(request);
	        HttpEntity entity = response.getEntity();
	        String json = EntityUtils.toString(entity, "UTF-8");
	        
    		JSONParser parser = new JSONParser();
    		JSONArray jsonarray = (JSONArray) parser.parse(json);
    		
    		//ํ…Œ์ด๋ธ” ์ดˆ๊ธฐ
    		mrMapper.initMarketList();
    		
    		for (int i = 0; i < jsonarray.size(); i++) {
    			JSONObject obj = (JSONObject) jsonarray.get(i);
    			MartListVO vo = new MartListVO();
    			vo.setMr_cd(obj.get("market").toString());
    			vo.setEng_nm(obj.get("english_name").toString());
    			vo.setKor_nm(obj.get("korean_name").toString());
    			 try {
    				 mrMapper.insertMarketList(vo);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
    		}
    		
    		
		} catch (org.apache.http.ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (org.json.simple.parser.ParseException e) {
			e.printStackTrace();
		}	
	}
}

 
์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•˜๊ฒŒ ๋ด์•ผ๋  ๋ถ€๋ถ„์€ json ํ˜•์‹์˜ ํŒŒ์‹ฑ ๋ฐฉ๋ฒ•์ด๋‹ค.
JSONParser parser = new JSONParser();
JSONArray jsonarray = (JSONArray) parser.parse(json);
์œ„์™€ ๊ฐ™์ด JSONParser๋ฅผ ๋งŒ๋“ค๊ณ  JSON์ด [] ๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์˜€๋‹ค.
jsonarray์— String์œผ๋กœ ๋œ json ์„ ๋‹ด์•„ ํŒŒ์‹ฑํ•œ๋‹ค.
๊ทธ ๋‹ค์Œ ์•„๋ž˜์™€ ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ด ์„œ๋น„์Šค๋Š” @Mapper๋กœ ์„ ์–ธ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— mapper ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

package com.example.demo.mapper;


import org.apache.ibatis.annotations.Mapper;

import com.example.demo.vo.MartListVO;

@Mapper
public interface MarketListMapper {

	int insertMarketList(MartListVO vo);
	
	int initMarketList();
}

 
mapper.xml

<?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.example.demo.mapper.MarketListMapper">
    
    <insert id="insertMarketList" parameterType="MartListVO" >
		INSERT INTO `shoppingMall`.`TB_MR_LIST`
		(`MR_CD`,
		`KOR_NM`,
		`ENG_NM`,
		`SYS_DT`)
		VALUES
		(#{mr_cd},
		#{kor_nm},
		#{eng_nm},
		sysdate())	
    </insert>

	<delete id="initMarketList">
		TRUNCATE TB_MR_LIST;
	</delete>
</mapper>