웹개발

주소 검색 기능 구현(API X, DB 내 테이블 import)

duduranran 2022. 11. 6. 17:45

하고 싶은 것

1. 아래의  local_infile을 리눅스 실행시키면 자동으로 저값이 ON으로 되게 끔 하는 것

2. 아 윈도우와 버츄얼박스 내 리눅스 파일 공유 하는법

(윈도우에 주소DB받아놓고 안 돼서 허비한 시간이 반나절인 것 같다.)

3. 아 그리고 뭔가 윈도우 깔린 PC와 버츄얼박스내 깔린 리눅스 와의 관계에 대해 개념이 없는듯하다.

누가 호스트고, 누가 게스트고  서버는 어디고 클라이언트는 어디고, 

무슨 IP쓰라는 이야기만 나오면 윈도우에서 ipconf, 우분투에서 ifconfig 치고 

무슨 IP를 입력해야하지 고민한다.

 

만날 수 있는 오류 2가지

1)mysql을 실행하고 사용할 DB를 선택 하지 않으면

'ERROR 1046(3D000): No database selected' 가 나온다.

mysql> use '사용할 db이름';   <<< 잊지말자

 

2)리눅스를 다시 시작하면 local_infile이 다시 OFF로 돌아가 있다.

이걸 다시 ON으로 바꾸지 않고,

LOAD DATA LOCAL INFILE ~~~ 블라블라 실행을 하면

'ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server side.' 가 나온다. 근데 서버랑 클라이언트 양쪽 모두 Enable이어야 하는데 음 나는 한가지 값만 바꿨는데 잘 된다.


회원가입시 주소 검색기능을 구현하려 한다.

먼저, 우정사업본부 홈페이지에서 DB를 다운받는다.

 

우정사업본부 - (koreapost.go.kr)

1) 메인화면 > 정보공개 > 우정데이터 제공센터

2) 우편데이터 제공 목록 > 우편번호DB

3) 우편번호 DB란? > 우편번호 DB파일 바로가기

4) 고시파일 내려받기 > 지역별 주소 DB > 받기

 

DB파일을 받았으면, 나중에 import 하기 쉽게 파일 이름을 숫자로 바꿔준다.

나는 서울과 경기도만 테이블에 넣을 것이기에 두개만 1.txt / 2.txt 로 바꾸었다.

 

DB를 임포트하기 위해서는 local_infile을 사용해야 하는데, 이 값이 ON으로 되어있어야 한다.

확인을 위해 mysql에 들어가서 확인을 해보자

먼저 mysql -u root -p 를 치고 패스워드를 입력해서 들어간뒤

 

mysql> show global variables like 'local_infile'; 을 실행하면

Variables_name Value
local_infile OFF

 

위와 같이 나오면 설정을 변경해 주어야 한다.

 

mysql> set global local_infile=true; 를 실행하면

Variables_name Value
local_infile ON

설정값이 바뀐 것을 볼 수 있다.

그럼 Mysql을 나갔다가 다시 들어온다.

mysql> exit;      > mysql 나가기.

mysql> --local_infile -u root -p  > local_infile 옵션과 함게 mysql 재실행.

 

다음은 아래와 같이 데이터가 들어갈 테이블을 만들어 주면 된다.

mysql 에서 직접 입력해서 만들어도 되는데, 오타가 너무 나서

나는 phpmyadmin에서 만들었다.

CREATE TABLE `basic_db`.`ZIPCODE` (
`ZIP_NO` VARCHAR(5) NOT NULL COMMENT '우편번호' ,
`SIDO` VARCHAR(20) NOT NULL COMMENT '시도' ,
`SIDO_ENG` VARCHAR(40) NOT NULL COMMENT '시도(영문)' ,
`SIGUNGU` VARCHAR(20) NOT NULL COMMENT '시군구' ,
`SIGUNGU_ENG` VARCHAR(40) NOT NULL COMMENT '시군구(영문)' ,
`EUPMYUN` VARCHAR(20) NOT NULL COMMENT '읍면' ,
`EUPMYUN_ENG` VARCHAR(40) NOT NULL COMMENT '읍면(영문)' ,
`DORO_CD` VARCHAR(12) NOT NULL COMMENT '도로명코드' ,
`DORO` VARCHAR(80) NOT NULL COMMENT '도로명' ,
`DORO_ENG` VARCHAR(80) NOT NULL COMMENT '도로명(영문)' ,
`UNDERGROUND_YN` CHAR(1) NOT NULL COMMENT '지하여부' ,
`BUILD_NO1` DECIMAL(5,0) NOT NULL COMMENT '건물번호본번' ,
`BUILD_NO2` DECIMAL(5,0) NOT NULL COMMENT '건물번호부번' ,
`BUILD_NO_MANAGE_NO` VARCHAR(25) NOT NULL COMMENT '건물관리번호' ,
`DARYANG_NM` VARCHAR(40) NOT NULL COMMENT '다량배달처명' ,
`BUILD_NM` VARCHAR(200) NOT NULL COMMENT '시군구용건물명' ,
`DONG_CD` VARCHAR(10) NOT NULL COMMENT '법정동코드' ,
`DONG_NM` VARCHAR(20) NOT NULL COMMENT '법정동명' ,
`RI` VARCHAR(20) NOT NULL COMMENT '리명' ,
`H_DONG_NM` VARCHAR(40) NOT NULL COMMENT '행정동명' ,
`SAN_YN` VARCHAR(1) NOT NULL COMMENT '산여부' ,
`ZIBUN1` DECIMAL(4,0) NOT NULL COMMENT '지번본번' ,
`EUPMYUN_DONG_SN` VARCHAR(2) NOT NULL COMMENT '읍면동일련번호' ,
`ZIBUN2` DECIMAL(4,0) NOT NULL COMMENT '지번부번' ,
`ZIP_NO_OLD` VARCHAR(4) NOT NULL COMMENT '구우편번호' ,
`ZIP_SN` VARCHAR(2) NOT NULL COMMENT '우편일련번호'
)
ENGINE = InnoDB CHARSET=utf8mb3
COLLATE utf8mb3_general_ci
;

다음은 방금 만든 테이블에 우정사업본부에서 가져온 DB를 import 하면 되는데(여기서 시간 많이 날림)

나는 바보같이 윈도우에 다운받아 놓고 윈도우내 경로를... 자꾸 입력했더니.. 안됐다..

우분투에서 다운받아 하니 되네..

 

mysql> LOAD DATA LOCAL INFILE "/home/사용자이름/zipcode_DB/1.txt" INTO TABLE ZIPCODE

            CHARACTER SET 'utf8mb3'   << 여기는 내가 테이블 만들때 뭘로 설정했냐에 따라 그걸로 해주면 된다.

            FIELDS TERMINATED BY '|'  << 이건 각각 데이터들을 뭘로 구분했냐에 따라 

            IGNORE 1 ROWS;

 

CHARACTER는 내가 테이블 만들 때 형식을 'utf8'로 했으면 'utf8' 나처럼 'utf8mb3'로 했으면 위와 같이 하면 된다.

FIELDS 부분은 데이터 사이사이를 뭘로 구분했냐에 따라서 그걸 없애면서 테이블에 입력하게 만든다.

나는 '|' 이걸로 각각 데이터가 구분되어 있어서 저걸 적었다 , 콤마로 구분하면 ',' 이렇게 쓰면 될 듯

IGNORE 1 ROWS;는 받아온 DB의 첫 행이 컬럼이름이기 때문에 그건 무시하고 테이블에 저장하게 된다.

구글링하면서 ROWS가 아니라 LINES라고 써진 곳도 있는데 그럼 문법 오류가 난다.

'웹개발' 카테고리의 다른 글

마이페이지 구현  (0) 2022.12.07
암호화 MD5, password_hash()  (0) 2022.10.23
php, mysql 연결?!(feat. mysql 패스워드 정책)  (0) 2022.10.22