programing

csv 파일에서 데이터를 읽고 데이터베이스에 저장하는 방법 ? Spring Boot

goodsources 2023. 7. 10. 22:18
반응형

csv 파일에서 데이터를 읽고 데이터베이스에 저장하는 방법 ? Spring Boot

예를 들어 사용자 이름, 전화번호 및 주소로 구성된 사용자 엔티티가 있습니다.CSV 파일에서 이 모든 필드를 읽고 데이터베이스의 해당 테이블에 저장하시겠습니까?

그것을 하는 방법을 설명하는 것을 도와줄 수 있는 사람이 있습니까?아니면 그것을 하는 방법에 대한 문서가 있습니까?

당신은 사용자가 어떤 UI에서 파일을 업로드하기를 원한다고 생각합니다.UI를 구축하는 정확한 방법에 따라 다음과 같은 작업을 수행할 수 있습니다.

둘 중 하나는 스프링을 사용하여 상당히 쉽게 해결할 수 있습니다.

다음과 같은 엔티티가 있다고 가정합니다.

@Data
@Entity
public class User {
    @Id
    private String username;
    private String phoneNumber;
    private String address;
}

또한 데이터베이스에 액세스하기 위한 Spring Data 저장소를 정의합니다.

public interface UserRepository extends JpaRepository<User, String> {

}

CSV 역직렬화를 위해 잭슨을 사용할 것을 제안합니다.Spring Boot에는 Jackson이 이미 포함되어 있지만 CSV용 데이터 형식 확장을 POM에 추가해야 합니다.

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-csv</artifactId>
    </dependency>

이렇게 하면 주어진 POJO 클래스에 대한 CSV를 읽을 수 있는 간단한 유틸리티 방법을 만들 수 있습니다.

public class CsvUtils {
    private static final CsvMapper mapper = new CsvMapper();
    public static <T> List<T> read(Class<T> clazz, InputStream stream) throws IOException {
        CsvSchema schema = mapper.schemaFor(clazz).withHeader().withColumnReordering(true);
        ObjectReader reader = mapper.readerFor(clazz).with(schema);
        return reader.<T>readValues(stream).readAll();
    }
}

그런 다음 업로드를 처리하기 위한 간단한 Rest Controller를 만듭니다.

@RestController
@RequiredArgsConstructor
public class UserController {
    private final UserRepository repository;

    @PostMapping(value = "/upload", consumes = "text/csv")
    public void uploadSimple(@RequestBody InputStream body) {
        repository.saveAll(CsvUtils.read(User.class, body));
    }

    @PostMapping(value = "/upload", consumes = "multipart/form-data")
    public void uploadMultipart(@RequestParam("file") MultipartFile file) {
        repository.saveAll(CsvUtils.read(User.class, file.getInputStream()));
    }
}

업로드를 위해 HTML도 필요한 경우 다음 스니펫은 최소한의 작업 예제입니다.

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="file" />
    <input type="submit" name="submit" value="Submit" />
</form>

나중에 편집:수신 데이터의 유효성도 검사하려면 먼저 엔티티 클래스 속성에 다음과 같이 주석을 달아야 합니다.javax.validation를 들어 다음과 같습니다예:

@Data
@Entity
class User {
    @Id
    @Email
    @NotEmpty
    private String username;
    @Pattern(regexp = "[0-9 ()-]{4,12}")
    private String phoneNumber;
    private String address;
}

그런 다음 실제 유효성 검사 호출을 수행할 위치를 선택할 수 있습니다.

  1. 서비수준스. 이 경우할 수입니다.이 경우 설정이 상당히 쉽고 충분히 초기에 검증을 수행할 수 있기 때문에 개인적으로 이를 권장합니다.를 위해 이를위간한것소다니개합을단해▁a다를 소개합니다.@Service컨트롤러와 리포지토리 간의 클래스입니다.
@Service
@Validated
@RequiredArgsConstructor
class UserService {
    private final UserRepository repository;
    public void saveAll(@Valid List<User> users) {
        repository.saveAll(users);
    }
}

그런 다음 컨트롤러 클래스 내의 리포지토리 대신 이 서비스 클래스를 사용합니다.

  1. 리포지토리 수준: 여기서는 실제로 아무것도 할 필요가 없습니다.유효성 검사 제약 조건으로 엔티티 클래스에 주석을 달 경우 최대 절전 모드는 자동으로 삽입 전 수신기(BeanValidationEventListener)에서 유효성 검사를 호출합니다.

  2. 컨트롤러 레벨.설정이 더 까다롭습니다.사용자 지정 HttpMessageConverter에서 CSV 역직렬화를 이동합니다.또한 이 변환기를 FormHttpMessageConverter에 추가해야 합니다(다중 부분 요청의 일부를 역직렬화하는 데 사용할 수 있음).그러면 이론적으로 그냥 선언할 수 있습니다.@Valid List<User>컨트롤러 메소드에 대한 입력으로 Spring은 MIME 유형에 따라 메시지 변환기를 자동으로 호출한 다음 검증기를 호출합니다.예제는 다중 부품/폼 데이터에 대한 JSON 메시지 변환기 추가를 참조하십시오.

마지막으로 원하는 경우 언제든지 수동으로 유효성 검사를 호출할 수 있습니다. Spring Annotation Validation(스프링 주석 유효성 검사)을 수동으로 호출합니다.

openCSV를 사용하면 쉽게 이를 달성할 수 있습니다.알려진 POJO 사용자의 경우 CSV 열(이 경우 헤더)을 POJO의 해당 필드에 매핑하기만 하면 됩니다.

종속성에 다음을 추가하기만 하면 됩니다. 하지만 응용 프로그램에 대한 최신 버전을 확인하십시오.

<dependency> 
<groupId>com.opencsv</groupId> 
<artifactId>opencsv</artifactId> 
<version>4.1</version> 
</dependency> 

이 링크는 https://www.geeksforgeeks.org/mapping-csv-to-javabeans-using-opencsv/ 를 안내합니다.

언급URL : https://stackoverflow.com/questions/50987018/how-to-read-data-from-csv-file-and-store-it-in-the-database-spring-boot

반응형