김현빈의 개발새발
[Apache POI] Apache POI를 이용하여 엑셀파일(.xlsx) 데이터베이스에 저장하기 (1) 본문
필자는 단체 프로젝트를 진행하던 중, 음식의 영양성분을 제공하는 페이지를 담당하여 이를 진행하였다.
데이터베이스에 저장할 데이터의 출처는 https://various.foodsafetykorea.go.kr/nutrient/ 로 식품의약품안전처에서 제공해주는 데이터로 이 데이터 안에는 식품명, 분류정보, 칼로리, 각종 영양성분의 함량 등이 포함되어 있다.
제공하는 데이터는 OPEN API 나 엑셀파일(.xlsx)의 두가지 형식으로 제공하는데, 기획 초기에는 OPEN API 형식으로 받아와서 데이터를 처리하려고 하였으나 음식 데이터의 갯수가 7000건이 넘는 많은 양이기도 하고 OPEN API가 문제가 생기거나 데이터를 보내주는 과정에서 지연이 생긴다면 원활한 서비스 이용이 불가능하다고 판단, 엑셀파일로 되어있는 데이터에서 값을 추출하여 데이터베이스에 저장하기로 결정했다.
우선 엑셀파일을 열어 데이터가 어떤 형태로 저장되어 있는지 확인하고 필요한 정보들을 확인해보았다.

정보들의 종류에는 이런것들이 있는것을 확인하고, 필요한 정보들을 어떻게 갈무리할지를 생각해보았다. 자바 환경에서 DTO단에서 원하는 정보만을 받아 Entity에 저장되게 하는 방법과 엑셀 자체의 셀을 정리한 후 저장되게 하는 두가지 방법을 생각했는데 엑셀파일 자체의 크기를 줄이는것이 최적화 측면에서 더 나은 방법이라고 생각하여 엑셀 자체의 셀값을 정리해주었다.
내가 필요로 하는 값들을 제외하고 모두 정리해주고 본격적으로 시작해보았다.
우선 정리된 엑셀파일을 프로젝트 파일 안에 직접 저장해주었다.

그 후 엑셀파일의 데이터들을 받아올 DTO를 구성하였다. DTO를 구성하지 않고 바로 Entity단에 저장해주어도 가능은 하겠지만 추후 데이터들을 관리할것을 생각하여 DTO를 만들어서 진행하였다.
DTO
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class FoodDto {
private long num;
private String name;
private String brand;
private String class1;
private String class2;
private String servingSize;
private String servingUnit;
private String kcal;
private String protein;
private String province;
private String carbohydrate;
private String sugar;
private String dietaryFiber;
private String calcium;
private String iron;
private String salt;
private String zinc;
private String vitaB1;
private String vitaB2;
private String vitaB12;
private String vitaC;
private String cholesterol;
private String saturatedFat;
private String transFat;
private String issuer;
이름, 브랜드, 대분류, 소분류 등 필요한 정보들을 영문화하여 지정해주었다.
Entity
@Entity
@Table(name = "food") // 실제 데이터베이스 테이블 이름에 맞게 지정해야 합니다.
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private long num;
@Column(name = "name")
private String name;
@Column(name = "brand")
private String brand;
@Column(name = "class1")
private String class1;
@Column(name = "class2")
private String class2;
@Column(name = "serving_size")
private String servingSize;
@Column(name = "serving_unit")
private String servingUnit;
@Column(name = "kcal")
private String kcal;
@Column(name = "protein")
private String protein;
@Column(name = "province")
private String province;
@Column(name = "carbohydrate")
private String carbohydrate;
@Column(name = "sugar")
private String sugar;
@Column(name = "dietary_fiber")
private String dietaryFiber;
@Column(name = "calcium")
private String calcium;
@Column(name = "iron")
private String iron;
@Column(name = "salt")
private String salt;
@Column(name = "zinc")
private String zinc;
@Column(name = "vita_b1")
private String vitaB1;
@Column(name = "vit_b2")
private String vitaB2;
@Column(name = "vita_b12")
private String vitaB12;
@Column(name = "vita_c")
private String vitaC;
@Column(name = "cholesterol")
private String cholesterol;
@Column(name = "saturated_fat")
private String saturatedFat;
@Column(name = "trans_fat")
private String transFat;
@Column(name = "issuer")
private String issuer;
}
DTO에서 받아오는 값들에 맞추어 Entity값들도 항목들을 맞춰주었다.
DTO와 Entity를 구성하는 부분은 간단하므로 설명은 생략하겠다.
그리고 DTO의 값들을 Entity로 변환해주는 코드를 구성하여 DTO에 삽입하였고 이는 빌더패턴을 통하여 구성해주었다.
public Food toFoodEntity() {
return Food.builder()
.num(this.num)
.name(this.name)
.brand(this.brand)
.class1(this.class1)
.class2(this.class2)
.servingSize(this.servingSize)
.servingUnit(this.servingUnit)
.kcal(this.kcal)
.protein(this.protein)
.province(this.province)
.carbohydrate(this.carbohydrate)
.sugar(this.sugar)
.dietaryFiber(this.dietaryFiber)
.calcium(this.calcium)
.iron(this.iron)
.salt(this.salt)
.zinc(this.zinc)
.vitaB1(this.vitaB1)
.vitaB2(this.vitaB2)
.vitaB12(this.vitaB12)
.vitaC(this.vitaC)
.cholesterol(this.cholesterol)
.saturatedFat(this.saturatedFat)
.transFat(this.transFat)
.issuer(this.issuer)
.build();
}
후에 지정해준값들을 기준으로 엑셀파일을 저장하는 Service단과 Controller단은 다음 글에서 설명을 이어가도록 하겠다.
'Back-end > Java' 카테고리의 다른 글
[Apache POI] Apache POI를 이용하여 엑셀파일(.xlsx) 데이터베이스에 저장하기 (2) (1) | 2024.01.16 |
---|---|
[인텔리제이, IntelliJ] 콘솔 한글 깨짐 해결법 (0) | 2024.01.15 |