개발 프로젝트/Zerobase 개인프로젝트 기록

제로베이스 개인프로젝트 진행록1 - 개발기획/리뷰 (1)

bsh6226 2024. 9. 11. 09:31

프로젝트 제작 목표와 방향성 Brainstorming

 

1. 나의 목표/관심사

1.1 프로젝트 기술적 목표

 

(1) 멀티스레드 프로그래밍 실습

(2) 데이터베이스 설계 및 index 설정 실습

(3) 대용량 데이터를 다루는 데이터셋 활용할 것

(4) 최적화 알고리즘 사용 - 다익스트라, A알고리즘, Traveling salesman problem, 냅색

(5) Grinder로 성능테스트

(6) Mock, Junit으로 단위테스트 

(7) 캐쉬로 I/O 자원 최적화

(8) 외부서버로의 배포

(9) AI 적극활용 - 기획단계, 단위테스트 코드 등 반복작업에 대해서 초안 작성요청

 

1.2 프로젝트 도메인 관심사

내가 주제자체를 좋아하는 것

  • 외국어 학습, 외국어 사용, 외국인과 교류
  • 해외여행 관련 
  • 경제/경영 비즈니스 애널리스트 데이터처리 최적화
    • 애널리스트 리포트를 자주 보면서 공부했고 좋아했음
  • 과학 데이터 연구

내가 로직 자체를 좋아하는것

  • 경제/경영 비즈니스 오퍼레이션 최적화
    • 3년간 비즈니스 쪽으로 몸담았고 이를 최적화하는 데에 관심이 많았음. 
  •  동선 및 물류 최적화
    • 자율주행이라던지, 배달의 동선을 '최적화'하는 알고리즘을 짜는 것

 

프로젝트 주제 후보군 선정

 

GPT를 활용해서 최적화와 관련된 프로젝트 주제들을 추천 받았고 이는 아래와 같았다.

 

- 개인화 추천 시스템 : 딥러닝 모델(CF with deep learning), 강화학습을 활용한 추천 알고리즘.

- 검색엔진 관련 기술: TF-IDF, BM25, Elasticsearch, 자연어 처리(NLP) 기술을 포함한 다양한 검색 알고리즘

-  경로최적화 : 물류동선최적화(배달의민족,쿠팡) 관련 기술: Dijkstra, A*, 그리디 알고리즘, 네트워크 흐름 최적화 등이 사용됩니다

 

'탐색'이라는 키워드가 마음에 들었고 지도와 동선 최적화 관련된 프로그램을 만들어야겠다는 생각을 하였다. 그리고 내가 평소에 취미였던 문화유산 관련된 지도가 좋을것 같다고 생각하였고 아래와 같이 공공API를 찾아 내었다.

 

data source : 국가유산정보 API

- https://www.cha.go.kr/html/HtmlPage.do?pg=/publicinfo/pbinfo3_0201.jsp&mn=NS_04_04_02

 

프로젝트 기능 구상

우선 국가유산지도라는 큰 제목으로 생각나는 필요기능과 기술들을 마인드맵 형식으로 뻗어나가 보았다.

아래 내용을 체계적을 문서화하여 정리해보자. 

 

 

프로젝트 아이디어 제출본

1. 주제 : 국가문화유산 지도앱

- 국가문화유산 API 데이터를 기반으로  문화유산의 '지도상위치', '문화유산검색', '답사경로추천', '방문이력'을 관리하는 지도앱을 만들고자 합니다.

 

2. 주제선택배경

2.1 기술적고려 : Optimization이란 주제에 관심이 있어서 단순히 캐싱/스레드처럼 컴퓨팅 Resource Optimization 외에도 로직 차원에서 Optimization에 관한 프로그래밍(다익스트라,TSP 등)을 경험해보고 싶었습니다. 

2.2 주제적고려 : 평소 역사와 여행을 좋아하여 탐험적 요소가 있는 지도앱을 만들어 보면 어떨까 하여 선택하였습니다.

 

3. 기능

[데이터 초기화]

- 국가문화유산 API로부터 데이터 호출 후 데이터 가공하여 DB저장

https://www.khs.go.kr/cha/SearchKindOpenapiDt.do?ccbaKdcd=11&ccbaAsno=00030000&ccbaCtcd=11

-  {외부API : 구글, 카카오, 네이버 길찾기} 외부의 API를 통해 국내지도정보를 불러온다.

 

[회원정보]

- 기본 회원정보, 권한부여 (input : 아이디, 비밀번호, 이름, 권한; admin,user)

-  위치기반으로 문화유산 방문여부를 확인하고 회원별로 이를 저장한다. (input : 사용자위치, 문화재ID, 사용자ID)

 

[문화유산검색]

- 사용자 위치기반으로 일정 거리 내 주변 문화유산 검색 // (Input : 사용자위치)

 

[답사경로탐색] 

- [문화유산검색] 기능으로 1차적으로 필터링된 문화유산위치들을 'Node'로 설정하고, 또다른 'Node'인 출발지 '사용자위치'로부터 '사용자가능시간' 내에서 탐색 가능한 Node 들을 선정하여 여러 종류의 답사를 구성한다. 여러 종류의 답사 중 최적화된 순서로 답사를 추천하며 , 최적화 판단 기준은 답사 내 방문한 문화유산의 중요도점수(국보급, 보물급 등)*문화재개수/총소요시간(관람시간+현위치출발 ~ Node들 탐색 ~ 현위치복귀까지의 이동시간)으로 임시 정한다. // (Input : 사용자위치, 사용가능시간)

- 'Node' 간의 Edge 정의시 외부 API를 통해 경로와 시간을 확인하며 3개의 외부 API 중 최단시간을 제시하는 API의 데이터를 사용하여 계산한다. {외부API : 구글, 카카오, 네이버 길찾기} 

 

[지도표시]

- 지도를 사각형 구획으로 나누어 사각형 구획별로 존재하는 문화유산을 분류하여 데이터로 관리한다.

- 지도상에 로그인한 회원이 방문한 문화유산을 표기한다. // (Input : 문화유산ID)

- 회원이 방문한 문화유산이 없는 지역은 Black으로 가린다. 문화유산을 방문한 곳의 사각형 구획은 UnBlack하여 지도로 표기한다.

- 문화유산이 방문으로 처리될때, Black으로 가려진 문화유산 소속구역 지도를 UnBlack하도록 refresh한다.

 

3. 추가기능 

[문화유산검색]

-  한국어 검색하여 문화재 이름을 자동완성하고 단순조회 // (Input : 검색어)

-  한국어 검색하여 검색어와 '문화재이름'과 '문화재설명'의 관련성 순서대로 정렬 // (Input : 검색어)

 

[도슨트 기능] 

- 간단한 GPT  프롬프트 엔지니어링으로 튜닝하여 주제별 도슨트 출력준비

A. 공통프롬프트 : 유적지 도슨트처럼 설명, B.세부프롬프트 1. 예술적관점으로 설명 2. 역사적관점으로 설명 

- 방문한 문화유산에 대해서 도슨트 내용을 OpenAI API를 통해 생성, 호출하며 이때, 1. 예술적관점설명 2. 역사적관점설명으로 컨텐츠 생성관점을 선택할 수 있다.

 

4. 한계 및 우려사항

4.1 경험/지식 부재로 인한 우려  :

A. 해당 프로젝트를 구상하면서, 필요한 기술에 대한 정보가 있는 것이 아니라서 간단한 검색을 통해서 방법이 존재한다라는 것만 확인해보고 하면서 배우자는 생각으로 기획해본 것입니다. 때문에 과연 제가 가진 자원(1달의 기간, 1인 프로젝트, 부족한 배경지식)으로 구현하는 것이 현실성이 있는가 라는 의문이 듭니다. 너무 비현실적으로 기획한 것이 아닌가 싶은 생각도 들어 조언을 좀 듣고싶습니다. 

 

<배우면서 할필요가 있는 내용들>

- [위치표시기능] : Geolocation이라는 별도의 데이터구조가 있다는 정도만 알고 있습니다.

- [답사경로탐색기능] : 다익스트라,TSP 알고리즘 등등이 사용된다는 정도만 알고 있습니다. 그래프이론, DFS,BFS는 알지만 다익스트라, TSP 등은 잘모르는 상태입니다. 

- [지도표시] : 지도를 구획화하도록 하는 기술이 존재한다는 정도만 알고있습니다.

- [도슨트 기능] : fine-tuning을 위한 프롬프트 엔지니어링에 대해서 존재한다는 정도만 알고 있습니다. 배우기가 크게 어렵지는 않다고 들었습니다.

 

4.2 어플리케이션의 현실성 

  현실성이 있는 어플리케이션을 만들고 싶으나, 배경지식이 부족하다보니 본 기획이 기술적 구현성이 있는 기획인지 의문이듭니다. 물론 이부분은 제가 공부해나가면서 시행착오를 해야할 부분이나 알고계신부분이 있으면 시행착오를 줄일 수 있지 않을까 하는 점에서 조언을 구해봅니다.

 

A. 기술적 구현가능성?

- 지도정보를 외부 API로 불러올 것인데 이것을 구획화하여 내부 DB에 저장가능한 형태로 데이터 처리하는게 가능한지?

 

B. 과도한 외부 API의존성?

- 다수의 Node 간의 edge 경로를 탐색하면 시간복잡도가 O(V^2)일거고 edge의 수만큼 외부 API 호출을 하면 상당한 Latency가 발생할텐데 원래 이정도 수준으로 외부 API에 의존하는게 일반적인 것인지?

 

C. 개발방법?

구현방법을 모르는 기능들이 많다보니 우선, 기능적으로 프로토타입을 구현해보고 이를 통해 CRUD 패턴을 파악이 필요할 것같습니다. 그리고 이후 이에 맞추어 데이터베이스 모델링 작업이 필요할 것같은데 이 방향이 맞는것인지?

 

프로젝트 리뷰 및 배운점

 

멘토리뷰

 

나의회신

 

안녕하세요 밍밍멘토님 피드백 주신부분에 대해서 답변드립니다. 아래의 답변드린 내용을 바탕으로 기획서 수정해서 재업로드 및 피드백 요청드릴수 있도록 하겠습니다.


1) 현실성 관련하여, 현재 제가 판단하기로는 기능이 너무 많고 새롭게 배우셔야할 부분도 상당수인것으로 보여집니다. 지금까지 제가 1기부터 여러명의 수강생분들과 스터디를 진행해왔는데요, 그중에서 가장 잘하신 분을 기준으로 판단하여도 기능이 너무 많고 새롭게 배우셔야할 것들이 많아요. 전체적으로 기능을 줄여주시면 좋을 것 같습니다.

 

-> 네 욕심이 조금 과했던 것 같습니다. 리뷰해주신 내용을 보고 기획서를 다시보니 기획내용이 간결하지 못한것 같네요. 부가기능을 줄이고 로직을 간결화화하겠습니다. 그리고 부가기능들을 구현을 하지는 않되 해당 기능의 확장성을 염두에두고 데이터 구조나 프로그래밍 구조를 유연화 할 수 있는 방향을 설계방향성으로 잡고 다시 고민해보도록 하겠습니다. 

 

2)또한 기술적 구현가능성에 대해서, 구획화라는 부분을 제가 잘 이해를 못했습니다. 사각형이 어떤식으로 작성이 되는걸까요?

-> 제가 해당 지식이 부족해서 두루뭉실한 용어를 쓴 부분이 있는 것 같네요. Grid로 만든다는 게 좀 더 정확하게 표현될것같습니다. 제가 생각했던 내용은 아래 링크처럼 맵을 영역으로 쪼개는 기술을 지칭하는 것이었습니다.

https://chang12.github.io/python-map-grid/


3) 외부 API 의존성은 상관없습니다. 직접 구현하실 수 있는 부분들이 아니니 이런 부분들은 외부 API를 사용하는 것이 맞습니다. 시간 복잡도도 고려하실 이유가 없으실 것 같아요.

-> 알겠습니다. 반영하겠습니다.

 

4) 개발 방법에 대해서는, 만약 먼저 프로토타입을 개발하신다면 해당 코드에 대해서는 제가 피드백을 드리기가 어렵습니다. 따라서 프로토타입을 베이스로 개발을 하신다면 프로토타입 개발때 작성하셨던 코드를 제가 알기가 어려우니 이를 베이스로 한 개발 또한 자세한 리뷰드리기가 어려울 것 같아요. 가능하면 노션의 스터디 방식을 기준으로 진행해주셨으면 하네요.

-> 알겠습니다. 반영하겠습니다.

 

 

5) 작성해주신 주제에 대해서는, 데이터 초기화에 대해서 언제 어떤식으로 진행하실것인지(매일? 초기에 한번?) 어떤 데이터를 저장할 것인지.

-> 프로그램 실행시 최초1회 예정입니다. 문서상에 보충하겟습니다. 

 

6) 외부 API중 길찾기는 어떤 API를 사용하실 것인지

-> 처음 구상에는 3가지 API를 모두 호출하고 각 API 간의 소요시간을 비교해서 최단 소요시간을 제시하는 API를 데이터로 사용해서 진행하려고 하였습니다. 최적화라는 주제를 위해서, 일부러 복잡한 상황을 만들려고 했던 의도인데 좀 난잡하고 정리가 안되는 느낌이 있는 것같네요. 해당 비교기능은 제외하고, GoogleAPI로 정해서 한가지만 사용하도록 하겠으며, 대신 다른 API까지 확장성을 고려해서 Interface로 처리해서 Service 계층으로 넘기는 방식으로 하겠습니다.  문서상에 보충하겟습니다. 


7) 문화 유산 검색은 내부에저장후 사용하실 것인지, 사용자가 검색시마다 외부 API를 호출할 것인지

-> 데이터 초기화시에 DB에 저장한 후 내부호출 예정입니다. 문서상에 보충하겟습니다. 


8) 방문 여부는 어떤식으로 방문했다는 것을 알수 있는 것인지

->  방문여부는 사용자가 유물을 방문처리 request를 하도록 하는 기능을 추가할 것이며, 방문자 위치가 100m이내인지 검증하는 로직을 추가할 예정입니다. 문서상에 보충하겟습니다. 


9) 전체적인 서비스 사용 flow가 자세히 기재되지 않은 것 같아요. 

-> 문서상에 보충하겠습니다.


10 ) 또한 회원이 방문한 문화유산이 없는 지역은 Black으로 가린다고 하셨는데 view도 개발하실 계획이신가요?필요하신 부분은 추가적인 답변 및 보충하셔서 다시한번 기재해주시면 좋을 것 같습니다.
-> view는 개발하지 않고, 각 회원별로 DB상에 방문한 1. Grid 정보를 저장하거나 2. DB상에 방문한 유적을 저장하고 이를 Grid데이터로 변환하거나 하려고 의도하였습니다. 해당 기능을 제외할지 유지할지 조금 고민해보고 문서상에 보충하겠습니다.

 

리뷰를 배울점

1. 프로그램의 핵심로직은 명료하고 단순해야한다.

2. 향후 확장성(편의성과 디테일) 고려하고 싶다면 이를 반영하여 최처 설계시 확장에 유연한 구조로 녹여낼 필요가 있다.

3. 계획은 항상 현실적이고 최소한의 기준으로 진행해야 실현가능성이 있다. 실현불가능한 계획은 의미가 없다.

4. 기획단계에서 logic흐름을 구체화하여야 정확한 설계가 가능하다

 

후속진행

https://bsh6226.tistory.com/138

 

제로베이스 개인프로젝트 진행록 - 개발기획/리뷰 (2)

지난 피드백과 회신안녕하세요 밍밍멘토님 피드백 주신부분에 대해서 답변드립니다. 아래의 답변드린 내용을 바탕으로 기획서 수정해서 재업로드 및 피드백 요청드릴수 있도록 하겠습니다.1)

bsh6226.tistory.com