[java] 우편번호 DB에 가져오기, 우편번호 검색기 넣는 방법

program/java 2012. 10. 5. 11:32
반응형

Q. 우편번호 검색기를 추가해보자.


인터넷을 돌아다니다 보면 회원가입 페이지에서 우편번호 검색하는 부분이 있다.


그런식으로 검색을 하기 위해선 우편번호DB 가 필요하다.






1. 우편번호DB 제공 사이트 방문


홈페이지 : http://www.zipfinder.co.kr/

우편번호DB : http://www.zipfinder.co.kr/zipcode/index.html

"우편번호 원본파일" 메뉴를 클릭하면 우편번호DB 파일이 보여진다.




2. 우편번호DB 선택


각 메뉴중 자기가 필요한 파일을 선택하여 다운받는다.

필자는 Type 3(txt) 로 하였다.




3. DB 만들기


위에서 받은 파일 각 Type의 컬럼 대로 테이블을 생성한다.

예) Type 3


CREATE TABLE POST
(
    SEQ                  INTEGER NOT NULL ,
    ZIPCODE              CHAR(7) NULL ,
    SIDO                 VARCHAR2(30) NULL ,
    GUGUN                VARCHAR2(30) NULL ,
    DONG                 VARCHAR2(30) NULL ,
    RI                   VARCHAR2(50) NULL ,
    ST_BUNJI             VARCHAR2(10) NULL ,
    ED_BUNJI             VARCHAR2(10) NULL 
);

ALTER TABLE POST  ADD  PRIMARY KEY (SEQ);




4. DB파일을 INSERT 하기 좋게 변환


DB파일을 열어 처리하게 쉽게 변환한다.

1번 라인의 컬럼명을 지운다.

예)Type 3

(ZIPCODE SIDO GUGUN DONG RI ST BUNJI ED_BUNJI SEQ) 삭제


그리고 맨 마지막 빈공간 라인을 삭제한다.

맨 마지막 라인의 데이터가 존재해야한다.


마지막으로 탭으로 구분되어 있는 구분기호를 '|' 로 바꾼다.

메모장이나 텍스트에디터로 탭을 -> '|' 기호로 전체를 바꾼다.




5. 프로그래밍을 해서 DB에 INSERT 한다.


import java.io.*;
import java.sql.*;

public class PostalNumberMig
{
	public static void main( String[] args ) throws Exception
	{
		Class.forName( "oracle.jdbc.driver.OracleDriver" );

		PreparedStatement stmt = null;
		Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:ORCL", "id", "pw" );

		try
		{
			conn.setAutoCommit( true );
			stmt = conn.prepareStatement( "INSERT INTO POST( SEQ, ZIPCODE, SIDO, GUGUN, DONG, RI, ST_BUNJI, ED_BUNJI ) VALUES( ?, ?, ?, ?, ?, ?, ?, ? ) " );

			BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( "post1.txt" ), "euc-kr" ) );

			try
			{
				int totCnt = 0;
				int cnt = 0;
				String s;

				long start = System.nanoTime();
				while( ( s = reader.readLine() ) != null )
				{
					totCnt++;
					int charCnt = 0;
					int seq = totCnt;

					String zipcode = s.substring( 0, 7 );

					charCnt = zipcode.length() + 1;
					String sido = s.substring( charCnt, s.indexOf( '|', charCnt ) );

					charCnt += sido.length() + 1;
					String gugun = s.substring( charCnt, s.indexOf( '|', charCnt ) );

					charCnt += gugun.length() + 1;
					String dong = s.substring( charCnt, s.indexOf( '|', charCnt ) );

					charCnt += dong.length() + 1;
					String ri = s.substring( charCnt, s.indexOf( '|', charCnt ) );

					charCnt += ri.length() + 1;
					String st_bunji = s.substring( charCnt, s.indexOf( '|', charCnt ) );

					charCnt += st_bunji.length() + 1;
					String ed_bunji = s.substring( charCnt, s.indexOf( '|', charCnt ) );

					stmt.setInt( 1, seq );
					stmt.setString( 2, zipcode.trim() );
					stmt.setString( 3, sido.trim() );
					stmt.setString( 4, gugun.trim() );
					stmt.setString( 5, dong.trim() );
					stmt.setString( 6, ri.trim() );
					stmt.setString( 7, st_bunji.trim() );
					stmt.setString( 8, ed_bunji.trim() );

					stmt.addBatch();
					cnt++;

					if( cnt == 50000 )
					{
						cnt = 0;
						stmt.executeBatch();
					}
				}

				if( cnt > 0 )
					stmt.executeBatch();

				long end = System.nanoTime();
				System.out.println( ( end - start ) + "(ns)" );
			}
			finally
			{
				reader.close();
			}

			conn.commit();
		}
		finally
		{
			if( stmt != null )
				try
				{
					stmt.close();
				}
				catch( Exception e )
				{
				}
			conn.close();
		}
	}
}



반응형