Framework/Spring Boot😊

[Spring Boot] 공공데이터 API 를 활용하여 DataBase 에 Scheduled를 통해 insert 하기

2023. 8. 10. 16:47
목차
  1. 1. controller
  2. 2. Service
  3. 3. Mapper

https://www.data.go.kr/index.do

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

공공데이터를 사용 할 일이 있어서 위의 포털에서 데이터를 DB에 밀어넣을 일이 생겼다.

 

나같은경우는 표준산업분류코드를 사용했다.

 

기본적으로 공공데이터포털에서 로그인 > 활용신청은 끝난 상태라고 생각하고, 코드상에서만 설명하겠다.

 

1. controller

/*
* 1. www.data.go.kr (공공데이터포털)
* 2. 표준산업분류코드 API
* 3. 24개월마다 갱신해줘야됨 (마지막 갱신일 2023.08.09 박성윤)
* 4. 데이터는 JSON 형태로 받아옴
* */
@RestController
@RequestMapping("/api/batch/indust")
public class IndustController {
@Autowired
private IndustService industService;
@Value("${api.url}") // application.properties 또는 yml 파일에 설정한다.
private String apiUrl;
@Value("${api.serviceKey}") // application.properties 또는 yml 파일에 설정한다.
private String serviceKey;
@PostMapping
@Scheduled(cron = "0 0 3 1 9 ?")
public ResponseEntity<String> industBatch() throws Exception{
try {
String responseData = fetchDataFromAPI();
// 가져온 데이터를 DTO 객체 리스트로 파싱
List<IndustDataDto> dataList = parseResponseData(responseData);
// 데이터를 DB에 저장
industService.insertData(dataList);
return ResponseEntity.ok(responseData);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}
private List<IndustDataDto> parseResponseData(String responseData) throws Exception {
JSONObject jsonObj = new JSONObject(responseData);
JSONArray dataArray = jsonObj.getJSONArray("data");
List<IndustDataDto> dataList = new ArrayList<>();
for (int i = 0; i < dataArray.length(); i++) {
JSONObject item = dataArray.getJSONObject(i);
IndustDataDto data = new IndustDataDto();
data.setMajor_emp_name(item.optString("고용업종명(대분류)"));
data.setMajor_emp_code(item.optString("고용업종코드(대분류)"));
data.setSub_emp_name(item.optString("고용업종명(중분류)"));
if(!item.isNull("고용업종코드(중분류)")) {
data.setSub_emp_code(item.getInt("고용업종코드(중분류)"));
}
data.setMinor_emp_name(item.optString("고용업종명(소분류)"));
if(!item.isNull("고용업종코드(소분류)")) {
data.setMinor_emp_code(item.getInt("고용업종코드(소분류)"));
}
data.setDetail_emp_name(item.optString("고용업종명(세세분류)"));
if(!item.isNull("고용업종코드(세세분류)")) {
data.setDetail_emp_code(item.getInt("고용업종코드(세세분류)"));
}
dataList.add(data);
}
return dataList;
}
private String fetchDataFromAPI() throws Exception {
// API URL 구성
StringBuilder urlBuilder = new StringBuilder(apiUrl);
urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + serviceKey);
urlBuilder.append("&" + URLEncoder.encode("page","UTF-8") + "=" + URLEncoder.encode("1","UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("perPage","UTF-8") + "=" + URLEncoder.encode("1200","UTF-8"));
// HTTP 요청 수행
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
try (BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} finally {
conn.disconnect();
}
}
}

 

2. Service

@Service
public class IndustService {
@Autowired
private IndustMapper industMapper;
public void insertData(List<IndustDataDto> dataList) {
for(IndustDataDto data : dataList) {
industMapper.insertIndustData(data);
}
}
}

 

3. Mapper

@Mapper
public interface IndustMapper {
void insertIndustData(IndustDataDto data);
}

 

저작자표시 (새창열림)

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

[Spring Boot] Spring Security 의존성 추가 시 bulid.gradle 파일 에러 해결  (0) 2023.07.25
[Spring Boot] 프로젝트 (3) - 이클립스 Spring Boot 프로젝트 구축 및 로그설정  (0) 2023.07.13
[Spring Boot] sentry 를 스프링부트에 적용 (에러로그수집)  (0) 2022.09.21
[Spring boot] spring security 을 사용한 로그인 구현  (0) 2022.04.27
[Spring] Spring 과 Spring Boot 차이  (0) 2020.10.18
  1. 1. controller
  2. 2. Service
  3. 3. Mapper
'Framework/Spring Boot😊' 카테고리의 다른 글
  • [Spring Boot] Spring Security 의존성 추가 시 bulid.gradle 파일 에러 해결
  • [Spring Boot] 프로젝트 (3) - 이클립스 Spring Boot 프로젝트 구축 및 로그설정
  • [Spring Boot] sentry 를 스프링부트에 적용 (에러로그수집)
  • [Spring boot] spring security 을 사용한 로그인 구현
yoob
yoob
😎 Current : Back-end Developer          💻 Interests : Kotlin, Restful API                          📧 Contact : psung616@naver.com
yoob의 기술블로그😎 Current : Back-end Developer          💻 Interests : Kotlin, Restful API                          📧 Contact : psung616@naver.com
yoob
yoob의 기술블로그
yoob

블로그 메뉴

  • 🥳 힙한 생활용품 마켓 바로가기 ⬅️
전체
오늘
어제
  • 분류 전체보기 (121)
    • 프로그래머스 코테 (29)
      • 프로그래머스 Lv. 0 (11)
      • 프로그래머스 Lv. 1 (13)
      • 프로그래머스 Lv. 2 (5)
      • 프로그래머스 Lv. 3 (0)
    • Java (16)
      • Java😊 (12)
      • JSP😊 (4)
    • MSA (1)
      • Micro Service.. (1)
    • AWS (2)
      • AWS EC2 (1)
      • AWS RDS (1)
      • AWS EBS (0)
    • Framework (14)
      • Spring😊 (6)
      • Spring Boot😊 (6)
      • MyBatis😊 (1)
      • JPA (1)
    • JavaScript (16)
      • JavaScript😊 (9)
      • Jquery😊 (7)
    • Linux (6)
      • Linux😜 (6)
    • DBMS (10)
      • DataBase (10)
    • Server (4)
      • Server (4)
    • Python (3)
      • Python (3)
    • Git (3)
    • HTML5+CSS3 (3)
      • HTML5😊 (3)
      • CSS3😊 (0)
    • 창고 (12)
      • MAC OS (0)
      • 정보처리기사 (8)
      • TMI (4)

인기 글

최근 글

최근 댓글

10-15 14:07
hELLO · Designed By 정상우.
yoob
[Spring Boot] 공공데이터 API 를 활용하여 DataBase 에 Scheduled를 통해 insert 하기
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.