성능 최적화 실습을 위한 레포입니다. 공공데이터포털에서 가져온 대규모 데이터를 대상으로 여러가지 방법을 통해 성능을 최적화합니다.
Spring boot, JPA, MYSQL
공공데이터포털에서 제공하는 소상공인시장진흥공단_상가(상권)정보 데이터를 csv로 받아서 활용했습니다. 해당 데이터는 약 250만개의 행으로 이루어져 있습니다.
https://www.data.go.kr/data/15083033/fileData.do
원본 데이터는 다음과 같은 컬럼들을 가지는 하나의 테이블로 이루어져있습니다.
"상가업소번호","상호명","지점명","상권업종대분류코드","상권업종대분류명","상권업종중분류코드","상권업종중분류명","상권업종소분류코드","상권업종소분류명","표준산업분류코드","표준산업분류명","시도코드","시도명","시군구코드","시군구명","행정동코드","행정동명","법정동코드","법정동명","지번코드","대지구분코드","대지구분명","지번본번지","지번부번지","지번주소","도로명코드","도로명","건물본번지","건물부번지","건물관리번호","건물명","도로명주소","구우편번호","신우편번호","동정보","층정보","호정보","경도","위도"
데이터의 샘플은 다음과 같습니다.
"MA010120220805431207","일로딜로","","G2","소매","G209","섬유·의복·신발 소매","G20903","유아용 의류 소매업","G47417","유아용 의류 소매업","48","경상남도","48121","창원시 의창구","48121520","팔룡동","4812112900","팔용동","4812112900100300001","1","대지",30,1,"경상남도 창원시 의창구 팔용동 30-1","481214781647","경상남도 창원시 의창구 창원대로397번길",6,,"4812112900100300001013983","뉴코아아울렛","경상남도 창원시 의창구 창원대로397번길 6","641847","51393","","4","",128.642214334036,35.234522413085
"MA010120220805431535","오미당꽈배기","","I2","음식","I210","기타 간이","I21001","빵/도넛","I56191","제과점업","48","경상남도","48250","김해시","48250630","장유3동","4825013200","장유동","4825013200108260004","1","대지",826,4,"경상남도 김해시 장유동 826-4","482503351847","경상남도 김해시 율하6로",56,,"4825013200108260004000001","","경상남도 김해시 율하6로 56","621340","51020","","1","",128.824132234696,35.1718364660764
"MA010120220805432253","하나병원","","Q1","보건의료","Q101","병원","Q10102","일반병원","Q86102","일반병원","48","경상남도","48240","사천시","48240250","사천읍","4824025024","사천읍","4824025024102700001","1","대지",270,1,"경상남도 사천시 사천읍 수석리 270-1","482403334046","경상남도 사천시 사천읍 진삼로",1468,8,"4824025024102700001040629","","경상남도 사천시 사천읍 진삼로 1468-8","664805","52518","","","",128.086510473318,35.0822194510501
"MA010120220805433603","술마시는심플노래방","","I2","음식","I211","주점","I21104","요리 주점","I56219","기타 주점업","48","경상남도","48220","통영시","48220590","정량동","4822010800","동호동","4822010800100940001","1","대지",94,1,"경상남도 통영시 동호동 94-1","482203333042","경상남도 통영시 통영해안로",363,1,"4822010800100940001007051","동피랑쭈꿀","경상남도 통영시 통영해안로 363-1","650806","53052","","","",128.427302573174,34.8445654897758
상권업종분류명 대, 중, 소를 위한 테이블을 만들고 원본 테이블에서 분리하여 연관관계를 만들었습니다.
테이블 분리를 위해 다음과 같이 SQL을 작성했습니다.
insert into big_classification_name(name)
select distinct 상권업종대분류명
from sangga
insert into midium_classification_name(name, big_classification_name_id)
select distinct 상권업종중분류명,(SELECT id FROM big_classification_name WHERE name = 상권업종대분류명)
from sangga
insert into small_classification_name(name, midium_classification_name_id)
select distinct 상권업종소분류명,(SELECT id FROM midium_classification_name WHERE name = 상권업종중분류명)
from sangga
- JPA 최적화
- DB 인덱싱
- 캐싱