“사회적 교통약자도 편하게 식사하세요”
배슐랭은 사회적 교통 약자가 보다 쉽게 이용할 수 있는 배리어 프리 식당이나 카페 등 가게 정보를 알려주고 사용자 위치 맞춤 추천 서비스를 제공합니다.
사회적 교통 약자분들 위한 음식점 정보와 유저들의 생생한 방문 경험이 담긴 리뷰들로 편하게 방문해보세요!
배슐랭이 사회적 교통약자분들이 편하게 살아갈 수 있도록 한 걸음 나아가겠습니다.
👩🦼 배슐랭 바로가기
Background
배리어 프리 (Barrier-free)는 사회적 약자가 생활하기에 불편함을 주는 물리전, 제도적 장벽을 제거하자는 운동입니다.
생활공간에서 장애인과 비장애인 간의 장벽을 없애자는 움직임이 증가하고 있지만 아직도 사회적 교통약자는 행복을 추구할 기본적인 권리를 보장받지 못하고 있습니다.
배슐랭에서는 배리어 프리 가게들을 알려주고, 위치 기반 맛집 정보 서비스를 제공해 사회적 교통약자분들의 보다 편리한 가게 이용을 가능하게 합니다.
Summary
개발기간
2022-06-24
~ 2022-08-01
(6주)
개발인원
Backend - 3명
Frontend - 2명
Designer - 2명
기술 스택
Language
- Java
Database
- MySQL
Deploy
- Github Actions : CI/CD
- AWS Code Deploy : CI/CD
- Nginx : 무중단 배포
- AWS EC2
- AWS S3
- AWS RDS
Tech
- Spring Boot
- Spring Security : 보안 설정을 위해 사용
- JWT : 사용자 인증/인가를 위해 사용
- OAuth2.0 : 소셜 로그인을 위해 사용
- Spring Batch : 대용량 데이터 처리를 위해 사용
- QueryDSL
- Spring Data JPA
- Jsoup : 가게 사진을 크롤링하기 위해 사용
- Swagger
- WebClient & RestTemplate : Public API와 Kakao API를 호출하기 위해 사용
Data Pipeline
- Public API
- Kakao Maps API
Service & Demo
🏘 내 주변에 있는 배리어 프리 가게
사용자의 현재 위치를 기반으로 주위의 배리어 프리 가게를 한눈에 확인할 수 있습니다.
🤔 다른 사람들은 어느 가게를 많이 갔을까?
별점 순, 북마크 순으로 인기 가게들을 확인할 수 있습니다.
다른 사람들의 실시간 후기를 확인할 수 있습니다.
✅ 나한테 필요한 배리어 프리 시설은?
내가 원하는 배리어 프리 시설별(휠체어 경사로, 엘레베이터, 전용 화장실, 전용 주차장, 출입구 단차)로 가게들을 확인할 수 있습니다.
🗺 가게들을 지도로 한눈에 확인
가게 카드를 클릭하면 상세 페이지에서 위치를 지도로 한 눈에 확인할 수 있습니다.
사용자의 현재 위치를 기반으로 주위의 배리어 프리 가게를 지도로 한 눈에 확인할 수 있습니다.
🔖 가고 싶은 가게를 저장
가고 싶거나 저장해두고 싶은 가게를 저장 하고, 폴더별로 확인할 수 있습니다.
📄 내 경험을 공유하기
방문 후기를 작성해서 다른 사용자들에게 별점과 리뷰를 공유할 수 있습니다.
🔍 찾고 싶은 가게를 검색하기
지역과 키워드로 찾고 싶은 가게를 검색할 수 있습니다.
Project
🛠 서비스 아키텍쳐
🛠 기술적 의사결정
💡 담당한 부분은 👉강조 해두었습니다!
사용 기술 | 기술적 의사 결정 |
PublicAPI | - 사용 목적 배리어 프리 시설을 제공하는 가게들의 데이터를 얻어오기 위해 사용 - 선택지 공공데이터포털 Open API - 선택 이유 공공 시설 관련 데이터를 제공하는 많은 Open API 중 무료이며, 많은 양의 정확한 데이터를 가지고 있기 때문에 선택. |
Kakao Maps API | - 사용 목적 Open API를 이용해 가져온 데이터를 원하는 형태로 가공하기 위해 사용 - 선택지 Naver, Google, Kakao - 선택 이유 레퍼런스가 잘 구성되어 있고, 원하는 데이터를 검색하여 찾을 수 있는 형태의 API를 제공하고 있으며 다양한 정보를 제공하기 때문에 선택 |
👉 Spring Security | - 사용 목적 사용자의 인증, 인가, 로그인, 로그아웃 등의 프로젝트 보안과 관련된 부분을 처리하기 위해 사용 - 선택지 Spring Security - 선택 이유 첫번째는 Spring으로 개발되는 프로젝트에 주로 많이 쓰이는 프레임워크이기 때문에 관련 자료가 많기 때문에 선택하게 되었고, 두번째는 보안관련 코드를 직접 소스로 만들지 않아도 체계적으로 많은 옵션을 제공해주기 때문에 선택. |
👉 JWT | - 사용 목적 사용자의 인증(로그인, 회원가입 등) 위해 사용 - 선택지 서버 기반 인증 - Session 토큰 기반 인증 - JWT - 선택 이유 Session 방식은 상대적으로 구현하기 쉽고 서버에 사용자 정보를 저장하기 때문에 안전하다는 장점이 있지만, 서버에 부담이 가고 확장성이 어렵다는 단점이 있음 JWT 방식은 토큰에 정보를 담아 클라이언트로 보내주고 저장하기 때문에 서버에 무리가 가지 않으며 stateless 하므로 확장성이 보장됨. 또, 토큰에 선택적인 권한만 부여할 수 있기 때문에 관리자 페이지가 따로 있는 배슐랭에 적합하다고 생각해 선택. |
👉 OAuth2.0 | - 사용 목적 배슐랭에서 소셜로그인을 구현하기 위해 사용 - 선택지 일반 로그인 (아이디, 비밀번호 방식) 소셜 로그인 - 선택 이유 최근에는 회원가입 절차를 복잡하고 귀찮아 하는 사람들이 늘어남에따라 버튼 한번만 누르면 간편하게 회원가입과 로그인이 가능한 소셜로그인을 도입하는게 좋다고 생각하여 선택. |
👉 JPA | - 사용 목적 Spring과 MySQL간의 데이터를 매핑하기 위해 사용 - 선택지 MyBatis, JPA - 선택 이유 MyBatis는 SQL문을 알고 있다면 직접 쿼리를 작성하기 때문에 원하는 방식의 로직을 구현할 수 있고 상대적으로 쉽지만, 모든 쿼리를 일일히 작성해야하기 때문에 번거로움. JPA는 쿼리를 직접 작성하지 않아도 메소드 호출로 동작하므로 생산성이 높아지고, 테이블 컬럼이 변경 되었을 때 간단하게 수정이 가능하므로 유지보수하기가 좋음. 러닝커브가 높지만 배우고 나면 훨씬 효율적으로 개발을 할 수 있는 기술이라고 생각했기 때문에 선택. |
👉 QueryDSL | 여러 동적 조건들을 사용해서 테이블을 JOIN하여 결과를 조회하기 위해 사용 |
👉 MySQL FullText Search | - 사용 목적 서비스의 ‘검색’기능을 구현하기 위해 사용 - 선택지 검색엔진 Elasticsearch MySQL LIKE 키워드 MySQL FullTextSearch - 선택 이유 Elasticsearch를 도입하고자 하였으나 러닝커브가 높아 빠른 시간 내에 도입하기에는 무리가 있다고 판단하였음. 따라서 Elasticsearch를 도입하기 전까지 대안이 필요했는데, LIKE 키워드는 full scan을 하므로 데이터가 많아질 수록 나쁜 성능을 보여주고, 검색 기능을 하기에는 많이 부족한 결과를 보여주므로 FullText 인덱스를 사용하는 MATCH AGAINST 를 선택. |
Self-feedback
처음 해보는 협업. 처음 해보는 리더
이번 실전 프로젝트는 모든게 처음이었기에 어려움이 많았다.
팀 노션 페이지를 만들고, 깃 충돌을 최대한 줄이기 위해 깃플로우도 적용했으며, 주기적으로 회의 시간도 가졌지만 MVP 발표 및 피드백 시간에 ‘답정너 커뮤니케이션'을 하고 있다는 피드백을 받은 이후에 리더로서 어떻게 팀원들 간의 커뮤니케이션을 원할하게 할 지에 대한 고민을 많이 했다.
프론트엔드 리더님과 함께 팀원들의 진행상황 파악 및 의견공유를 하고, 가능한 매일 **애자일 방법론 중 하나인 스크럼(Scrum)**을 진행하면서 리더로서의 역할을 충실히 하려고 노력했다.
기술적인 도전
백엔드 팀원분들과 균등하게 역할을 나눠가졌고, 소셜로그인과 검색 부분을 맡게 되었다.
다소 만만하게 보았던 OAuth2.0을 이용한 소셜로그인은 Spring Security와 JWT가 합쳐지고 나니 생각보다 큰 기술적 도전으로 다가왔다. Spring Security에서 JWT를 적용하기 위한 플로우와, OAuth2.0의 적용 플로우를 이해하고, 구현하려는 코드를 이해하는데에만 일주일이 넘는 시간이 걸렸다.
고생은 많이 했지만 덕분에 사용자 경험을 높이면서 여러가지 보안 위협을 차단하기 위해서는 고려해야할 부분이 많고, 애플리케이션 보안은 가장 기본이 되면서도 가장 중요한 분야라는 걸 배울 수 있었다.
이번 프로젝트에서 코어 기능을 담당하지는 않았지만 지금까지 깊게 생각하지 못했던 보안의 중요성에 대해 깨닫게 되었다.
아쉬운 점
6주라는 기간동안 핵심 기능이나 기술적 도전이 되는 기술을 더 많이 담당하지 못한 게 가장 아쉬움으로 남는다.
검색 기능을 MySQL의 Fulltext index를 이용하여 구현했는데, Elasticsearch를 이용하여 구현하였다면 더 좋은 성과를 낼 수 있었지 않을까하는 생각이 들었다.
또, CI/CD나 무중단 배포, 캐싱기능을 더 깊게 공부하지 못한 점이 아쉬움으로 남는다.
남은 취업준비 기간동안 실전 프로젝트인 배슐랭에 Elasticsearch를 도입하고, 1인프로젝트로 진행했던 펫퓰러에 아쉬움으로 남았던 기능들을 공부해서 적용하고 발전시키고자 한다.
총평
협업, 기술적 도전, 시간 관리 등등 많은 걸 얻어갈 수 있는 프로젝트였다.
지난 6주를 되돌아보면 아쉬운 점도 있지만 그만큼 전 보다 성장을 할 수 있었다고 자신있게 말할 수 있다. 비록 다른 사람들에 비해 다양한 기술을 다뤄본 건 아니지만 이번 기회를 통해 어느 부분에 어떤 기술을 접목할 수 있을 지 감을 잡을 수 있었다.
개발인생은 끊임없는 공부의 연속이라고 한다.
실전프로젝트로 끝나는게 아니라 이 기간동안 배운 것들을 토대로 기존 프로젝트를 더 발전시킬 수 있겠다는 확신을 얻었고, 앞으로 어떤 도전을 마주치더라도 두려워하지 않고 마주볼 수 있는 사람이 되었다고 자신있게 말할 수 있다.
'Study > TIL' 카테고리의 다른 글
[TIL] 07/25 항해99 78일차 - MySQL 검색기능 : FullText Search (0) | 2022.07.28 |
---|---|
[TIL] 07/19 항해99 72일차 - 트러블 슈팅 : 배포 후, cookie가 삭제되지 않는 문제 (0) | 2022.07.28 |
[TIL] 07/15 항해99 68일차 - 트러블 슈팅 : JWT 401에러 보내기 (0) | 2022.07.26 |
[TIL] 07/10 항해99 63일차 - postman에서 cookie 사용하기 (1) | 2022.07.25 |
[TIL] 07/07 항해99 60일차 - 트러블 슈팅 : 카카오 로그인에서 이메일이 넘어오지 않는 문제 (0) | 2022.07.25 |