From 3bd1a4bba07fbc8db4b8c1abf993d171dbf8a2f0 Mon Sep 17 00:00:00 2001 From: sxxxxxb Date: Mon, 27 Jul 2026 17:06:38 +0900 Subject: [PATCH] =?UTF-8?q?=EC=86=8C=EC=8A=A4=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vpp}/JcmsVppApplication.java | 2 +- .../vpp}/MainController.java | 8 +++- .../Api => jcms/vpp/api}/ApiClient.java | 7 ++- .../Api => jcms/vpp/api}/ApiResponse.java | 4 +- .../vpp/api}/RestClientConfig.java | 2 +- .../vpp}/station/Station.java | 2 +- .../vpp}/station/StationController.java | 5 +- .../net/jwsi/jcms/vpp/station/StationDto.java | 44 +++++++++++++++++ .../vpp}/station/StationRepository.java | 3 +- .../vpp}/station/StationService.java | 48 ++++++++++++++----- .../net/jwsi/jcms_vpp/station/StationDto.java | 18 ------- src/main/resources/application-dev.yml | 2 + .../vpp}/JcmsVppApplicationTests.java | 2 +- .../jcms/vpp/station/StationServiceTest.java | 44 +++++++++++++++++ 14 files changed, 145 insertions(+), 46 deletions(-) rename src/main/java/net/jwsi/{jcms_vpp => jcms/vpp}/JcmsVppApplication.java (93%) rename src/main/java/net/jwsi/{jcms_vpp => jcms/vpp}/MainController.java (84%) rename src/main/java/net/jwsi/{jcms_vpp/Api => jcms/vpp/api}/ApiClient.java (81%) rename src/main/java/net/jwsi/{jcms_vpp/Api => jcms/vpp/api}/ApiResponse.java (77%) rename src/main/java/net/jwsi/{jcms_vpp/Api => jcms/vpp/api}/RestClientConfig.java (94%) rename src/main/java/net/jwsi/{jcms_vpp => jcms/vpp}/station/Station.java (95%) rename src/main/java/net/jwsi/{jcms_vpp => jcms/vpp}/station/StationController.java (80%) create mode 100644 src/main/java/net/jwsi/jcms/vpp/station/StationDto.java rename src/main/java/net/jwsi/{jcms_vpp => jcms/vpp}/station/StationRepository.java (66%) rename src/main/java/net/jwsi/{jcms_vpp => jcms/vpp}/station/StationService.java (54%) delete mode 100644 src/main/java/net/jwsi/jcms_vpp/station/StationDto.java rename src/test/java/net/jwsi/{jcms_vpp => jcms/vpp}/JcmsVppApplicationTests.java (87%) create mode 100644 src/test/java/net/jwsi/jcms/vpp/station/StationServiceTest.java diff --git a/src/main/java/net/jwsi/jcms_vpp/JcmsVppApplication.java b/src/main/java/net/jwsi/jcms/vpp/JcmsVppApplication.java similarity index 93% rename from src/main/java/net/jwsi/jcms_vpp/JcmsVppApplication.java rename to src/main/java/net/jwsi/jcms/vpp/JcmsVppApplication.java index 0c22343..5441fed 100644 --- a/src/main/java/net/jwsi/jcms_vpp/JcmsVppApplication.java +++ b/src/main/java/net/jwsi/jcms/vpp/JcmsVppApplication.java @@ -1,4 +1,4 @@ -package net.jwsi.jcms_vpp; +package net.jwsi.jcms.vpp; import net.jwsi.jcms.JcmsCmsApp; import org.springframework.boot.SpringApplication; diff --git a/src/main/java/net/jwsi/jcms_vpp/MainController.java b/src/main/java/net/jwsi/jcms/vpp/MainController.java similarity index 84% rename from src/main/java/net/jwsi/jcms_vpp/MainController.java rename to src/main/java/net/jwsi/jcms/vpp/MainController.java index 6271610..ec1d9ec 100644 --- a/src/main/java/net/jwsi/jcms_vpp/MainController.java +++ b/src/main/java/net/jwsi/jcms/vpp/MainController.java @@ -1,10 +1,11 @@ -package net.jwsi.jcms_vpp; +package net.jwsi.jcms.vpp; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.jwsi.jcms.cms.board.arti.BodArti; import net.jwsi.jcms.cms.board.arti.BodArtiService; import net.jwsi.jcms.exception.JsonDataException; import net.jwsi.jcms.utils.HttpUtil; +import net.jwsi.jcms.vpp.station.StationService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -15,6 +16,7 @@ import java.util.Map; @Controller @RequiredArgsConstructor public class MainController { + private final StationService stationService; final private String path = "system/"; final private String root = "/"+path; @Value("${jcms.manager-path:system}") @@ -33,4 +35,8 @@ public class MainController { public Map listData(BodArti srch) throws JsonDataException { return HttpUtil.responseList(bodArtiService.selectList(srch)); } + @GetMapping("/sync-station") + public Object syncStation() { + return stationService.getStations(); + } } \ No newline at end of file diff --git a/src/main/java/net/jwsi/jcms_vpp/Api/ApiClient.java b/src/main/java/net/jwsi/jcms/vpp/api/ApiClient.java similarity index 81% rename from src/main/java/net/jwsi/jcms_vpp/Api/ApiClient.java rename to src/main/java/net/jwsi/jcms/vpp/api/ApiClient.java index 2cee313..41bebf5 100644 --- a/src/main/java/net/jwsi/jcms_vpp/Api/ApiClient.java +++ b/src/main/java/net/jwsi/jcms/vpp/api/ApiClient.java @@ -1,8 +1,7 @@ -package net.jwsi.jcms_vpp.common.client; +package net.jwsi.jcms.vpp.api; import lombok.RequiredArgsConstructor; -import net.jwsi.jcms_vpp.Api.ApiResponse; -import net.jwsi.jcms_vpp.station.StationDto; +import net.jwsi.jcms.vpp.station.StationDto; import org.springframework.core.ParameterizedTypeReference; import org.springframework.stereotype.Component; import org.springframework.web.client.RestClient; @@ -18,7 +17,7 @@ public class ApiClient { private final RestClient restClient; public ApiResponse> fetchStations(String baseUrl, String token) { - URI uri = UriComponentsBuilder.fromHttpUrl(baseUrl) + URI uri = UriComponentsBuilder.fromUriString(baseUrl) .path("/api/station/list") .build() .toUri(); diff --git a/src/main/java/net/jwsi/jcms_vpp/Api/ApiResponse.java b/src/main/java/net/jwsi/jcms/vpp/api/ApiResponse.java similarity index 77% rename from src/main/java/net/jwsi/jcms_vpp/Api/ApiResponse.java rename to src/main/java/net/jwsi/jcms/vpp/api/ApiResponse.java index 6dca6ca..f8e5250 100644 --- a/src/main/java/net/jwsi/jcms_vpp/Api/ApiResponse.java +++ b/src/main/java/net/jwsi/jcms/vpp/api/ApiResponse.java @@ -1,4 +1,4 @@ -package net.jwsi.jcms_vpp.Api; +package net.jwsi.jcms.vpp.api; import lombok.Getter; import lombok.Setter; @@ -11,5 +11,5 @@ public class ApiResponse { private Integer code; private String httpStatus; private String message; - private List data; + private T data; } diff --git a/src/main/java/net/jwsi/jcms_vpp/Api/RestClientConfig.java b/src/main/java/net/jwsi/jcms/vpp/api/RestClientConfig.java similarity index 94% rename from src/main/java/net/jwsi/jcms_vpp/Api/RestClientConfig.java rename to src/main/java/net/jwsi/jcms/vpp/api/RestClientConfig.java index 0a59d67..9a90cbd 100644 --- a/src/main/java/net/jwsi/jcms_vpp/Api/RestClientConfig.java +++ b/src/main/java/net/jwsi/jcms/vpp/api/RestClientConfig.java @@ -1,4 +1,4 @@ -package net.jwsi.jcms_vpp.global.config; +package net.jwsi.jcms.vpp.api; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/net/jwsi/jcms_vpp/station/Station.java b/src/main/java/net/jwsi/jcms/vpp/station/Station.java similarity index 95% rename from src/main/java/net/jwsi/jcms_vpp/station/Station.java rename to src/main/java/net/jwsi/jcms/vpp/station/Station.java index 4e94ed4..c5fff9c 100644 --- a/src/main/java/net/jwsi/jcms_vpp/station/Station.java +++ b/src/main/java/net/jwsi/jcms/vpp/station/Station.java @@ -1,4 +1,4 @@ -package net.jwsi.jcms_vpp.station; +package net.jwsi.jcms.vpp.station; import jakarta.persistence.Entity; import jakarta.persistence.Id; diff --git a/src/main/java/net/jwsi/jcms_vpp/station/StationController.java b/src/main/java/net/jwsi/jcms/vpp/station/StationController.java similarity index 80% rename from src/main/java/net/jwsi/jcms_vpp/station/StationController.java rename to src/main/java/net/jwsi/jcms/vpp/station/StationController.java index 6749ec0..cd18148 100644 --- a/src/main/java/net/jwsi/jcms_vpp/station/StationController.java +++ b/src/main/java/net/jwsi/jcms/vpp/station/StationController.java @@ -1,13 +1,10 @@ -package net.jwsi.jcms_vpp.station; +package net.jwsi.jcms.vpp.station; import lombok.extern.slf4j.Slf4j; import net.jwsi.jcms.base.BaseController; -import net.jwsi.jcms.base.BaseEntity; -import net.jwsi.jcms.base.BaseService; import net.jwsi.jcms.exception.JsonDataException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; @Slf4j diff --git a/src/main/java/net/jwsi/jcms/vpp/station/StationDto.java b/src/main/java/net/jwsi/jcms/vpp/station/StationDto.java new file mode 100644 index 0000000..5022aec --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/station/StationDto.java @@ -0,0 +1,44 @@ +package net.jwsi.jcms.vpp.station; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class StationDto { + private String stationId; + private String providerId; + private String stNm; + private String addrRdM; + private String addrRdD; + private String addrLdM; + private String addrLdD; + private String stFacilTpCd; + private String stFacilDTpCd; + private String parkingFeeYn; + private String parkingFeeDetl; + private String pnuNo; + private String pnuDoNm; + private String pnuDongNm; + private String pnuSiNm; + + public Station toEntity() { + Station station = new Station(); + station.setStationId(this.stationId); + station.setProviderId(this.providerId); + station.setStNm(this.stNm); + station.setAddrRdM(this.addrRdM); + station.setAddrRdD(this.addrRdD); + station.setAddrLdM(this.addrLdM); + station.setAddrLdD(this.addrLdD); + station.setStFacilTpCd(this.stFacilTpCd); + station.setStFacilDTpCd(this.stFacilDTpCd); + station.setParkingFeeYn(this.parkingFeeYn); + station.setParkingFeeDetl(this.parkingFeeDetl); + station.setPnuNo(this.pnuNo); + station.setPnuDoNm(this.pnuDoNm); + station.setPnuDongNm(this.pnuDongNm); + station.setPnuSiNm(this.pnuSiNm); + return station; + } +} diff --git a/src/main/java/net/jwsi/jcms_vpp/station/StationRepository.java b/src/main/java/net/jwsi/jcms/vpp/station/StationRepository.java similarity index 66% rename from src/main/java/net/jwsi/jcms_vpp/station/StationRepository.java rename to src/main/java/net/jwsi/jcms/vpp/station/StationRepository.java index 8dc0dca..ac64f2b 100644 --- a/src/main/java/net/jwsi/jcms_vpp/station/StationRepository.java +++ b/src/main/java/net/jwsi/jcms/vpp/station/StationRepository.java @@ -1,8 +1,7 @@ -package net.jwsi.jcms_vpp.station; +package net.jwsi.jcms.vpp.station; import net.jwsi.jcms.base.BaseRecStRepository; import org.springframework.stereotype.Repository; -import org.springframework.web.bind.annotation.ResponseBody; @Repository public interface StationRepository extends BaseRecStRepository { diff --git a/src/main/java/net/jwsi/jcms_vpp/station/StationService.java b/src/main/java/net/jwsi/jcms/vpp/station/StationService.java similarity index 54% rename from src/main/java/net/jwsi/jcms_vpp/station/StationService.java rename to src/main/java/net/jwsi/jcms/vpp/station/StationService.java index db365f0..eb41238 100644 --- a/src/main/java/net/jwsi/jcms_vpp/station/StationService.java +++ b/src/main/java/net/jwsi/jcms/vpp/station/StationService.java @@ -1,39 +1,60 @@ -package net.jwsi.jcms_vpp.station; +package net.jwsi.jcms.vpp.station; +import jakarta.transaction.Transactional; import lombok.extern.slf4j.Slf4j; import net.jwsi.jcms.base.BaseService; import net.jwsi.jcms.base.EnumSqlType; import net.jwsi.jcms.utils.HttpUtil; import net.jwsi.jcms.utils.LoginUtil; -import net.jwsi.jcms_vpp.Api.ApiResponse; -import net.jwsi.jcms_vpp.common.client.ApiClient; +import net.jwsi.jcms.vpp.api.ApiResponse; +import net.jwsi.jcms.vpp.api.ApiClient; import org.springframework.data.domain.Page; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; -@Service @Slf4j +@Service public class StationService extends BaseService { private final ApiClient apiClient; private final String API_TOKEN = System.getenv("API_TOKEN"); -} public StationService(StationRepository repository, ApiClient apiClient) { super(repository); this.apiClient = apiClient; } - public List getStations() { - ApiResponse> response = apiClient.fetchStations("http://dev.jinwoosi.co.kr:8072/api/st/list", API_TOKEN); - if (response != null && Integer.valueOf(200).equals(response.getCode())) { - return response.getData(); // List 반환됨 + @Transactional + public List getStations() { + String baseUrl = "http://dev.jinwoosi.co.kr:8072/api/st/list"; + + ApiResponse> response = apiClient.fetchStations(baseUrl, API_TOKEN); + + if (response == null || !Integer.valueOf(200).equals(response.getCode())) { + String msg = (response != null) ? response.getMessage() : "응답 없음"; + throw new RuntimeException("API 호출 실패: " + msg); } - throw new RuntimeException("API호출 실패: " + response.getMessage()); + List dtoList = response.getData(); + if (dtoList == null || dtoList.isEmpty()) { + log.info("가져온 충전소 데이터가 없습니다."); + return Collections.emptyList(); + } + + List entityList = dtoList.stream() + .map(StationDto::toEntity) + .collect(Collectors.toList()); + + List savedStations = super.repository.saveAll(entityList); + + log.info("총 {}건의 충전소 데이터가 DB에 동기화되었습니다.", savedStations.size()); + + return savedStations; } @Override @@ -48,7 +69,7 @@ public class StationService extends BaseService savedStations = stationService.getStations(); + + System.out.println("====== 저장된 건수: " + savedStations.size() + " ======"); + + Assertions.assertThat(savedStations).isNotNull(); + + if (!savedStations.isEmpty()) { + Station firstStation = savedStations.get(0); + Station found = stationRepository.findById(firstStation.getStationId()).orElse(null); + + assertThat(found).isNotNull(); + assertThat(found.getStationId()).isEqualTo(firstStation.getStationId()); + System.out.println("====== DB 저장 확인 완료 (Station ID: " + found.getStationId() + ") ======"); + } + } +}