(springboot) 회원가입시 주소입력을 위한 카카오 주소 API 활용

2021. 7. 17. 18:29·스프링/스프링부트 API 설계 정리

환경 : springboot + thymeleaf + h2(DB)

 

목적

회원가입시 주소를 입력해야하는데 이를 위해 카카오에서 제공하는 도로명 주소 API를 사용해보려 한다.

 

카카오 도로명 주소 API

https://postcode.map.daum.net/guide

 

Daum 우편번호 서비스

우편번호 검색과 도로명 주소 입력 기능을 너무 간단하게 적용할 수 있는 방법. Daum 우편번호 서비스를 이용해보세요. 어느 사이트에서나 무료로 제약없이 사용 가능하답니다.

postcode.map.daum.net

기본적으로 주석까지 자세하게 달려서 제공되고 있으므로 천천히 읽어보자

 

필자는 "사용자가 선택한 값 이용"을 선택해서 사용해 보겠다

 

기본 Address객체 클래스
@Embeddable
@Getter
public class Address {

	private String zipcode;
	private String streetAdr;
	private String detailAdr;

	protected Address() {
	}

	public Address(String zipcode, String streetAdr, String detailAdr) {
		this.zipcode = zipcode;
		this.streetAdr = streetAdr;
		this.detailAdr = detailAdr;
	}
}

 

회원가입 요청값, 반환값 처리
@GetMapping("/members/new")
public String createForm(Model model) {
	model.addAttribute("memberForm", new MemberForm());
	return "members/createMemberForm";
}

@PostMapping("/members/new")
public String create(@Valid MemberForm form) {

	Address address = new Address(form.getZipcode(), form.getStreetAdr(), form.getDetailAdr());

	Member member = new Member();
	member.setName(form.getName());
	member.setAddress(address);

	memberService.join(member);
	return "redirect:/";
}

 

회원가입 HTML - createMemberForm
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
    <div th:replace="fragments/bodyHeader :: bodyHeader"/>
    <form role="form" action="/members/new" th:object="${memberForm}" method="post">
        <div class="form-group">
            <label th:for="name">이름</label>
            <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요"
                   th:class="${#fields.hasErrors('name')}? 'form-control  fieldError' : 'form-control'">
            <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Incorrect date</p>
        </div>
        <div class="form-group">
            <label th:for="zipcode">우편번호</label>
            <input type="text" th:field="*{zipcode}" class="form-control" placeholder="우편번호를 입력하세요" readonly onclick="findAddr()">
        </div>
        <div class="form-group">
            <label th:for="streetAdr">도로명 주소</label>
            <input type="text" th:field="*{streetAdr}" class="form-control" placeholder="도로명 주소를 입력하세요" readonly>
        </div>
        <div class="form-group">
            <label th:for="detailAdr">상세주소</label>
            <input type="text" th:field="*{detailAdr}" class="form-control" placeholder="상세주소를 입력하세요">
        </div>
        <br/>
        <button type="submit" class="btn btn-primary">입력</button>
    </form>
    <br/>
    <div th:replace="fragments/footer :: footer"/>
</div>
</body>
<script>
    function findAddr() {
        new daum.Postcode({
            oncomplete: function(data) {

                var addr = ''; // 주소 변수
                var extraAddr = ''; // 참고항목 변수

                if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
                    addr = data.roadAddress;
                } else { // 사용자가 지번 주소를 선택했을 경우(J)
                    addr = data.jibunAddress;
                }

                if(data.userSelectedType === 'R'){
                    if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                        extraAddr += data.bname;
                    }
                    if(data.buildingName !== '' && data.apartment === 'Y'){
                        extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
                    }
                    if(extraAddr !== ''){
                        extraAddr = ' (' + extraAddr + ')';
                    }
                    document.getElementById("detailAdr").value = extraAddr;
                } else {
                    document.getElementById("detailAdr").value = '';
                }
                document.getElementById('zipcode').value = data.zonecode;
                document.getElementById("streetAdr").value = addr;
                document.getElementById("detailAdr").focus();
            }
        }).open();
    }
</script>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
</html>

 

결과

반응형
저작자표시 (새창열림)

'스프링 > 스프링부트 API 설계 정리' 카테고리의 다른 글

API 개발 (4) - One to Many관계 - DTO 직접 조회  (0) 2021.07.29
API 개발 (3) - One to Many관계 - Entity조회 후 DTO로 변환  (0) 2021.07.29
API 개발 (2) - X to One관계  (0) 2021.07.28
API 개발 (1) - 회원 조회, 수정, 생성  (0) 2021.07.28
웹 애플리케이션 API 개발 (DTO)  (1) 2021.07.25
'스프링/스프링부트 API 설계 정리' 카테고리의 다른 글
  • API 개발 (3) - One to Many관계 - Entity조회 후 DTO로 변환
  • API 개발 (2) - X to One관계
  • API 개발 (1) - 회원 조회, 수정, 생성
  • 웹 애플리케이션 API 개발 (DTO)
구름뭉치
구름뭉치
구름의 개발일기장
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (283)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (28)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (6)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    레이저
    크로아티아
    mx master s3 for mac
    키보드 손목 받침대
    동유럽
    류블라냐
    마우스
    부다페스트
    마우스 패드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
(springboot) 회원가입시 주소입력을 위한 카카오 주소 API 활용
상단으로

티스토리툴바