카카오지도 API로 주소-상호명 재정리 API 팀 프로젝트 회고록 / 반려동물 산책 동반자 찾기 시스템

김지민·2025년 4월 4일
0

회고록

목록 보기
10/11
post-thumbnail

DangDangCrew

1️⃣ 개요

프로젝트 주제💡

대주제

: 카카오지도 API로 주소-상호명 재정리 API

  • 카카오지도 API를 활용하여 주소 데이터를 기준으로 상호명을 체계적으로 정리하는 맞춤형 API를 개발합니다.
  • 사용자들이 원하는 정보를 신속하게 검색할 수 있으며, 위치 기반 서비스의 신뢰성과 효율성을 높이는 것을 목표로 합니다.

소주제

반려동물 산책 동반자 찾기 시스템


프로젝트 목표🚀

  • Kakao Maps API 를 활용한 위치 기반 산책 장소 탐색
    • 카카오 지도 api 를 활용하여 사용자의 현재 위치에서(혹은 검색 위치) 반려동물 출입 가능 장소(공원, 애견 동반 카페, 애견 동반 식당) 를 조회하고 지도에 표시
    • 사용자가 직접 원하는 산책 장소를 선택하고 모임을 생성하여 동반자를 모집할 수 있도록 함
  • 실시간 반려동물 동반자 매칭 시스템 구축
    • 게시글 기반 모집 시스템을 도입하여 사용자가 원하는 시간과 장소에서 함께 산책 할 파트너를 쉽게 찾을 수 있도록 함
    • 지역 커뮤니티 활성화를 위해 동반자 모집 기능 최적화
  • 실시간 채팅 기능 구현(WebSocket 활용)
    • WebSocket 을 활용하여 참가자들끼리 실시간 채팅 가능
    • 산책 시간/장소 조율 및 추가 정보 공유 가능
    • 지도 공유 기능 → 선택한 공원/카페 위치를 채팅방 내에서 직접 확인
  • 사용자 신뢰도 기반 후기 및 평가 시스템 구축
    • 산책 모임 종료 후 매너 평가 시스템 도입(”약속을 잘 지켰나요?”, “강아지가 온순하고 활발한가요?” 등)
    • 후기 및 신뢰도를 기반으로 매너 좋은 사용자에게 혜택 제공(우수 이용자 칭호 및 배지)
  • Redis 를 활용한 실시간 데이터 처리 최적화
    • 유저의 참가 신청 트래픽 분석을 통해 인기 있는 반려동물 동반 장소(카페, 공원)를 실시간으로 감지하고 알림 제공

프로젝트 내용📝

수행 방법

  1. 요구사항 분석
    • 주요 기능 정의
    • 사용자 시나리오 정리
    • API 기능 목록 작성
    • 비즈니스 로직 명세화
  2. 데이터베이스 설계
    • ERD 설계
    • Redis 등 캐싱 시스템 고려
  3. RESTful API 개발
    • API 엔드포인트 설계
    • HTTP Method와 응답 코드 설계
    • API 문서 작성
    • 보안 적용
    • 데이터 검증 및 예외처리 추가
  4. 테스트
    • 유닛 및 통합테스트 진행
  5. 배포 및 유지보수
    • CI/CD 구축
    • 모니터링 시스템 적용
    • 오류 로깅
  6. 성능 평가 및 개선
    • API 응답 속도 측정 및 개선
    • Redis 등을 이용하여 캐싱 적용
    • DB 인덱스 최적화
  7. 마무리
    • 성과물 정리
    • 발표 준비

프로젝트 배경🖼️

반려인들끼리 교류하고 정보를 공유할 수 있는 모임을 쉽게 만들기 어렵고 반려동물 동반 가능 장소를 찾는 것에 대한 어려움을 해소하기 위해 반려동물 동반 가능 점포를 쉽게 확인할 수 있고, 모임 생성 및 참여할 수 있는 서비스를 제공


2️⃣ 일정

프로젝트의 시작일과 종료일📆

시작일: 2025년 2월 4일
종료일: 2025년 2월 21일


작업 계획🗓️

사전 기획

실제 개발 기간


3️⃣ 프로젝트 팀 구성

팀 구성원들의 역할과 책임👑

공통 작업

  • 테스트 코드
  • ERD 설계
  • 요구사항 정리 및 사용자 시나리오 작성

개별 작업

김지민(본인)

  • 유저 도메인
    - 회원가입/로그인
    - 보안, 인가, 인증 적용 (jwt)
    정태민
  • 유저 평가 도메인
    - 평점
    - 평가 내용
    강형준
  • 장소 도메인
  • 알림 도메인
    - 실시간 인기 점포 알림 시스템 적용 (SSE)
  • 배포 및 CI/CD 구축
  • 모니터링 서버 구축
    이지수
  • 모임 도메인
    - 모임 상세페이지
    • 개인 모임 조회
  • 프로토타입 제작
    임영광
  • 채팅 도메인
    - 장소 별 채팅 기능 적용 (WebSocket)
  • 프로토타입 제작

4️⃣ 기술 스택 및 사용 도구

기술 스택

  • Java
  • Spring Boot
  • JWT
  • MongoDB
  • Websocket
  • Redis
  • MySQL
  • Prometheus
  • Grafana
  • SSE
  • AWS

사용 도구

  • IntelliJ IDEA
  • GitHub
  • Postman
  • Swagger
  • Docker

5️⃣ 아키텍처

ERD

유저 도메인

모임 도메인

모임, 평가 도메인

장소 도메인

채팅 도메인


알림 도메인


SSE 도메인




6️⃣ 기능 설명

회원가입:

회원가입 시 MySQL에 유저정보가 등록됩니다.

로그인:

사용자의 인증 정보를 검증하여 로그인합니다.

인증이 완료되면 Access Token과 Refresh Token이 발급됩니다.
Access Token은 클라이언트가 서버에 요청할 때 인증에 사용됩니다.
Refresh Token은 Redis에 저장되며, Access Token이 만료될 경우 새로운 Access Token을 발급받는 데 사용됩니다.

로그아웃:

사용자 인증을 해제하고, 세션을 종료합니다.
Redis에서 저장된 RefreshToken이 삭제되어 더 이상 액세스 토큰을 갱신할 수 없습니다.

모임 생성:

카카오 맵을 통해 사용자가 지정한 위치에 해당하는 애견 동반 장소를 보여줍니다.
애견 동반 장소를 클릭하여 장소 상세 정보를 확인하고 모임 생성 버튼을 통해 모임을 생성합니다.
모임 생성시에 최대 인원수, 모임 설명, 모임 날짜 등의 내용을 기입하여 모임을 생성합니다.

모임 참가:

사용자가 지도 혹은 즐겨찾기 알림을 통해 생성된 모임을 확인합니다.
모임 소개글에 적힌 장소, 시간등을 확인 합니다.
참가를 원할 경우 참가 신청을 누릅니다.

실시간 채팅 기능:

실시간으로 여러 사람들과 채팅방에서 모임 관련 대화를 할 수 있습니다.

참여자 평가:

모임이 종료되면 해댱 모임 참여차들 평가를 선택적으로 할 수 있습니다.

즐겨찾기:

모임을 희망하는 장소를 즐겨찾기 등록합니다.
즐겨찾기 등록한 장소에 모임이 생성되면 알림을 전송합니다.

핫플 추천 알림:

장소에 생성된 모임의 확정된 참가자들 수 기반으로 일정 수치 이상의 참가자수가 발생하면 접속 유저들에게 핫플 장소 알림(SSE)를 전송합니다.


7️⃣ 도전과제 및 해결책

도전과제라고 해야하는진 모르겠지만 프로젝트를 하면서 가장 기억에 남았던 작업은 토큰 기반 유저 조회 API 추가하는 것이었습니다. 해당 작업에 대한 PR을 올리고 팀원들에게 컨펌받는 과정에서 두가지 질문을 받았습니다.

  1. registerUser 메서드에서도 UserResponseDto를 생성하는 것 같은데, 공통 부분을 추출해서 쓰는게 가독성 측면에서 좋지 않을까 생각이 드는데 지민님 생각은 어떤지 궁금합니다.ᐟ

  2. 유저와 연관관계를 가진 도메인이 meeting, evaluations 등등 있습니다. 토큰에서 유저 정보를 추출해서 사용해야하는데, 해당 로직은 유저 도메인쪽에서 작성하실 예정이신지도 질문드립니다.

1번 질문에 관해서는 코드를 작성하면서 공통적인 부분은 따로 추출해서 코드를 작성해야 했는데 간과한 부분이라서 아차 싶었던 부분이었습니다. 이때 이후로 최대한 공통적인 부분은 따로 리팩토링하는 작업을 거치고 있습니다.

2번 질문에 관해서는 유저 도메인만 생각해서 작업하다보니 유저와 연관관계를 가진 도메인들을 생각하지 못했었습니다. 그저 UserService.getUserInfo(token)를 호출해서 유저 정보를 가져오는 것만 구현해놨었습니다.

public User getUserEntityByToken(String token) {
    String email = jwtTokenProvider.getEmailFromToken(token);
    return userRepository.findByEmail(email)
            .orElseThrow(() -> new RuntimeException("User not found"));
}

그래서 이런 방법도 고려했었지만 해당 메서드를 사용하게 되면 매번 사용할 때마다 token 값을 넣어줘야하는 번거로움이 존재해서, SecurityContextHolder를 사용해서 로그인한 User 엔티티를 반환하는 방법을 사용하는 것이 좋을 것 같다는 피드백을 받아

 public User getCurrentUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        if (authentication == null || !authentication.isAuthenticated()) {
            throw new RuntimeException("User is not authenticated");
        }

        Object principal = authentication.getPrincipal();

        if (!(principal instanceof UserDetails)) {
            throw new RuntimeException("Authentication principal is not UserDetails type");
        }

        UserDetails userDetails = (UserDetails) principal;
        return userRepository.findByEmail(userDetails.getUsername())
                .orElseThrow(() -> new RuntimeException("User not found"));
    }

이렇게 로그인한 유저의 엔티티를 반환하는 메서드를 추가하였습니다.


8️⃣ 결과 및 성과

성능 최적화 보고서 & API 문서

Notion 링크

시연 영상


9️⃣ 향후 개선 사항


🔟 후기 및 배운 점

회원가입과 JWT를 적용한 로그인, 토큰 관련 기능들을 구현하며 인증과 보안 로직에 대해 이해할 수 있었습니다. 이번에 개발한 부분을 리팩토링하며 향후 다른 프로젝트에서도 템플릿처럼 사용해 확장 개발할 수 있을 것이라 생각합니다.

이번 프로젝트를 통해 팀원들과 협업하며 실제 서비스 구축의 모든 단계를 경험했고, 실무에 가까운 개발 경험을 축적할 수 있었습니다. 기술적 성장은 물론, 사용자 중심 서비스 기획과 문제 해결력까지 함께 키울 수 있었던 소중한 시간이었습니다.


📌 마무리

DangDangCrew 프로젝트는 반려인들의 실제 생활 속 불편함을 해소하고 커뮤니티를 활성화하는 데 목적을 두고 기획되었습니다. 카카오 지도 API를 활용한 반려동물 동반 가능 장소 탐색, 실시간 모임 매칭, WebSocket 기반의 채팅, Redis와 SSE를 이용한 실시간 알림 등 다양한 기술을 실용적으로 융합해 완성도 높은 서비스를 구축할 수 있었습니다.

특히, 유저 인증과 보안(JWT), Redis 기반 실시간 데이터 처리, MongoDB와 MySQL의 혼합 사용 등 백엔드 구조의 깊이 있는 설계를 통해, 기능성과 확장성 모두를 갖춘 서비스를 만들었다는 점에서 의미가 큽니다.

이 프로젝트는 향후에도 산책 기록 공유 및 SNS 기능 도입, AI 기반 산책 추천 루트 생성, 반려동물 커뮤니티 이벤트 기능, 이용자 분석을 통한 개인화 추천 시스템 등으로 발전 가능성이 있습니다.


🔗 참고 자료 및 링크

GitHub

profile
백엔드 개발자를 준비하는 삐약이 대학생에서 .. 취준생🐣

0개의 댓글