Java & Spring/Java

csv파일으로 더미데이터 생성하기

DJ.Kang 2024. 11. 8. 11:42

- build.gradle

implementation 'com.opencsv:opencsv:5.6'

 

- 전체 코드

package com.play.hiclear.domain.gym.service;

import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvValidationException;
import com.play.hiclear.common.enums.Ranks;
import com.play.hiclear.domain.gym.entity.Gym;
import com.play.hiclear.domain.gym.enums.GymType;
import com.play.hiclear.domain.gym.repository.GymRepository;
import com.play.hiclear.domain.user.entity.User;
import com.play.hiclear.domain.user.enums.UserRole;
import com.play.hiclear.domain.user.repository.UserRepository;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

@Service
@RequiredArgsConstructor
public class GymDummyDataService {

    private final GymRepository gymRepository;
    private final UserRepository userRepository;

    @PostConstruct
    @Transactional
    public void generateDummyData() {
        
        // 데이터베이스에 더미 데이터가 이미 존재하면 생성하지 않음
        if (gymRepository.count() > 0) {
            System.out.println("더미 데이터가 이미 존재합니다.");
            return;
        }
        
        //더미 데이터 생성
        User user = new User("이름", "adjwws@anasdaw.com", "서울 중구 태평로1가 31", "서울 중구 세종대로 110", 37.5663174209601, 126.977829174031, "encodedPassword", Ranks.RANK_A, UserRole.BUSINESS);
        userRepository.save(user);

        String csvFile = "src/main/resources/data/address_dummy.csv";
        int i = 0;

        try (CSVReader reader = new CSVReader(new InputStreamReader(new FileInputStream(csvFile)))) {
            String[] nextLine;
            reader.readNext();
            while ((nextLine = reader.readNext()) != null && i < 22000) {
                // CSV 파일의 각 열을 Gym 객체의 필드에 맞게 매핑
                String name = nextLine[0] + nextLine[1] + nextLine[2];
                String regionAddress = nextLine[0] + " " + nextLine[1] + " " + nextLine[2];
                Double latitude = Double.parseDouble(nextLine[3]);
                Double longitude = Double.parseDouble(nextLine[4]);

                // Gym 객체 생성 후 저장
                Gym gym = new Gym(name, null, regionAddress, null, latitude, longitude, GymType.PUBLIC, user);
                gymRepository.save(gym);

                if (i % 100 == 0) {
                    gymRepository.flush();
                }

                i++;
            }
        } catch (IOException | CsvValidationException e) {
            e.printStackTrace();
        }
    }
}

 

- csv구성

시도    ,시군구 ,읍면동  ,위도       ,경도
서울특별시,종로구,청운효자동,37.584009,126.970626
서울특별시,종로구,사직동,37.575408,126.965944
서울특별시,종로구,삼청동,37.590758,126.980996

※  체육관 더미 객체를 생성하는 서비스로 체육관은 주소, 위도, 경도, 유저(체육관 생성자)가 필요하다.

  • @PostContruct : 빈이 생성된 후, 의존성 주입이 완료된 직후에 자동으로 호출
  • if문을 통해 DB에 객체가 있으면 미실행
  • User 객체 생성
  • CSVReader을 통해 csv파일을 읽음
  • 첫줄은 header값으로 .readNext()로 넘김
  • 100개마다 flush