주문 관리 플랫폼(배달 앱) 개발 프로젝트를 진행하던 중,
위치 데이터를 저장하는 Location 테이블을 만들어야 하는 요구사항이 생겼다.
Location 테이블은 서울특별시의 여러 위치 정보를 담고, Read Only로 사용될 테이블이다.
위치 데이터는 직접 입력하는 대신, 공공 데이터셋(CSV)을 활용하여 테이블을 구성하기로 했다.
이를 위해 IntelliJ에서 CSV 파일을 데이터베이스와 동기화하는 과정을 정리해보았다.
✅ 공공 데이터셋 가져오기
공개하는 주소
공개하는 주소 공개하는 주소정보로써, 도형정보 또는 좌표를 제외한 자료로 구성되어 있습니다. ('행정안전부 공간정보 보안관리규정'에 따른 비공개 또는 공개제한 사항 제외) 주소정보제공
business.juso.go.kr
먼저 공공 기관 사이트에서 공공 데이터셋을 가져와야 한다.
나같은 경우는 서울특별시의 도로명 주소가 필요했기에 위 링크의 데이터셋을 가져왔다.
다운받은 데이터셋 파일(txt)을 열어보니 다음과 같이 구성되어 있었다.
csv파일이면 더 편했을 것 같은데 아쉽게도 해당 사이트에선 txt파일밖에 제공을 안하는듯 했다..
📌 가져온 데이터셋 가공하기
다운 받은 데이터셋의 양식을 확인해보니, 아래와 같은 컬럼으로 구성이 되어 있었다.
id/법정동코드/시도명/시군구명/법정읍면동명/법정리명(null)/산여부/지번본번(번지)/지번부번(호)/도로명코드/지하여부/건물본번/건물부번/지번일련번호/이동사유코드
해당 컬럼들 중 필요없는 컬럼은 제거하고 나에게 필요한 컬럼만 따로 가공할 필요가 있었다.
또, 인텔리제이에 데이터를 import 하려면 파일 확장자가 csv여야 하기에 이 부분도 수정이 필요했다.
이러한 데이터셋 가공은 chatGpt를 활용하면 아주 간단하고 빠르게 가공이 가능하다.
예시 )
"내가 서울 특별시의 위치 정보가 담긴 데이터셋을 가져왔는데, 컬럼은 법정동코드/시도명/시군구명/법정읍면동명/법정리명(null)/산여부/지번본번(번지)/지번부번(호)/도로명코드/지하여부/건물본번/건물부번/지번일련번호/이동사유코드 이렇게 구성이 되어 있어. 나에게 필요한 컬럼은 다음과 같아. 법정동코드/시도명/시군구명/법정읍면동명/지번본번/지번부번/도로명코드/건물본번/건물부번 그리고 맨 앞에 UUID 타입의 id값을 PK로 생성해줘. 내 요구사항에 맞춰서 나에게 필요한 데이터를 csv파일로 새로 생성해줘."
내가 원하는 형식대로 데이터가 잘 가공된 모습이다. (일 잘한다!)
본인은 현재 GPT Plus를 사용중인데, 이러한 데이터 가공 요청이 무료 버전에서도 사용 가능한지는 잘 모르겠다..
✅ Intellij에 데이터셋 동기화하기
공공 데이터셋을 가져오고, 원하는 형식대로 가공을 마쳤으니
이제 내 프로젝트에 해당 데이터셋을 동기화하면 된다.
📌 Location.java
내 프로젝트에선 Jpa를 활용할 것이기 때문에 먼저 데이터셋의 데이터를 담을 Entity를 생성해줬다.
@NoArgsConstructor
@Getter
@Entity
@Table(name = "p_location")
public class Location {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(updatable = false, insertable = false)
private UUID id;
@Column(updatable = false, insertable = false, nullable = false, length = 20)
private String lawCode; // 법정동 코드
@Column(updatable = false, insertable = false, nullable = false, length = 50)
private String city; // 시도명
@Column(updatable = false, insertable = false, nullable = false, length = 50)
private String district; // 시군구명
@Column(updatable = false, insertable = false, nullable = false, length = 50)
private String subDistrict; // 법정읍면동명
@Column(updatable = false, insertable = false, length = 10)
private String mainLotNumber; // 지번본번(번지)
@Column(updatable = false, insertable = false, length = 10)
private String subLotNumber; // 지번부번(호)
@Column(updatable = false, insertable = false, nullable = false)
private String roadNameCode; // 도로명 코드
@Column(updatable = false, insertable = false, length = 10)
private String buildingMainNumber; // 건물 본번
@Column(updatable = false, insertable = false, length = 10)
private String buildingSubNumber; // 건물 부번
}
동기화할 데이터셋의 양식(컬럼)에 맞춰서 필드 변수들을 선언해준다.
또, 해당 테이블은 Read Only 테이블이기 때문에 변동이 일어나지 않도록
@Column(updatable = false, insertable = false) 설정을 추가해줬다.
📌 Location 테이블 생성
Location 엔티티 클래스를 만든 뒤, 프로젝트를 실행하면 해당 테이블이 자동으로 생성되지만
공공 데이터셋을 동기화하는 작업을 할 땐 따로 create 쿼리를 써서 테이블을 생성해줘야 한다.
JPA(Hibernate)를 통해 테이블을 자동 생성하면 엔티티의 필드 순서대로 DB에 컬럼이 생성되지 않고,
순서가 뒤죽박죽 섞여서 생성되기 때문이다.
동기화할 데이터셋은 컬럼의 순서가 정해져 있기 때문에, 이 부분에서 동기화 작업에 문제가 생길 수 있다.
table 우클릭 < New < Table 클릭
테이블 명을 입력하고, 데이터셋의 형식에 맞춰 create 쿼리를 작성해준다.
CREATE TABLE p_location (
id UUID PRIMARY KEY,
law_code VARCHAR(50),
city VARCHAR(50),
district VARCHAR(50),
sub_district VARCHAR(50),
main_lot_number VARCHAR(10),
sub_lot_number VARCHAR(10),
road_name_code VARCHAR(50),
building_main_number VARCHAR(10),
building_sub_number VARCHAR(10)
);
📌 데이터셋 동기화
생성된 테이블 우클릭 < Import/Export < Import Data from File(s) 클릭
Import할 데이터 셋을 선택해준다.
Import를 하고 잠시 기다리면 다음과 같이 데이터 동기화가 잘 이루어진 모습을 볼 수 있다.
'Study > Spring' 카테고리의 다른 글
[Spring] Spring-Cloud를 활용한 MSA 설계(2) - 서킷 브레이커 (1) | 2025.02.13 |
---|---|
[Spring] Spring-Cloud를 활용한 MSA 설계(1) - 서비스 디스커버리, 로드 밸런싱 (0) | 2025.02.12 |
[Spring] Spring-Cloud를 활용한 MSA 설계(0) - Intro (0) | 2025.02.11 |
[Spring][Redis] 동시성 이슈와 분산락을 이용한 동시성 제어 (0) | 2024.03.27 |
[Spring] AOP를 활용한 기능 모듈화 (0) | 2024.03.25 |