당근마켓 클론코딩 정리하는 긴글

d-h-k·2022년 1월 23일
2

당근마켓 클론코딩

당근마켓 클론코딩을 진행하면서 이번에 주로 어떤일들을 했는지 셀프피드백을 해봤습니다.

  • 이번에는 코딩할시간이 많이 없어서 주로 도메인분석과 역으로 기획서를 작성하고 모델링하는데 시간을 많이 투여했는데요,

목차

  • 기획/Link : 당근마켓 기획서 & 유저 시나리오 분석
  • 기술/Link : 기술설명
  • 에필로그/Link : 당근마켓 도메인 분석하는 TMI 글 - 아이템이 아니라 글쓰기에 집중한 이유, 위치서비스를 제공하는 방법 분석하기













당근마켓 기획서 & 유저 시나리오 분석

  • 이 페이지는 당근마켓 서비스의 클론코딩을 위해 백엔드개발자의 입장에서 기획서를 역으로 구성한 페이지 입니다

기술적인 부분

  • 예외 상황에 대한 예외처리
  • 필수 기능만 생각하고, 추가기능은 추가가 어렵지만 않게하고 YAGNI!
  • 데이터 모델링 : 확장성 있게 Database 설계 Er-diagram 작성 및 제출
  • 서버 배포와 Integration

유저 시나리오 기반의 동작 프로세스

  • http 가 stateless 하지만, 사용자들은 아래 상태들을 한정되는 FSM 으로 모델링 됩니다
  • 고객 시나리오에 대응하는 프로세스를 짜고 이에 맞는 VIEW 와 API 를 작성하자

사용자 행동 시나리오

  • 1 ) 회원가입
    • 1.1) 랜딩페이지
    • 1.2) 회원가입 화면
    • 1.3) 로그인 화면
    • 1.4) (추가기능) 토큰만료 화면
  • 2 ) 상품등록(판매 글/글작성)
    • 2.1) 상품등록 페이지
    • 2.2) 카테고리 페이지
    • 2.3) 상품 상세 페이지
    • 2.4) 이 판매자의 다른 판매상품
  • 3 ) 마이페이지
    • 3.1) 마이 페이지(나의 당근 페이지) 메인
    • 3.2) 프로필 수정 페이지
    • 3.3) 판매내역 페이지
    • 3.4) 관심목록
  • 4 ) 댓글기능
    • 4.1) 댓글달기 기능
    • 4.2) 댓글수정 기능
    • 4.3) 댓글삭제 기능
  • 5 ) 추가기능
    • 5.1) 글 보호잠금 기능 / 사기피해예방
    • 5.2) 유효한 이메일인지 확인 / 업자 필터
    • 5.3) 중고 매물 검색기능
    • 5.4) 알람 기능 (키워드, 관심상품, 내 작성글)
    • 5.5) 대댓글 기능
    • 5.6) 뱃지 기능
    • 5.7) 매너온도 기능
    • 5.8) 채팅 기능 추가
    • 5.9) 글 끌어올림 기능





1) 회원가입

1.1) 랜딩페이지

  • 로그인을 하지 않았으면 랜딩페이지로 아래와 같은 화면 노출
  • 시작하기를 누르면 회원가입 페이지로 넘어갑니다.

1.2) 회원가입 화면

  • 이메일, 비밀번호, 이름, 핸드폰번호, 닉네임을 입력받으면 가입완료!
  • 가입완료시 메인으로 리다이렉트

1.3) 로그인 화면

  • 아이디, 비밀번호를 입력한 후 로그인을 누르면 정보확인 후 메인 페이지로 접속
  • 회원정보가 잘못되면 아이디, 비밀번호가 올바르지 않다는 오류 팝업창
    • 추가기능 : 비밀번호 찾기나 아이디 찾기 등의 기능
    • 추가기능 : 회원가입시 이메일 인증과정(계정 활성화/비활성화 기능)
    • 당근마켓의 처음 버전은 판교장터로, 직장 메일이나 학교 메일만 가입 가능하게 추가적으로 설정해도 되고, 구글 오어스로 회사 구글계정 사용자만 로그인되게 해도 될듯

1.4) (추가기능) 토큰만료 화면

  • 로그인을 하면 로그아웃을 하거나 한 달이상의 시간이 지나기 전에는 회원정보를 들고있어 메인 url에 접속하면 다음의 페이지가 랜딩페이지가





2) 상품등록

2.1) 상품등록 페이지

  • 다음의 메인페이지에서 + 버튼을 누르면
  • 아래 사진의 새로운 판매글 작성 페이지가 나타납니다.
  • 사진을 업로드할 수 있으며, 제목, 카테고리, 가격(원), 본문을 입력받습니다.
    • 사진은 실제 모바일 앨범에서 선택하는 것이 아닌, desktop에서 jpeg, png 등 이미지 파일을 업로드하도록 작성(MultipartFile 표준 사용하면 될듯)
  • 사진의 크기가 20MB 이하의 파일만 받도록 설정
  • (추가기능) 사진의 용량을 줄여서 저장하는 기능

2.2) 카테고리 페이지

  • 카테고리를 누르면 팝업창이 떠서 다음의 카테고리 중 하나를 선택할 수 있습니다.
  • 카테고리는 아래 정도만
    • ‘디지털기기’, ‘생활가전’, ‘가구/인테리어’, ‘유아동’, ‘생활/가공식품’, ‘유아도서’, ‘스포츠/레저’, ‘여성잡화’, ‘여성의류’, ‘남성패션/잡화’, ‘게임/취미’, ‘뷰티/미용’, ‘반려동물용품’, ‘도서/티켓/음반’, ‘식물’, ‘기타 중고물품’, ‘중고차’
  • 내용을 모두 입력하면 완료 버튼이 활성화 되어 글을 입력할 수 있습니다. (사진은 업로드하지 않아도 완료 버튼이 활성화되어 글 입력이 가능)
  • 검증은 프론트, 서버에서 더블체크

2.3) 상품 상세 페이지

  • 랜딩페이지(메인페이지)에서 상품을 클릭하면 다음과 같은 상품페이지를 볼 수 있습니다.
  • 보여지는 정보는
    • 상품사진, 판매자 프로필사진, 판매자 닉네임, 게시물 제목, 게시물 가격, 게시물 카테고리, 게시물 게시시간, 본문, 관심(하트 숫자), 동일판매자가 판매중인 상품, 글 조회수
    • img, seller profile, seller nick, title, price, category, time, contents, like, seller's other goods, views
    • 조회수때문에 Redis 필요
  • 이미지는 없을수도 있음
  • 게시시간 표시
    • 표시방식 : n분전, n일전, n시간 전
    • 1시간 전에는 n분전, 하루 전에는 n시간 전, 한 달 전에는 n일전, 1년 전에는 n달 전, 1년 이후에는 n년 전으로 나타납니다.
  • 거래가 완료된 상품은 제목 앞에 ‘거래완료’라는 문구가 붙습니다.
  • 동일한 판매자의 다른 상품을 보기 위해서 이 판매자가 판매중인 다른 상품 보기 버튼이 있습니다
    • 개인적으로 이 기능을 상당히 좋아합니다. 중고물품 거래(ex 특히 게임기, 인두기, 버니어캘리퍼스 같은 물품 판매하시는 분들 보면 상당히 관심분야가 비슷하다는걸 느낍니다)
  • 해당 화면에서 ... 버튼을 클릭하면 다음과 같이 게시물 수정게시물 삭제 버튼이 표시되어야함
    • 수정 -> 수정페이지 이동, 게시글 등록과 같은 화면이 뜨지만 글을 입력할 때 입력했던 입력값이 바로 보여짐
    • 삭제 -> 확인팝업 출력 후 삭제, 클릭하면 다음과 같은 화면 한번 거쳐서 삭제

2.4) 이 판매자의 다른 판매상품

  • seller's other goods
  • (상품 상세페이지에서 접근 가능) 판매 상품의 모두보기를 클릭하면 아래의 화면이 출력됩니다
  • 댓글이나 관심(하트 수)가 0이면 해당 아이콘은 표시되지 않습니다.
  • 거래가 완료된 상품은 표시되나 거래완료라는 상태가 함께 출력됩니다
    • 여기서는 거래 완료 여부와 상관없이 노출 되어야 함
  • 이 페이지에서 하트를 누르면 관심 물품으로 등록됨





3) 마이페이지

3.1) 마이 페이지(나의 당근 페이지) 메인 (줄여서 마페메)

  • 랜딩페이지에서 나의 당근을 클릭하면 아래와 같은 페이지가 표시
  • 프로필 화면에는 사진을 넣기 전에는 위와 같은 기본프사가 보이고, 별도 사진을 등록하면 사진이 표시
  • 프로필 수정, 판매내역, 관심목록, Logout 으로 가는 기능이 존재해야함

3.2) 프로필 수정 페이지

  • 마페메 에서 프로필 수정 버튼을 누르면 아래 화면 표시
  • 이 페이지에서는 닉네임을 수정 가능
  • 프로필 사진을 업로드기능
    • 프로필 사진은 중간 부분의 1:1 비율로 업로드
    • desktop에서 이미지 파일을 업로드하는 형태로 Multipart

3.3) 판매내역 페이지

  • 마페메 에서 판매내역 버튼을 누르면 아래 화면 표시
  • 판매중인 상품 및 거래완료 상품을 확인
  • 해당 화면에서 바로 예약중으로 변경 or 거래완료로 변경하며 상태변경이 가능
  • 거래완료로 변경할 경우 해당 상품은 거래완료 탭으로 이동됨
  • 거래완료에서도 판매중이나 예약중으로 상태변경이 가능합니다.
  • 판매 상품을 클릭하면 다음과 같이 상품 상세페이지로 이동
  • 판매자인 경우에만 판매물품의 상태변화가 가능
    • 판매중, 예약중, 거래완료 status

3.4) 관심목록

  • 관심목록을 클릭하면 좋아요 누른 상품이 나타납니다.





4) 댓글기능

4.1) 댓글달기 기능

  • 상품 페이지에서 댓글 보기 및 댓글 남기기 기능을 사용할 수 있습니다.
  • 하단의 댓글 보기를 클릭하면
    • 다음과 같이 닉네임, 시간, 댓글을 볼 수 있습니다.
    • 시간은 n분 전, n시간 전, n일 전, n달 전, n년 전의 5가지 형태로 나타나며, 글을 쓴지 1시간 전에는 n분 전으로, 1일 전에는 n 시간 전으로, 1달 전에는 n일 전으로, 1년부터는 n년 전으로 표시
    • 댓글은 시간이 빠른순서로 표시
  • 자신이 쓴 댓글에는 Edit 버튼이 떠서 수정이 가능, 삭제도 가능
  • (App) ← 버튼을 누르면 무조건 이전 product page로 돌아갑니다.
  • 댓글 남기기를 클릭하면 다음과 같이 댓글을 남길 수 있습니다.

4.2) 댓글 수정 기능

  • Edit 버튼을 클릭할 경우 기존에 자신이 남겼던 글이 default 값으로 써져있으며 수정 후 작성완료를 누르면 수정됩니다.
  • 작성완료할 경우 댓글 보기 페이지로 넘어갑니다.

대댓글 기능은 여유가 되실경우 추가해주시기 바랍니다.

실제 거래는 댓글기능을 통해 판매자와 구매자가 거래 장소 및 시간을 정한 후 직거래 및 현금거래를 한다고 가정합니다. 모든 소통은 댓글을 통해서만 이루어집니다.

4.3) 댓글 삭제기능

  • 자신이 작성한 댓글만 삭제가 가능해야함
  • 글 작성자는 댓글을 작성하지 않았지만 : 댓글을 삭제할수 없다
  • 댓글이 달린 글은 삭제할 수 없다 : 사기피해 방지를 위해서
    • 이부분은 정책적인 결정 사항이라 바꿀 수 있어야함





5) 추가기능

5.1) 글 보호잠금 기능 / 사기피해예방

  • 글 보호 기능(중고거래 사기방지) : 일정 기간동안 작성자조차 글 삭제가 불가능해집니다
    • 1명이 글 보호를 누르면 3시간동안 글이 보호
    • 3명 이상이 글 보호시간이 3주간 보호
    • 5명 이상이 글 보호 요청을 눌렀을 경우 1년간 보호
    • CS 직원이 확인해주고 보호잠금 해제 가능

5.2) 유효한 이메일인지 확인 / 업자 필터

  • 회원가입 인증
    • Email 인증 : 유효한 이메일인지 확인(장물아비, 도배업자 퇴치용)
    • 지역인증 : 지역에 그 사람이 살고있는지 유효기간마다 인증하도록
      • 지역 인증이 한 달 동안만 유효

5.3) 중고매물 검색기능

  • 검색 기능
    • 검색한 값을 제목이나 본문에 포함하고 있는 상품을 보여주는건 어떨까요?
    • 어떤 상품을 상단에 노출하는지에 대한 로직 추가
      • (판매중인 상품, 좋아요순, 댓글 많은순)
    • 검색에 Filtering 기능 : 카테고리 제한 설정, 가격범위(상한필터, 하한필터, 상하한필터)

5.4) 알람 기능 (키워드, 관심상품, 내 작성글)

  • 알림기능을 추가해보는건 어떨까요?
  • 알람 아이콘은 메인 페이지의 맨 위 상단의 검색 아이콘과 카테고리 아이콘 사이에 위치
  • 키워드 알람
    • 키워드를 등록하면 알람이 발생한다
    • 키워드는 제목, 본문, 제목or본문에 걸 수 있다
  • 관심 상품 상태 변경 알람(좋아요 누른 상품)
    • 판매중 -> 예약중/판매완료 혹은 반대로 변경시 알림
  • 이외 중고나라, 당근마켓 알람 기능
    • 내 판매중 상품에 댓글, 좋아요 내가 댓글을 단 상품에 댓글이 달렸을 때
    • 네이버 카페에도 유사한 시스템이 있음
  • (의견) : 서비스가 커져서 마케팅팀이 주도하는 이벤트 또한 대비할 수 있음

5.5) 대댓글 기능

  • 댓글의 댓글, depth 2단계까지는 대부분 지원하는듯 합니다
  • 댓글의 댓글의 댓글의 .... 댓글 이렇게 무한히 가면 시스템적으로 구현은 가능할까? (물론 돈버는것과 관계는 없겠지만..)

5.6) 뱃지 기능

  • 첫 거래 완료, 10번 거래 완료, 무료 나눔 완료 등 특정 이벤트를 수행하면 관련 뱃지를 지급
  • 사용자들이 서비스에 더 애착을 갖을 수 있도록

5.7) 매너온도 기능

  • 거래가 완료되면 서로 상대방의 매너에 대해 평가
  • 따뜻한 사람이면 온도가 높아지고 비매너의 행동을 하면 온도 떨어트리기
  • 거래완료 버튼을 누르면 >> 매너온도를 선택하는 버튼 or 판매완료 페이지에서 연락 온 사람들중 실제로 거래한사람을 선택해고 매너를 평가
    • 매너온도 기능은 기능 추가보다, 이전에 필요한 기능들이 많음
    • 메너온도 기능을 위해 존재해야하는 시스템
      • 채팅기능
      • 대댓글기능

5.8) 채팅 기능 추가

  • 1:1 채팅기능이 있어서 거래약속(직거래) 혹은 택배거래를 진행할수 있도록
  • server pass 가 아니라, peer-to-peer 로 가야할듯 (WebSocket 기술을 사용해보자)
  • 가보지않은길이라 모름..
    • Web 환경에서 구현과 App 환경에서 구현에 차이가 있을지??
    • 일단 WebSocket 이 뭔지부터 알아봐야함
    • 서버의 역활은 오직 Broker (중개인 역할)

5.9) 글 끌어올림 기능

  • 글을 올리고 하루이상 지난시점부터
  • 게시글 끌어올리기 기능이 추가된다









당근마켓 데이터 모델을 분석하고 ER-D 작성하는 글

당근마켓 도메인 모델링

  • 이전에 도메인 모델링과 관련된 학습자료 몇개를 접하면서 어떻게 도메인을 모델링해야할까에 대한 생각을 조금씩 하고 있었는데요
  • 이번에 당근마켓 백엔드 클론코딩을 진행하면서, 작고 간단하고 100% 끝가지 도달하지 못할 프로젝트일지라도 의식의 흐름대로 마구잡이식 난개발을 진행하지 말고 어느정도는 Minimum Viable 는 구현할수 있는 방향으로 데이터를 모델링하기로 결심했습니다.
  • 복잡한 도메인 로직이 존재하는 당근마켓 서비를 클론코딩하기 전 Service Ownership 을 가질수 있도록 기획단계를 거쳤는데요
  • 도메인 모델링에 상당히 비중높게 글을 작성하는 이유는 좋은 소프트웨어 아키텍쳐가 중요하기 때문이고, 아키텍쳐가 제대로 나오기 위해서는 모델링이 잘 되어있어야 하기 때문입니다.
    • 그전에 기획단계에서 잘 구성되어있어야 하고, 기획도 완벽하지 않으니까 trial&error 가 필요합니다. 그래서 빠르게 도전하고 실패하는 agile process 가 필요한데, 돌고돌아 결국 협업이고 같이 일하는 사람을 얼마냐 잘 배려해주고 퍼포먼스를 낼수 있도록 협력하는게 중요한 시대~

  • 이 사진은 위에서 소개한 소프트웨어 아키텍처의 중요성 이라는 영상의 한 부분을 캡쳐한건데요, 기능이 많고 고도화될수록 아키텍쳐의 중요성이 더 커지게 된다는걸 설명한 부분입니다.
  • 사족을 달아보면 모든 구성원들과 개발자들의 동작속도가 B(O) 가 log-N 이 될수도, n^2 이 될수도 있다는건데요
  • 짧지만 회사다니는 2년동안 No-Design 의 코드를 유지보수를 하는데 대부분의 시간을 사용했고, Good-Design 으로 리팩토링이 끝나고 얼마 지나지 않아 회사가 어려워졌었던 경험이 있는데요
  • 앞으로의 커리어에서는 Good-Design Code 에서 기획과 마케팅이 정교하게 결합된 고도화된 서비스를 만들어 제 목표인 1억명이 사용하는 서비스 만들기 를 달성하고 싶습니다.

요약 : 좋은 결정은 빨리 내려지길 원한다. 소프트웨어의 가격을 고려할때 가장 높은 valuation 은 미래가치(확장성, 유지보수성, 좋은 아키텍쳐와 모델링)에 두어야만 한다!

모델링 순서

  • 도메인을 모델링하기 위해 순서를 거쳤는데
    • 1] 구현할 기능을 먼저 생각한다
    • 2] 기능에 따라 적절한 페이지의 VIEW 와 API 의 URI 를 지정한다
    • 3] 저장해야할 데이터를 기능으로부터 생각해 테이블필드변수들을 생각해낸다
    • 4] 만족스러울때까지 앞단계들을 반복한다

VIEW 와 API 의 URI 지정

VIEW Page 정리

번호설명VIEW
1회원가입??
1.1랜딩페이지??
1.2회원가입 화면/login/join
1.3로그인 화면/login
1.4(추가기능) 토큰만료 화면/login/fail
2상품관련
2.1상품등록 페이지/posts/new
2.2카테고리 페이지-
2.3상품 상세 페이지/posts/{id}
2.4이 판매자의 다른 판매상품/posts/otherSales
3마이페이지
3.1마이 페이지 메인(나의 당근 페이지)/accounts/
3.2프로필 수정 페이지/accounts/userModify
3.3판매내역 페이지/accounts/posts
3.4관심목록/accounts/favoritePost
4댓글기능
4.1댓글달기 기능-
4.2댓글수정 기능-
4.3댓글삭제 기능-
5추가기능
5.1글 보호잠금 기능 / 사기피해예방
5.2유효한 이메일인지 확인 / 업자 필터
5.3중고 매물 검색기능
5.4알람 기능 (키워드, 관심상품, 내 작성글)
5.5대댓글 기능
5.6뱃지 기능
5.7매너온도 기능
5.8채팅 기능 추가
5.9글 끌어올림 기능

전체 모델링

  • 전체 모델링은 이렇게 작성했습니다









기술설명

0) 개발환경 && 사용기술

  • IDE : IntelliJ
  • Build & Package : Gradle
  • Language : Java (JDK 11)
    • DB Access : JPA (Hibernate)
  • DB : H2 (in-memory)


1) 대용량 트래픽 고려

  • 대용량 트래픽이라는 요구사항을 듣고 서버 보틀넥 제거, 스케일 아웃 두가지가 방식이 떠올랐는데, 여기서는 RDB 에서의 보틀넥인 조회수 증가 를 해결했습니다

조회수 증가가 보틀넥인 이유

  • 상황 : 단시간에 트래픽이 몰리는 상황이라면
    • 1초에 1만번씩 특정 게시글에 get 요청이 들어오면, 조회수 단 하나의 필드값 증가를 위해 DB에 select문을 1초만에 1만번, 값이 1씩 변하는 insert 문을 DB에 보내줘야 합니다
    • DB 가 아닌 좀더 가볍고 빠른 저장소를 사용해 조회시마다 매번 insert 문을 내보내지 않고, 1초마다 한번씩만 조회수 변화를 반영하도록 제작하였습니다
      • DB Insert 횟수가 줄어들고 (RDB의 삽입동작 시간복잡도는 log-N 이기 때문에)
    • @readOnly 사용으로 트랜잭션 종료시 flush 를 사용하지 않고, 더티체킹을 위한 스냅샷 비교를 하지 않아 성능이 개선됩니다

구현하기까지의 과정

  • 처음에는 Redis를 사용해서 위 기능을 구현하려 하였으나, 구현에 실패했습니다
  • 이를 대체하기위해 collection framework 중에서 HashMap을 사용해 해당 기능을 구현하였습니다
  • Key-Value 구조를 사용해 성능 최적화하기 위한 구조는 아래 그림과 같습니다
  • 위 버퍼에서 1초동안 조회횟수를 count 하고, 1초 이후 카운트에 반영해서 아무리 많이 요청되도 조회수 증가에 의한 쿼리는 PK 별로 1초에 한번만 insert문이 나가게 됩니다
  • 이 로직을 PostViewCountService 클래스에 구현했고, PostViewCountServiceTest 클래스에서 테스트코드를 작성했습니다




2) 첨부파일 기능

  • 첨부파일 기능 구현을 위해서 아래의 구조를 생각했습니다
  • 엔티티패키지 attachFile
  • storage 저장 기능을 attachFile 패키지에서 구현하지 않은 이유는, 게시판 특성상 미래에 다른 요구사항, 예를들어 본문에 포함된 사진을 자동으로 저장하는 기능을 대비하기 위해서, 메타데이터 정보와 실제 파일을 전송하는
    두가지 계층으로 분할해서 구현했습니다.
  • 추후 클라이언트와 파일을 주고받을 다른 모듈에서도 FileService 를 사용하면 검증된 코드를 적은 작업으로 사용할수 있어 DRY 하게 구성하였습니다
  • 뿐만 아니라, 추후 저장방식을 FileSystem이 아닌 AWS S3 같은 클라우드 저장소로 이동시에도 대응할수 있도록 FileServie 를 인터페이스로 분리해두었플므로 DIP 를 준수하려고 노력했습니다.









당근마켓 분석하기 TMI

당근마켓이 중고물건을 생각하는 방식

  • 당근마켓은 중고물건 판매글을, 물품을 올리는 goods 의 관점이 아니라, 글을 올린다는 관점의 article로 접근한다

  • 여기서 포인트는
    • 당근마켓은 중고판매글을 article 로 인식한다
    • 관심, 채팅, 조회수가 표시되는데 여기서 채팅은 거래글을 중심으로 생성된다
    • 게시시간은 끌어올림 글 기준으로 계산한다

당근마켓과 중고나라의 전략차이

  • 당근마켓은 중고판매글을 article 로 인식한다. 글올리는 행위에 중점을 두고 >> 지역사람들 끼리 글을 올리고 물건을 교환한다는

당근마켓은 지역을 어떻게 다룰까?

  • 서울시는 구단위, 나머지는 시군구로 크게 나뉘고 중간중간에 Dummy Number가 끼어있다. 노가다로 직접 구해본 데이터들을 소개하면

regions_id 는 Primary-Key 로 동작하고 "동" 단위로 인식한다

regions_id지역
177노원구 중계본동
178노원구 중계1동
179노원구 중계4동
180노원구 중계2,3동
135월곡2동
1604별내동
6078방학동
  • 노원구에서 가장 가까운 서울시내 다른 구(월곡2동, 방학동), 경기도 인접(별내동) 번호는 크게 차이가 난다
  • 결론 : regions_id 는 고유키 로 동작한다

regions_id 의 숫자값에 가중치나 의미가 없다. 가까운 동네일지라도 광역시가 다르면 큰차이가 난다

regions_id지역
1351성남시 삼평동(판교)
1347성남시 야탑2동
1352성남시 백현동
4538수원시 이의동
4535수원시 매탄동
  • 당근마켓의 발상지(..?) 라고 할수 있는 판교와 그 옆 수원시를 찍어봤는데 regions_id 숫자에 큰 차이가 있었다. PK 의 Ordinal에 의미가 있지는 않은듯

regions_id 의 자릿수에도 의미가 없다

regions_id지역
1서울시 (더미)
11중구 1234가동
111중랑구 중랑동
1111대전광역시 동구
2중구 (더미)
22중구 회현동
222마포구 아현동
  • 1,11,111,1111 사이의 지역들간 아무런 연관이 없다
  • 2,22,222 도 마찬가지

연속된 숫자로 시/군/구 를 구분하며 중간중간에 더미PK가 끼여있다

regions_id지역
1서울특별시 (더미)
2중구 (더미)
3중구 청운효자동
22중구 회현동
22 ~ 33중구 @@동
34중구 황학동
35중구 중림동
36용산구 (더미)
37용산구 후암동
38~51용산구 @@동
52용산구 보광동
53서울 성동구 (더미)
54서울 성동구 왕십리제2동
  • 35,36,37번을 보면 중구 >> 용산구로 넘어가는데 중간에 35번 용산구더미가 끼여있다.
  • 중간중간에 사용하지않는 지역을 끼워놓는 이유는 혹시나 모를 행정구 분할등을 대비함이 위함이 아닐까?!
    • 아니라면.. 왜 더미들이 끼여있는지는 잘 모르겠다. 뭐 물론 RDB 상에 저런 레코드 한두줄 더 끼여있는다고해서 큰 영향이 있을꺼같진 않다. 대충 계산해봐도 레코드가 0.3% 정도 늘어나는데 불과하므로

번외 : 두 지점 사이의 거리(근처인지 아닌지 판별하기 위해)

  • 성남시와 수원시는 인접시인데, 성남시 백현동과(1347) 수원시 이의동(4538)사이의 Ordinal 차이는 크다.
  • 물리적인 두 지점 사이의 거리를 구하는 방법은 추측하건데 지도 API 로 기준점 좌표를 받아 >> 두점사이의 거리를 구하는 방식이 가장 쉽고 편하게 구할듯 하다..
    • 어차피 두 지점 사이의 거리는 변하지 않으니 Matrix 형식으로 요청해놓고 caching 해서 사용하면 될듯?
  • 당근마켓은 카카오맵 API를 사용하니 "길이재기" 기능을 사용하면 반경 X Km 까지 가능! 이런식의 서비스가 가능할꺼같다
profile
백엔드 개발자 입니다

0개의 댓글