본문 바로가기
Apache Avro

Spring Boot REST API 및 DB 연동 실습 - 3 (DBtoAvro)

by 자는게젤루좋아 2024. 9. 29.

 

 

 

이제, DB에 있는 데이터들을 avro file 형태로 저장하는 로직을 구현해보도록 하겠습니다.

 

DB -> AVRO

application.yml

yml파일에 ddl-auto 옵션을 none으로 변경하고 실행하겠습니다.

jpa:
  hibernate:
    ddl-auto: none
  show-sql: true      # 실행되는 SQL 쿼리 출력
  properties:
    hibernate:
      dialect: org.hibernate.dialect.PostgreSQLDialect

 

UserSchema.avsc

{
  "type": "record",
  "name": "User",
  "namespace": "com.example.my_rest_api.model",
  "fields": [
    {"name": "id", "type": "int"},
    {"name": "name", "type": "string"},
    {"name": "email", "type": "string"}
  ]
}

 

RestController.java

호출할 url을 controller에 작성합니다.

@PostMapping("/write")
public void writeAvroFile() throws IOException {
    restService.exportDataToAvro();
}

 

RestService.java

DB에서 가져온 데이터를 avro 파일로 export하는 서비스를 생성합니다.

public void exportDataToAvro() throws IOException {
    // Avro 스키마 로드
    Schema schema = new Schema.Parser().parse(new File("C:\\workspace\\intelliJ\\my_rest_api\\src\\main\\resources\\avro\\UserSchema.avsc"));

    // PostgreSQL에서 데이터 가져오기 (모든 데이터 가져오기)
    List<User> entities = userRepository.findAll();

    // Avro 파일 작성 준비
    File avroFile = new File("C:\\workspace\\intelliJ\\my_rest_api\\src\\main\\resources\\avro\\User.avro");
    DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(schema);
    DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<>(datumWriter);

    dataFileWriter.create(schema, avroFile);

    // 데이터를 Avro 파일에 쓰기
    for (User entity : entities) {
        GenericRecord record = new GenericData.Record(schema);
        record.put("id", entity.getId());
        record.put("name", entity.getName());
        record.put("email", entity.getEmail());

        dataFileWriter.append(record);
    }

    dataFileWriter.close();
}

 

URL POST method로 호출

Postman으로 RestController.java에 작성한 POST url을 호출합니다.

호출 화면

 

데이터 비교 (DB 조회화면 및 avro 파일)

DB 조회화면

dbeaver에서 postgresql 조회 화면

 

생성된 avro 파일

생성된 User.avro

댓글