diff --git a/src/test/java/com/catcher/core/CsvReader.java b/src/test/java/com/catcher/core/CsvReader.java new file mode 100644 index 0000000..3d7a6cd --- /dev/null +++ b/src/test/java/com/catcher/core/CsvReader.java @@ -0,0 +1,142 @@ +package com.catcher.core; + +import com.opencsv.CSVParserBuilder; +import com.opencsv.CSVReader; +import com.opencsv.CSVReaderBuilder; +import com.opencsv.bean.CsvBindByPosition; +import com.opencsv.bean.CsvToBeanBuilder; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.List; + +class CsvReader { + + public List readCSVFile(String filePath, char separator, String charset, Class clazz) throws IOException { + try (CSVReader csvReader = new CSVReaderBuilder(new InputStreamReader(new FileInputStream(filePath), charset)) + .withCSVParser(new CSVParserBuilder() + .withSeparator(separator) + .build()) + .withSkipLines(1) + .build()) { + List csvDataList = new CsvToBeanBuilder(csvReader) + .withType(clazz) + .build() + .parse(); + + return csvDataList; + } + } + + public static class CsvDataWithNumber { + + @CsvBindByPosition(position = 0) + private String areaCode; + + @CsvBindByPosition(position = 5) + private String latitude; + + @CsvBindByPosition(position = 6) + private String longitude; + + @CsvBindByPosition(position = 7) + private String type; + + public String getAreaCode() { + return areaCode; + } + + public String getLatitude() { + return latitude; + } + + public String getLongitude() { + return longitude; + } + + public String getType() { + return type; + } + + } + + public static class MyCSVData { + + @CsvBindByPosition(position = 0) + private String areaCode; + + @CsvBindByPosition(position = 1) + private String description; + + @CsvBindByPosition(position = 2) + private String existenceText; + + public String getAreaCode() { + return areaCode; + } + + public String getDescription() { + return description; + } + + public String getExistenceText() { + return existenceText; + } + + } + + public static class CsvData3 { + + @CsvBindByPosition(position = 0) + private String area1; + + @CsvBindByPosition(position = 1) + private String area2; + + @CsvBindByPosition(position = 2) + private String area3; + + @CsvBindByPosition(position = 3) + private String area4; + + @CsvBindByPosition(position = 4) + private String area5; + + @CsvBindByPosition(position = 5) + private String latitude; + + @CsvBindByPosition(position = 6) + private String longitude; + + public String getArea1() { + return area1; + } + + public String getArea2() { + return area2; + } + + public String getArea3() { + return area3; + } + + public String getArea4() { + return area4; + } + + public String getArea5() { + return area5; + } + + public String getLatitude() { + return latitude; + } + + public String getLongitude() { + return longitude; + } + + } + +} diff --git a/src/test/java/com/catcher/core/LocationInsertTests.java b/src/test/java/com/catcher/core/LocationInsertTests.java new file mode 100644 index 0000000..02b496e --- /dev/null +++ b/src/test/java/com/catcher/core/LocationInsertTests.java @@ -0,0 +1,135 @@ +package com.catcher.core; + +import com.catcher.core.domain.entity.Location; +import com.catcher.infrastructure.jpa.repository.LocationJpaRepository; +import com.catcher.core.request.KakaoMapsRequest; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; + +/* + 테스트 코드가 아닌 1회성 location 테이블 데이터 적재용 코드입니다. + 원본 데이터 파일이 필요할 경우 요청주세요 + */ + +@SpringBootTest +public class LocationInsertTests { + + @Autowired + LocationJpaRepository locationJpaRepository; + + @Autowired + KakaoApiClient kakaoApiClient; + + @Test + @Transactional + @Disabled + public void 지역코드_삽입() throws IOException { + CsvReader csvReader = new CsvReader(); + var list = csvReader.readCSVFile("${your_file_source}", '\t', "EUC-KR", CsvReader.MyCSVData.class); + + list.forEach(row -> { + if (row.getExistenceText().equals("존재")) { + locationJpaRepository.save(Location.initLocation(row.getAreaCode(), row.getDescription())); + } + }); + } + + @Test + @Transactional + @Disabled + public void 지역코드_좌표_매핑() throws IOException { + CsvReader csvReader = new CsvReader(); + var list = csvReader.readCSVFile("${your_file_source}", ',', "EUC-KR", CsvReader.CsvDataWithNumber.class); + + final AtomicInteger i = new AtomicInteger(0); + list.forEach(row -> { + + if (row.getType().equals("B")) { + var locationOptional = locationJpaRepository.findByAreaCode(row.getAreaCode()); + if (locationOptional.isPresent()) { + var location = locationOptional.get(); + location.editCoordinates(row.getLatitude(), row.getLongitude()); + locationJpaRepository.save(location); + } + } + + }); + } + + @Test + @Transactional + @Disabled + public void 지역코드_좌표_매핑2() throws IOException { + CsvReader csvReader = new CsvReader(); + var list = csvReader.readCSVFile("{your_file_source}", ',', "UTF-8", CsvReader.CsvData3.class); + + list.forEach(row -> { + + if (!row.getLatitude().isBlank() && !row.getLongitude().isBlank()) { + var locationString = String.join(" ", row.getArea1(), row.getArea2(), row.getArea3(), row.getArea4(), row.getArea5()); + var locationOptional = locationJpaRepository.findByDescription(locationString); + if (locationOptional.isPresent()) { + var location = locationOptional.get(); + if (location.getLatitude() != null) { + location.editCoordinates(row.getLatitude(), row.getLongitude()); + locationJpaRepository.save(location); + } + } + } + + }); + } + + @Test + @Transactional + @Disabled + public void 지역코드_좌표_매핑_with_kakao() throws IOException { + + var locationList = locationJpaRepository.findAll(); + + for (var location : locationList) { + var response = kakaoApiClient.searchAddress(KakaoMapsRequest.createDefaultRequest(location.getDescription()), "${your_kakao_key}"); + + if (response.getDocuments().isEmpty()) { + System.out.println("-----------------------------------"); + continue; + } + if (location.getAreaCode().equals(response.getDocuments().get(0).getAddress().getAreaCode())) { + location.editCoordinates(response.getDocuments().get(0).getAddress().getLatitude(), response.getDocuments().get(0).getAddress().getLongitude()); + } else { + System.out.println("-----------------------------------"); + } + } + + locationJpaRepository.saveAll(locationList); + + + } + + @Test + @Transactional + @Disabled + public void 지역코드_null_제거() { + var locationList = locationJpaRepository.findAllByLatitudeIsNull(); + + for (var location : locationList) { + if (!location.getAreaCode().endsWith("00")) { + var newAreaCode = location.getAreaCode().substring(0, location.getAreaCode().length() - 2) + "00"; // 리 단위일 경우 면 단위 좌표로 대체 + var newLocation = locationJpaRepository.findByAreaCode(newAreaCode).get(); + location.editCoordinates(newLocation.getLatitude(), newLocation.getLongitude()); + } + } + + locationJpaRepository.saveAll(locationList); + } + + +} + +