우편번호 찾기

우편번호 찾기 버튼을 누르면 우편번호 검색 팝업창이 뜨게 한다.

<input type="button" value="우편번호 찾기" id="searchZipcode">

<script>
	$(function(){
		// 우편번호 찾기 버튼 누르면
		$("#searchZipcode").click(function(){
			// 우편번호 검색 팝업창 생성
			window.open("/myapp/member/searchZipcode","zipcode","width=600px, height=500px, top=200px, left=200px");
		});
	});
</script>

팝업창의 url매핑을 컨트롤러에 해준다.

// 우편번호 검색 팝업
@GetMapping("/member/searchZipcode")
public ModelAndView searchZipcode(String street) {
	ModelAndView mad = new ModelAndView();
	
	mad.setViewName("member/searchZipcode");
	
	return mad;
}

@RequestMapping대신 @GetMapping어노테이션도 사용할 수 있다. searchZipcode.jsp를 member폴더 아래 생성하고 구성하자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
	.topMenu, .bottomMenu{
		display:none;
	}
</style>
<title>우편번호 검색</title>
</head>
<body>
	<div id="zipDiv">
		도로명을 입력 후 우편번호를 검색하세요.<br>
		(예:학동로77길)<br>
		<form id="zipcodeForm" action="/myapp/member/searchZipcode">
			도로명 : <input type="text" name="street" id="street">
			<input type="submit" value="검색">
		</form>
		<hr>
		<ul id="zipList">
		
		</ul>
	</div>
</body>
</html>

jQuery로 도로명이 제대로 입력되었나 확인한다.

<script>
	$(function(){
		// 도로명을 입력 후 주소 검색
		$("#zipcodeForm").submit(function(){
			if($("#street").val()==""){
				alert("도로명을 입력하세요.");
				return false;
			}
			return true;
		});
	});
</script>

회원가입 페이지에서 검색팝업을 열땐 검색값이 없다. 하지만 팝업에서 도로명을 입력한 후 검색할땐 DB조회를 해야한다. 이 두 가지 경우에 대해서 컨트롤러에서 조건문을 걸어서 DB조회를 할지 말지 설정해주자.

// 우편번호 검색 팝업
@GetMapping("/member/searchZipcode")
public ModelAndView searchZipcode(String street) {
	ModelAndView mad = new ModelAndView();
	
	if(street!=null && street!="") {
		// 도로명 주소가 있을때만 DB검색 실시
	}else {
		// 도로명 주소가 없을땐 검색X
	}
	
	mad.setViewName("member/searchZipcode");
	return mad;
}

우선 어떤 도로명을 검색해야하는지에 대한 쿼리문을 먼저 준비하자.

SELECT zipcode, city, street, bldg1, bldg2, bldgname, dong, num1, num2
FROM zipcode_tbl WHERE street LIKE '%도로명%';

zipcode_tbl에서 검색한 주소값 데이터를 담아줄 VO를 만들어준다.

package com.poby.myapp.vo;

public class ZipcodeVO {
	private String zipcode;
	private String city;
	private String street;
	private int bldg1;
	private int bldg2;
	private String bldgname;
	private String dong;
	private int num1;
	private int num2;
	
}

여러개의 ZipcodeVO가 생길테니, List로 리턴받도록 DAO를 작성해야한다.

package com.poby.myapp.dao;

import java.util.List;

import com.poby.myapp.vo.ZipcodeVO;

public interface MemberDAO {
	// 아이디 중복확인
	public int idCheck(String username);
	
	// 우편번호 검색
	public List<ZipcodeVO> searchZipcode(String street);
}

동일한 메소드를 MemberService에 넣어주고, MemberServiceImpl에서 오버라이딩 해준다.

package com.poby.myapp.service;

import java.util.List;

import com.poby.myapp.vo.ZipcodeVO;

public interface MemberService {
	public int idCheck(String username);
	public List<ZipcodeVO> searchZipcode(String street);
}
package com.poby.myapp.service;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.poby.myapp.dao.MemberDAO;
import com.poby.myapp.vo.ZipcodeVO;

@Service
public class MemberServiceImpl implements MemberService {
	@Inject
	MemberDAO dao;

	@Override
	public int idCheck(String username) {
		return dao.idCheck(username);
	}

	@Override
	public List<ZipcodeVO> searchZipcode(String street) {
		return dao.searchZipcode(street);
	}
}

memberMapper.xml에 쿼리문을 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.poby.myapp.dao.MemberDAO">
	<select id="idCheck" resultType="int">
		SELECT count(username) cnt FROM member_tbl WHERE username=#{param1}
	</select>
	<select id="searchZipcode" resultType="com.poby.myapp.vo.ZipcodeVO">
		SELECT zipcode, city, street, bldg1, bldg2, bldgname, dong, num1, num2
		FROM zipcode_tbl WHERE street LIKE '%${param1}%'
	</select>
</mapper>

반환형이 ZipcodeVO이기 때문에 resultType에 패키지명까지 상세하게 기술한다. select의 id는 DAO에 있는 메소드명과 동일해야한다.

쿼리문 세팅이 끝났으니, 컨트롤러로 넘어와서 쿼리문의 결과 데이터를 담아서 뷰페이지로 넘겨주자.

// 우편번호 검색 팝업
@GetMapping("/member/searchZipcode")
public ModelAndView searchZipcode(String street) {
	ModelAndView mad = new ModelAndView();
	
	List<ZipcodeVO> list = null;
	if(street!=null && street!="") {
		// 도로명 주소가 있을때만 DB검색 실시
		list = service.searchZipcode(street);
	}
	
	mad.addObject("list", list);	// 검색값이 있으면 제대로 리턴, 없으면 null
	
	mad.setViewName("member/searchZipcode");
	return mad;
}

도로명을 입력하고 검색버튼을 누르면 쿼리문을 실행해서 결과값 list를 attribute로 넘겨준다. 넘겨받은 list를 이용해서 목록을 출력하자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- attribute로 넘어온 변수 : list -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
	.topMenu, .bottomMenu{
		display:none;
	}
</style>
<script>
	$(function(){
		// 도로명을 입력 후 주소 검색
		$("#zipcodeForm").submit(function(){
			if($("#street").val()==""){
				alert("도로명을 입력하세요.");
				return false;
			}
			return true;
		});
	});
</script>
<title>우편번호 검색</title>
</head>
<body>
	<div id="zipDiv">
		도로명을 입력 후 우편번호를 검색하세요.<br>
		(예:학동로77길)<br>
		<form id="zipcodeForm" action="/myapp/member/searchZipcode">
			도로명 : <input type="text" name="street" id="street">
			<input type="submit" value="검색">
		</form>
		<hr>
		<ul id="list">
			<c:if test="${ list!=null }">
				<!-- 30062 세종특별자치시 마음로322길, (고운동 1387-0, 가락마을22단지) -->
				<c:forEach var="vo" items="${ list }">
					<li>${ vo.zipcode } ${ vo.city } ${ vo.street }${ vo.bldg1 }길,
						(${ vo.dong } ${ vo.num1 }<c:if test="${ vo.num2>0 }">-${ vo.num2 }</c:if>, ${ vo.bldgname })</li>
				</c:forEach>
			</c:if>
		</ul>
	</div>
</body>
</html>

원하는 주소를 클릭하면 회원가입 Form에 표시하자. jQuery로 해준다.

<script>		
		// 우편번호와 주소를 회원가입 Form에 표시하기
		$("#list>li").click(function(){
			// 이벤트가 발생한 li태그의 내용을 얻어오기
			var zipAddr = $(this).text();
			var zipcode = zipAddr.substring(0,5);
			var addr = zipAddr.substring(6);
			
			// 회원가입 Form에 표시
			opener.document.getElementById("zipcode").value = zipcode;
			opener.document.getElementById("addr").value = addr;
			
			// 팝업 닫기
			self.close();
		});
	});
</script>

id가 list인 태그 안에 있는 li태그를 클릭할때 실행되는 함수이다.

추가로 검색창에서 주소 위에 마우스를 올렸을때 아무런 반응이 없어서 마우스를 위에 올렸을때 볼드처리되도록 했다.

<style>
	li:hover{
		text-decoration:underline;
		font-weight:bold;
	}
</style>



 

+ Recent posts