no image
코테코 만들기(1)
코테코는 코딩 테스트 코치의 줄임말이다. 왜 만들게 되었나 최근 코딩 테스트 공부를 다시 시작했다. 몇 번을 포기한지 모르겠지만 그래도 다시 시작했다. 프로그래머스 사이트를 이용하고 있고 내가 푼 문제를 ChatGPT한테 물어보는 방향으로 진행하고 있었다. 내가 풀면서도 정답이 맞긴 하지만 코드가 지저분하고 참 이상하게 풀었다 싶은 것들이 많았다. 프로그래머스의 다른 사람의 풀이 보기 서비스가 있어서 이용해 봤지만 다른 사람들의 답안을 보려고 해도 페이지를 여러 번 옮겨야 하거나, 설명이 다소 불충분한 경우가 많았다. ChatGPT를 이용하면서도 내가 푼 문제의 해설, 팁, 다른 풀이 방법을 한눈에 모아서 보고 싶다는 생각이 들었고, 코딩 테스트 코치라는 서비스를 바이브 코딩으로 만들어보기로 했다.사용..
2025.10.29
no image
구글 Sheets 입력 도우미 만들기
사내에서 매 주마다 Google Sheets에 주간 보고를 하고있다. 보고서를 작성하지 않는 상황이 빈번하여 왜 그런가 생각해봤다. 필드 엔지니어의 특성 상 고객사로 출근하는 경우가 많고 퇴근 후에는 일이 손에 잡히지 않을 것이다. 근무 중에 모바일로 작성하면 될 것 같지만 개인적으로 아이폰이라 그런지 모바일 환경에서는 줄 칸 바꾸기, 이동하기 등 작성하기가 너무 어려웠다. 구글 폼 입력처럼 텍스트를 제출하면 Google Sheets로 입력되는 간단한 서비스를 만들어보기로 했다. Google Sheets API 사용하기 위해 먼저 GCP에 접속해서 프로젝트를 생성하고 Google Sheets API 서비스를 사용 신청하자 생성된 프로젝트로 들어와서 API 및 서비스 항목으로 이동하여 API를 사용하..
2025.09.07
no image
버스 남은 자리 통계 서비스 만들기 (5)
이번 글에서는 Kafka에서 데이터를 읽은 뒤 JSON 파일로 저장하던 Java 코드를 Elastic Search에 저장하도록 수정하자 지난 글에서는 Spring data elasticsearch 패키지 core 의존성을 찾을 수 없는 문제로 임시로 JSON 파일로 저장하도록 했다. Cursor에게 계속해서 물어보고 수정하고 반복한 결과 데이터 전송 프로세스는 아래와 같다. 1.ElasticsearchOperations 주입Spring Data ES 의 핵심 인터페이스로 ES와의 상호작용을 처리한다.2. Kafka Listener을 통한 메세지 수신listen 메서드로 topic에서 메세지를 수신한다.3. 데이터 처리 및 문서 생성정류장 이름 추가, 정류장 경유 여부 등 데이터를 가공하고 타임 스탬프,..
2025.08.31
no image
버스 남은 자리 통계 서비스 만들기 (4)
이전 글에서는 공공버스 API를 호출하여 얻은 데이터를 Kafka 토픽에 전송하는 Java 모듈을 만들었다. 이번 글에서는 Kafka에서 데이터를 가져온 뒤 미정차 정류소 여부 필드 추가, 타임 스탬프 추가 등 간단한 데이터 가공을 한 뒤 Elastic Search에 저장하는 Java 모듈을 만들어보자 위 내용을 정리해서 Cursor에게 요청을 하면 프로젝트 의존성 파일부터 코드까지 뚝딱 만들어준다. 카프카 컨슈머 관련 설정을 하는 파일이다. 지금은 로컬 테스트로 IP는 localhost, 추후에 AWS에 Kafka를 올리면 수정해야한다. 컨슈머 그룹은 싱글 구성이기에 아직은 건드릴 필요가 없을 것 같고 auto offset reset 옵션은 컨슈머가 초기 오프셋 정보를 찾을 수 없을 때 사용하는 옵션..
2025.08.30
no image
버스 남은 자리 통계 서비스 만들기 (3)
Cursor로 경기도 버스 API에서 데이터를 조회하고 Kafka에 전송하는 Java 모듈을 만들어보자 먼저 공공데이터 포탈에서 버스 정보를 얻기 위해 필요한 API를 신청해서 인증키를 받는다. 이후에 Cursor에게 내가 만들고 싶은 모듈의 설명을 적는다. 내 모듈의 주요 역할은 크게 2가지로 나눌 수 있다. 1. 경기도 버스 API 3분 마다 호출, JSON 데이터 형식으로 파싱한다.2. 데이터 원본 그대로 Kafka `bus-location-events` 토픽에 프로듀싱한다. 그렇게 프로젝트 의존성 파일부터 시작해서 코드까지 뚝딱 결과물을 만들어준다. 만들어준 코드의 주요 부분을 살펴보자. 경기도 버스 API 요청 주소와 M5438번 버스를 의미하는 노선 ID(routeId), 데이터를 프로듀싱..
2025.08.29
no image
버스 남은 자리 통계 서비스 만들기 (2)
유튜브 딩코딩코님의 영상을 보고 Lovable을 알게되었다. 나도 따라하기로했다. 만들고 싶은 서비스의 아이디어를 이 친구에게 말하면 내가 요청한 내용을 기반으로 코드를 짜준다. 내가 만들 서비스는 주로 모바일 환경에서 사용할 예정이고 간단한 정보(시간, 정류장) 입력 화면이 필요했다. 그렇게 구구절절 원하는 내용을 입력하면 잠시 후에 아래와 같이 완성된 UI와 함께 어떤 작업을 했는지 설명해준다. 나는 트라이얼 계정으로 하루에 나눌 수 있는 대화의 기회가 적다보니 한 대화마다 간절하게 고봉밥으로 가득 담아 요청을 보냈다. 완성된 결과물은 아래와 같다. 아직은 백엔드 API가 개발되지 않은 상태이기에 디자인은 이렇게 임시로 정한 다음 API 명세가 확정되면디자인, 사용자 경험, API 호출 ..
2025.08.29
no image
버스 남은 자리 통계 서비스 만들기 (1)
나는 경기도 평택에서 서울 강남으로 출퇴근 하는 직장인이다. 우리 집 앞을 지나가는 광역 버스인 M5438에 탑승해서 편하게 1시간 30분이면 회사에 도착할 수 있다. 하지만 강남에서 평택까지 가는 버스가 유일하다보니 출퇴근 시간대에는 자리가 없어 타고싶어도 탈 수 없는 상황이 나온다. 과거의 버스 남은 좌석 기록을 볼 수 있다면 위와 같이 버스를 하염없이 기다리는 상황을 미리 피할 수 있을 것 같아서 서비스를 만들어보기로 했다. 시간이 흐르고 지난 2025년 05월 카카오 맵에서 버스 예상 시간표 기능이 업데이트 되었다. 이 기능을 쓰면 해결된다. 글을 마치겠다. 첫 출근 때 버스를 놓치고 아이디어를 구상을 해왔지만 카카오 맵에서 너무 고맙게 서비스를 출시했다. 이미 좋은 기능이 있지만 그래..
2025.08.29
no image
제조업 전산실 퇴사 후기
`저의 경험은 반도체 전산실 제조업이라는 직무를 떠나서 회사회, 사바사 근무 경험일 수 있습니다.재직 기간이 길지 않으므로 아직 회사에 대해 잘 모르는 상태에서 쓰는 글입니다. 감안하고 봐주시면 감사드리겠습니다.' 1. 업무 내용 및 노동 강도 - 프린터 유지보수, 랜선 제작/수리, 마우스 및 키보드 관리, 방진복 입고 공장 노후 PC 정기점검, 인터넷 통신료 납부 관리, 소프트웨어 라이센스 정리 (IT 총무) - 5 - 6 년차 선임이 아직도 막내가 할 법한 일을 하고있었다. 내가 5년 뒤에도 이 일을 하겠구나 느꼈다. 2. 직장의 분위기 보수적- 매우 폐쇄적이다. 다른 부서에 비해 전산팀은 지원 부서이고 소수 운영이기 때문 3. 급여 및 복지 - 주 45시간, 9시 출근이지만 8시 20분까지 출근 ..
2025.05.03
no image
Elasticsearch 시작하기 (2)
이번에는 Elasticsearch Mapping에 대해 알아보자 먼저 classes라는 인덱스를 생성해주자curl -XPUT 'http://localhost:9200/classes'생성 이후 GET 메서드로 조회를 해보면 아래와 같이 'mappings' 필드가 비어있는 것을 볼 수 있다. Mapping은 데이터베이스의 스키마와 같다. 직접 매핑을 설정해주지 않아도 Elasticsearch에 저장하는 것은 무리가 없지만 추후에 Kibana를 활용해 데이터를 시각화 할 때 날짜를 문자로 인식할 수 있는 에러를 방지하기 위해 Mapping은 필수다. Mapping 정보는 아래와 같고 미리 mapping.json 파일에 저장해두자{ "properties": { "title": { "type": ..
2025.01.30

코테코 만들기(1)

균민이
|2025. 10. 29. 10:06

코테코는 코딩 테스트 코치의 줄임말이다.

 

 

왜 만들게 되었나

 

최근 코딩 테스트 공부를 다시 시작했다. 몇 번을 포기한지 모르겠지만 그래도 다시 시작했다. 프로그래머스 사이트를 이용하고 있고 내가 푼 문제를 ChatGPT한테 물어보는 방향으로 진행하고 있었다.

 

내가 풀면서도 정답이 맞긴 하지만 코드가 지저분하고 참 이상하게 풀었다 싶은 것들이 많았다. 프로그래머스의 다른 사람의 풀이 보기 서비스가 있어서 이용해 봤지만 다른 사람들의 답안을 보려고 해도 페이지를 여러 번 옮겨야 하거나, 설명이 다소 불충분한 경우가 많았다.

프로그래머스 다른 사람의 풀이

 

ChatGPT를 이용하면서도 내가 푼 문제의 해설, 팁, 다른 풀이 방법을 한눈에 모아서 보고 싶다는 생각이 들었고, 코딩 테스트 코치라는 서비스를 바이브 코딩으로 만들어보기로 했다.



사용 툴

Lovable, Cursor, OpenAI API, OAuth2, GoogleCloudPlatform

TypeScript, Java Spring, Postgres 를 사용했다.

 

현재 진행 상황

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 

현재까지의 결과물 시연 영상이다. 아직 수정해야 할 것들이 많다.

어느 정도 완성이 되면 클라우드에 올려서 모니터링, iac, k8s, ci/cd 요소까지 더해서 운영을 해보려고 한다.

다음 포스팅에서는 해당 서비스를 클라우드에 올리는 글을 쓰려고 한다.

사내에서 매 주마다 Google Sheets에 주간 보고를 하고있다. 보고서를 작성하지 않는 상황이 빈번하여 왜 그런가 생각해봤다. 

필드 엔지니어의 특성 상 고객사로 출근하는 경우가 많고 퇴근 후에는 일이 손에 잡히지 않을 것이다.

 

근무 중에 모바일로 작성하면 될 것 같지만 개인적으로 아이폰이라 그런지 모바일 환경에서는 줄 칸 바꾸기, 이동하기 등 작성하기가 너무 어려웠다. 글 폼 입력처럼 텍스트를 제출하면 Google Sheets로 입력되는 간단한 서비스를 만들어보기로 했다.

 

구글 폼 입력 예시

 

Google Sheets API 사용하기 위해 먼저 GCP에 접속해서 프로젝트를 생성하고 Google Sheets API 서비스를 사용 신청하자

 

Google API 설정

 

 

생성된 프로젝트로 들어와서 API 및 서비스 항목으로 이동하여 API를 사용하기 위한 API키를 발급받고

Sheets API의 쓰기 기능을 사용하려면 Google 계정이 필요하므로 Oauth 클라이언트 ID도 만들어놓자

 

Google API 설정

 

 

HTML, CSS, JS는 잘 다루지 못한다. 그래서 Cursor에게 의뢰했다. index.html을 만들어줬고 해당 파일에 css, js 문법을 통째로 넣어서 node.js 기반 2000라인의 싱글 프로그램으로 만들어줬다. 수정의 수정을 반복하면서 나온 UI는 아래와 같다.

 

 

UI 완성 화면

 

 

목록 조회 버튼을 누르면 Google Sheets API를 통해 해당 시트의 정보를 읽어온 다음 매니저 이름과 사이트 이름을 드랍다운 형태로 보여준다. 보고서 제출 버튼을 누르면 보고서 작성 아래 텍스트 박스에 쓰여진 내용들을 API를 호출하여 Sheets에 입력한다.

 

해당 프로그램은 Docker Image로 빌드하여 도커 허브에 저장한 다음 사내에서 사용하는 Xen 가상 서버에서 구동했고 로컬에서 실행된 프로그램을 외부로 노출해주는 ngrok 서비스를 이용했다.

 

ngrok 서비스

 

ngrok에서 제공한 도메인을 통해 사용자가 접근하는 상황을 간단한 구성도를 그려보면 아래 그림과 같다. 

구성도

Google Sheets API에서 쓰기 기능을 호출하려면 Google 계정 로그인이 필요하다. 해당 과정에서 리다이렉션이 일어나므로 위에서 만들었던 Oauth Client 설정에서 ngrok에서 제공해준 도메인을 "승인된 JavaScript 원본, 승인된 리디렉션 URI"에 등록하면 잘 동작한다.

 

 

후기

 

1. html에서 바로 API를 호출하므로 API키가 노출될 수 밖에 없었다. 최선으로는 API키의 호출 범위, 서비스 범위를 축소하는 방법으로 해결했다.

 

2. 원본 Sheets에 테스트를 할 수 없었기에 Sheets ID를 환경 변수로 선언하여 컨테이너를 올릴 때 환경변수를 주어 prod, dev 환경을 구분하여 진행하였다.

 

3. 도커에 올려서 진행하다보니 코드 수정으로 인한 CI/CD 구성이 필요했다. Git Action을 사용하여 Repository에 Commit이 Push될 경우 Docker Hub Repository에 Push되도록 파이프라인을 구성했다.

 

 

이번 글에서는 Kafka에서 데이터를 읽은 뒤 JSON 파일로 저장하던  Java 코드를 Elastic Search에 저장하도록 수정하자

 

지난 글에서는 Spring data elasticsearch 패키지 core 의존성을 찾을 수 없는 문제로 임시로 JSON 파일로 저장하도록 했다.

 

Cursor에게 계속해서 물어보고 수정하고 반복한 결과 데이터 전송 프로세스는 아래와 같다.

 

1.ElasticsearchOperations 주입
Spring Data ES 의 핵심 인터페이스로 ES와의 상호작용을 처리한다.

2. Kafka Listener을 통한 메세지 수신
listen 메서드로 topic에서 메세지를 수신한다.

3. 데이터 처리 및 문서 생성
정류장 이름 추가, 정류장 경유 여부 등 데이터를 가공하고 타임 스탬프, 고유 ID를 추가하여 ES에 저장하기 위한
문서 형식으로 새로 생성한다.

4. ES로 데이터 전송
IndexQueryBuilder() 메서드를 통해 현재 날짜 기반으로 인덱스를 생성하고 ElasticsearchOperations을 통해
문서를 ES에 저장한다.

 

ES에 잘 저장 되는지 로컬에서 Docker 컨테이너로 ES를 띄워서 테스트해보자

 

컨테이너를 생성할 때 인증서를 사용하지 않는 HTTP 요청으로 진행하기 위해 아래와 같이 환경변수 옵션을 줘서 실행한다.

  

 

위와 같이 Elastic Search Image로 컨테이너를 실행하고 자바 모듈을 실행한 후 ES 인덱스 조회 curl을 날려보면 인덱스 count가 증가한 것을 볼 수 있다.

 

curl -X GET "http://localhost:9200/_cat/indices/bus-location-2025-08-31?v"
curl -X GET "http://localhost:9200/bus-location-2025-08-31/_search?pretty"

 

현재는 로컬 테스트로 ssl 인증서 없이 통신을 진행했지만 처음 Java -> ES 연결을 시도할 때 인증서 관련 에러를 마주했다.

 

서비스에 사용되는 모듈은 모두 AWS VPC private subnet 환경에서 실행할 계획이여서 https 통신이 필요한지는 잘 모르겠다.

서버 간 통신에 대해 인증서 관련 정보를 찾아볼 필요가 있다.

 

 

이전 글에서는 공공버스 API를 호출하여 얻은 데이터를 Kafka 토픽에 전송하는 Java 모듈을 만들었다.

 

이번 글에서는 Kafka에서 데이터를 가져온 뒤 미정차 정류소 여부 필드 추가, 타임 스탬프 추가 등 간단한 데이터 가공을 한 뒤 Elastic Search에 저장하는 Java 모듈을 만들어보자

 

위 내용을 정리해서 Cursor에게 요청을 하면 프로젝트 의존성 파일부터 코드까지 뚝딱 만들어준다.

 

 

카프카 컨슈머 관련 설정을 하는 파일이다. 지금은 로컬 테스트로 IP는 localhost, 추후에 AWS에 Kafka를 올리면 수정해야한다.

 

컨슈머 그룹은 싱글 구성이기에 아직은 건드릴 필요가 없을 것 같고

 

auto offset reset 옵션은 컨슈머가 초기 오프셋 정보를 찾을 수 없을 때 사용하는 옵션이다.

earliest : 가장 오래된 레코드 메세지 부터

latest : 가장 최근 레코드 메세지 부터

none : 이전 오프셋 정보를 찾을 수 없으면 예외 발생

 

해당 API를 호출하고 데이터를 처리하는 작업은 비실시간성 작업이고 버스 시간의 정보가 중복 처리되어도 문제는 없긴 하다.

 

데이터의 유실을 최소화 하기위해서는 earliest도 고려해볼만 하지만 편리한 기본값인 latest를 사용하자

 

다음은 데이터 가공 부분이다.

 

카프카에 저장된 데이터는 아래 ## 버스 운행 정보이다. 정류소 ID(stationId)는 있지만 정류소 이름은 나와있지 않다.

 

따라서 ## 버스 정류장 정보 파일을 기반으로 카프카 데이터와 알맞게 매핑해서 필드를 추가하도록 하였다.

 

그리고 고속도로를 이용하는 버스인 만큼 미정차, 경유하는 정류장이 있다.

 

미정차, 경유 정류소인지를 판별하기 위해 isStop 필드를 추가하여 기본 값은 true으로 설정하고 stationName에 "(경유)"가 포함된 경우 false를 저장한다.

## 버스 정류장 정보

"centerYn": "N",
"districtCd": 2,
"mobileNo": " 48880",
"regionName": "평택",
"stationId": 214002018,
"stationName": "평택지제역",
"x": 127.0708833,
"y": 37.0186167,
"adminName": "경기도 평택시",
"stationSeq": 1,
"turnSeq": 29,
"turnYn": "N"
},
{
"centerYn": "N",
"districtCd": 2,
"regionName": "평택",
"stationId": 277102278,
"stationName": "송탄교차로(경유)",
"x": 127.0716667,
"y": 37.0240333,
"adminName": "경기도 평택시",
"stationSeq": 2,
"turnSeq": 29,
"turnYn": "N"
},
## 버스 운행 정보

{
  "crowded":1,
  "lowPlate":0,
  "plateNo":"경기77바3611",
  "remainSeatCnt":44,
  "routeId":234001660,
  "routeTypeCd":14,
  "stateCd":0,
  "stationId":214002018,
  "stationSeq":1,
  "taglessCd":0,
  "vehId":234001414
},
{
  "crowded":1,
  "lowPlate":0,
  "plateNo":"경기77바2934",
  "remainSeatCnt":36,
  "routeId":234001660,
  "routeTypeCd":14,
  "stateCd":0,
  "stationId":277102278,
  "stationSeq":2,
  "taglessCd":0,
  "vehId":234001315
}

 

그렇게 가공한 데이터를 Elastic Search 에 "YYYY-MM-DD" 형식으로 저장을 하면 된다.

 

하지만 Cursor가 만들어준 코드가 ES 패키지 의존성 문제가 계속 있어서 일단 임시로 JSON 파일로 저장하기로 했다.

 

그렇게 버스 운행이 없는 새벽 시간대(01:00 ~ 05:00)를 제외하고 API로 얻어온 버스 정보를 가공하여 JSON 파일로 저장한다.

추후에 ES 의존성 문제를 해결하면 ES에 수동으로 해당 JSON 파일을 복사하면 될 것 같다.

 

 

 

다음 글에서는 사용자가 입력한 시간, 정류소를 기반으로 Elastic Search를 조회하여 응답해주는 Java 모듈을 만들어보자.

 

Cursor로 경기도 버스 API에서 데이터를 조회하고 Kafka에 전송하는 Java 모듈을 만들어보자

 

먼저 공공데이터 포탈에서 버스 정보를 얻기 위해 필요한 API를 신청해서 인증키를 받는다.

공공데이터 포털

 

API 호출 방법

 

이후에 Cursor에게 내가 만들고 싶은 모듈의 설명을 적는다.

 

내 모듈의 주요 역할은 크게 2가지로 나눌 수 있다.

 

1. 경기도 버스 API 3분 마다 호출, JSON 데이터 형식으로 파싱한다.

2. 데이터 원본 그대로  Kafka `bus-location-events` 토픽에 프로듀싱한다.

cursor 진행 과정

 

그렇게 프로젝트 의존성 파일부터 시작해서 코드까지 뚝딱 결과물을 만들어준다.

 

만들어준 코드의 주요 부분을 살펴보자.

 

경기도 버스 API 요청 주소와 M5438번 버스를 의미하는 노선 ID(routeId), 데이터를 프로듀싱할 토픽을 final 변수로 선언한다.

 

해당 정보를 토대로 uri를 구성하고 https 요청을 통해 얻은 JSON 데이터를 KafkaTemplate을 통해 데이터를 프로듀스한다.

 

 

일단 로컬에서 테스트 하기 위해 Docker Hub로 kafka image를 다운받아 9092 포트를 포트포워딩하여 실행하였고

컨테이너 내부로 진입하여 토픽 생성까지 완료했다.

 

 

 

그렇게 cursor가 만들어준 Java 코드를 maven으로 빌드하여 실행하면 kafka log에 다음과 같이 데이터가 전송되는 것을 볼 수 있다.

 

 

 

uri를 만들 때 인증키가 이중으로 인코딩 되는 문제 말고는 단순히 API를 호출하고 Kafka에 데이터를 쓰는 간단한 모듈이기에 순조롭게 진행됐다. 

 

다음 글에서는 해당 kafka topic에 있는 데이터를 consume하여 데이터를 가공하고, 데이터베이스에 저장하는 java 모듈을 만들어보자.

유튜브 딩코딩코님의 영상을 보고 Lovable을 알게되었다. 나도 따라하기로했다.

https://youtu.be/hykGInJ_pPo?si=EIgj55HaEP4SMP84 (유튜브 : 딩코딩코)
https://lovable.dev/

 

 

 

만들고 싶은 서비스의 아이디어를 이 친구에게 말하면 내가 요청한 내용을 기반으로 코드를 짜준다.

 

내가 만들 서비스는 주로 모바일 환경에서 사용할 예정이고 간단한 정보(시간, 정류장) 입력 화면이 필요했다.

 

그렇게 구구절절 원하는 내용을 입력하면 잠시 후에 아래와 같이 완성된 UI와 함께 어떤 작업을 했는지 설명해준다.

 

 

 

나는 트라이얼 계정으로 하루에 나눌 수 있는 대화의 기회가 적다보니 한 대화마다 간절하게 고봉밥으로 가득 담아 요청을 보냈다.

 

완성된 결과물은 아래와 같다.

 

 

 

 

아직은 백엔드 API가 개발되지 않은 상태이기에 디자인은 이렇게 임시로 정한 다음 API 명세가 확정되면

디자인, 사용자 경험, API 호출 부분을  다시 손 볼 계획이다.

 

 

다음 글에서는 Cursor을 통해 Java 모듈을 만들어보자.

나는 경기도 평택에서 서울 강남으로 출퇴근 하는 직장인이다.

 

우리 집 앞을 지나가는 광역 버스인 M5438에 탑승해서 편하게 1시간 30분이면 회사에 도착할 수 있다.

 

하지만 강남에서 평택까지 가는 버스가 유일하다보니  출퇴근 시간대에는 자리가 없어 타고싶어도 탈 수 없는 상황이 나온다. 

 

밖에서 본 버스의 모습

 

과거의 버스 남은 좌석 기록을 볼 수 있다면 위와 같이 버스를 하염없이 기다리는 상황을 미리 피할 수 있을 것 같아서 서비스를 만들어보기로 했다.

 

시간이 흐르고

 

지난 2025년 05월 카카오 맵에서 버스 예상 시간표 기능이 업데이트 되었다. 이 기능을 쓰면 해결된다.  글을 마치겠다.

 

 

 

첫 출근 때 버스를 놓치고 아이디어를 구상을 해왔지만 카카오 맵에서 너무 고맙게 서비스를 출시했다.

 

이미 좋은 기능이 있지만 그래도 칼을 뽑았으면 무라도 썰자는 마음, 회사에서 사용하는 기술 스택 연습을 위해 내 손으로 만들어보기로 했다.

 

직접 개발하려면 1년안에도 못 끝낼 것 같아서 AI 도구를 활용하여 개발하기로 했다.

 

UI : Lovable
Backend(Java) : Cursor / gemini

etc : Kafka / Docker / AWS

 

먼저 기획한 구성도는 아래와 같다.

 

1. 경기도 버스 API를 주기적으로 호출하여 데이터베이스에 저장한다.

 

2. 사용자가 요청할 때 데이터베이스를 조회하여 응답을 준다.

 

필요한 모듈은 4개, 데이터 베이스 1개, 역할은 크게 2가지로 나누었다.

 

(데이터 수집 / 가공)

1. 경기도 버스 API에서 주기적으로 데이터를 읽어서 Kafka에 Produce하는 모듈

2. Kafka를 Consume하여 데이터를 가공 후 Elastic Search에 저장하는 모듈

 

(UI / 데이터 조회)

3. 사용자와 상호작용하여 시간, 현재 위치한 정류장 등 데이터를 입력받고 API 호출하여 화면을 뿌려주는 UI 웹-앱 모듈

4. UI에서 받은 정보를 토대로 Elastic Search를 조회하여 API 응답을 주는 모듈

 

 

 

다음 글에서는 Lovable로 간단하게 UI 를 만들어보자


`저의 경험은 반도체 전산실 제조업이라는 직무를 떠나서 회사회, 사바사 근무 경험일 수 있습니다.
재직 기간이 길지 않으므로 아직 회사에 대해 잘 모르는 상태에서 쓰는 글입니다. 감안하고 봐주시면 감사드리겠습니다.'

 

1. 업무 내용 및 노동 강도

 - 프린터 유지보수, 랜선 제작/수리, 마우스 및 키보드 관리, 방진복 입고 공장 노후 PC 정기점검, 인터넷 통신료 납부 관리, 소프트웨어 라이센스 정리 (IT 총무) 

 - 5 - 6 년차 선임이 아직도 막내가 할 법한 일을 하고있었다. 내가 5년 뒤에도 이 일을 하겠구나 느꼈다.

 

2. 직장의 분위기 보수적

- 매우 폐쇄적이다. 다른 부서에 비해 전산팀은 지원 부서이고 소수 운영이기 때문

 

3. 급여 및 복지

 - 주 45시간, 9시 출근이지만 8시 20분까지 출근 강요

 - 이것 저것 4천 만원 이내

 

4. 그만 둔 이유

 - 일단 하는 일이 너무 IT 총무 성향이 강했다. (키보드 및 마우스 구매, 녹이슨 PC 포맷, 프린터 점검 등)

 - 5년차 선임도 하는 업무가 본인과 비슷하다고 느꼈다. 

 - 선임의 인성 (상사한테 혼나고 와서 화풀이 함)

 - 본인 입사하기 직전 신입이 2주만에 도망갔었다.

 - 본인 퇴사한 이후에도 같은 채용 공고가 4-5번 넘게 올라왔다. 

 

 

IT 기술에 큰 욕심이 없고 안정적이고 편안한 직장을 찾으시면 성향이 잘 맞을 것 같습니다. 

본인처럼 단순히 취업이 안된다고 선택하기 보다는 자신의 업무 성향이 어떠한지 다시 한 번 확인 해본다면 좋을 것 같습니다.

이번에는 Elasticsearch Mapping에 대해 알아보자

 

먼저 classes라는 인덱스를 생성해주자

curl -XPUT 'http://localhost:9200/classes'

생성 이후 GET 메서드로 조회를 해보면 아래와 같이 'mappings' 필드가 비어있는 것을 볼 수 있다.

 

Mapping은 데이터베이스의 스키마와 같다. 직접 매핑을 설정해주지 않아도 Elasticsearch에 저장하는 것은 무리가 없지만 추후에 Kibana를 활용해 데이터를 시각화 할 때 날짜를 문자로 인식할 수 있는 에러를 방지하기 위해 Mapping은 필수다.

 

Mapping 정보는 아래와 같고 미리 mapping.json 파일에 저장해두자

{
  "properties": {
    "title": {
      "type": "text"
    },
    "professor": {
      "type": "text"
    },
    "major": {
      "type": "text"
    },
    "semester": {
      "type": "text"
    },
    "student_count": {
      "type": "integer"
    },
    "unit": {
      "type": "integer"
    },
    "rating": {
      "type": "integer"
    },
    "submit_date": {
      "type": "date",
      "format": "yyyy-MM-dd"
    },
    "school_location": {
      "type": "geo_point"
    }
  }
}

 

해당 json 파일을 통해 다음 curl 요청으로 Mapping을 진행하자

curl -XPUT 'http://localhost:9200/classes/_mapping' -H "Content-Type: application/json" -d @mapping.json

 

Mapping 이후 classes 인덱스를 조회하면 이전과 다르게 Mapping 항목이 채워진 것을 볼 수 있다.

 

 

Mapping 이후 bulk를 사용해서 데이터를 넣어보자

curl -X POST 'http://localhost:9200/_bulk' -H "Content-Type: application/json" --data-binary @data.json


##data.json
{ "index" : { "_index" : "classes", "_id" : "1" } }
{"title" : "Machine Learning","Professor" : "Minsuk Heo","major" : "Computer Science","semester" : ["spring", "fall"],"student_count" : 100,"unit" : 3,"rating" : 5, "submit_date" : "2016-01-02", "school_location" : {"lat" : 36.00, "lon" : -120.00}}
{ "index" : { "_index" : "classes", "_id" : "2" } }
{"title" : "Network","Professor" : "Minsuk Heo","major" : "Computer Science","semester" : ["fall"],"student_count" : 50,"unit" : 3,"rating" : 4, "submit_date" : "2016-02-02", "school_location" : {"lat" : 36.00, "lon" : -120.00}}
{ "index" : { "_index" : "classes", "_id" : "3" } }
{"title" : "Operating System","Professor" : "Minsuk Heo","major" : "Computer Science","semester" : ["spring"],"student_count" : 50,"unit" : 3,"rating" : 4, "submit_date" : "2016-03-02", "school_location" : {"lat" : 36.00, "lon" : -120.00}}
{ "index" : { "_index" : "classes", "_id" : "5" } }
{"title" : "Machine Learning","Professor" : "Tim Cook","major" : "Computer Science","semester" : ["spring"],"student_count" : 40,"unit" : 3,"rating" : 2, "submit_date" : "2016-04-02", "school_location" : {"lat" : 39.00, "lon" : -112.00}}
{ "index" : { "_index" : "classes", "_id" : "6" } }
{"title" : "Network","Professor" : "Tim Cook","major" : "Computer Science","semester" : ["summer"],"student_count" : 30,"unit" : 3,"rating" : 2, "submit_date" : "2016-02-02", "school_location" : {"lat" : 36.00, "lon" : -120.00}}

 

classes 인덱스를 조회해보면 다음과 같이 데이터가 잘 들어간 것을 볼 수 있다.

 

 

참고: [ELK 스택] Youtube 강의 허민석

https://www.youtube.com/watch?v=uzPTOgXe7-Q&t=274s