나와바리 - Json파일 Load해서 테이블에 저장

Sungmin·2023년 4월 5일
0

필요한 데이터

  • 각 자치구의 코드번호
  • 동 이름
  • 구 이름
  • 위도 좌표
  • 경도 좌표

필요한 Json 파일을 구글링을 통해 구했다.

이 파일을 읽어와 java객체로 변환하여 필요한 정보인
cig_cd, gu, dong, lat, lng를 가져와 Zone 테이블에 삽입하는 과정을 진행한다.

먼저 이 정보들은 한 번만 불러와 저장하는게 목적이기 때문에 이렇게 진행하였다

  1. JsonFileLoader클래스에 Gson라이브러리를 사용하여 Json파일을 읽는다.
  2. TypeToken 클래스는 목록의 유형을 List<ZoneDTO>로 지정하는 데 사용한다.
  3. JSON 데이터를 구문 분석한 후 메서드는 ZoneDTO 클래스의 정적 메서드 toEntityList를 호출하여 ZoneDTO 개체 목록을 Zone 개체 목록으로 변환
  4. seoul.json 파일을 읽는 중 오류가 있는 경우 IOExceptionthrow할수있음
  5. Service에서 JsonFileLoaderZoneRepository를 생성자 주입 방식을 통해 의존성을 주입해 주고, jsonFileLoader.loadJsonData() 메서드를 호출하여 zoneList에 넣고 saveAll()메서드를 사용해서 persist 해 준다
  6. 마지막으로 Get매핑으로 zoneService의 SaveData 메서드를 호출 해 준다.
    /save에 접속하면 데이터가 DB에 담기게 된다.
@Component
public class JsonFileLoader {

    public List<Zone> loadJsonData() throws IOException {

        Reader reader = new FileReader("src/main/resources/seoul.json");

        Gson gson = new Gson();
        List<ZoneDTO> zoneDTOList = gson.fromJson(reader, new TypeToken<List<ZoneDTO>>() {}.getType());
        System.out.println("zoneDTOList: "+zoneDTOList);

        return ZoneDTO.toEntityList(zoneDTOList);

    }
}

@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ZoneDTO {

    private Long cig_cd;
    private String gu;
    private String dong;
    private Double lat;
    private Double lng;


    public static List<Zone> toEntityList(List<ZoneDTO> zoneDTOList) {
        return zoneDTOList.stream()
                .map(zoneDTO -> Zone.builder()
                        .cig_cd(zoneDTO.getCig_cd())
                        .gu(zoneDTO.getGu())
                        .dong(zoneDTO.getDong())
                        .lat(zoneDTO.getLat())
                        .lng(zoneDTO.getLng())
                        .build())
                .collect(Collectors.toList());
    }
}

@Service
@Transactional
@RequiredArgsConstructor
public class ZoneService {

    private final JsonFileLoader jsonFileLoader;
    private final ZoneRepository zoneRepository;

    public void SaveData() throws IOException {

        List<Zone> zoneList = jsonFileLoader.loadJsonData();
        zoneRepository.saveAll(zoneList);
    }

}

    @GetMapping("/save")
    public void saveZone() throws IOException {
        zoneService.SaveData();
    }

배운점

Json파일의 경로를 지정해 줄 땐, resources안에 파일을 넣고

"src/main/resources/seoul.json"이렇게 세부 경로까지 적어줘야 한다.

DB에 한번만 담아 놓으면 필요할 때 꺼내 쓸 수 있기 때문에 반복문을 통해 담는 간단한 방식을 사용했는데, 데이터 하나하나에 insert쿼리문이 사용되었다.

open api를 통해 매번 데이터를 받아 쓰는 경우엔 다른 방식을 사용해야 성능에 문제가 생기지 않을 것 같다.

profile
Let's Coding

0개의 댓글