All
19 posts
Hibernate Spatial을 이용한 좌표간 거리계산 (feat. PostGIS, H2GIS)

💽 Hibernate Spatial Hibernate Spatial은 지리 데이터를 계산하기 위해 만들어 졌고, Hibernate 5.0 버전 부터 Hibernate 라이브러리에 공식적으로 마이그레이션이 됐다. 현재 지원하는 데이터베이스는 , , , , 이고, 각 데이터베이스에 구현 되어있는 지리 데이터처리 구현체를 추상화한 인터페이스가 이다. Hibernate Spatial은 JTS와 geolatte-geom이라는 기하학 모델을 제공한다고 한다. 이러한 GIS(Geometry Information System)를 로 날리지 않고 Hibernate에 추상화된 함수를 통해 JPQL로 쉽게 짤 수 있다. 👈 어떤 데이터베이스를 사용해야 할까? Hibernate Spatial Function Geometry 함수를 지원하는 데이터베이스는 많이 있다. 하지만 이 포스팅에서 작성할 내용인 , 과 같은 좌표 간 거리를 간단하게 반환해주는 함수를 사용하기엔 이식성이 떨어지는 데이터베이스가 …

November 20, 2022
Spring
[kakao x goorm] 구름톤 2기 "미리내" 대상 후기

42 서울 본과정을 마무리 하고, 취업 준비를 하던 중 아는 분이 구름톤을 나가보라고 추천해주셨다. 그런데.. 이게 왠걸 지원하려던 날이 모집 마지막 날이였고, 그때부터 부랴부랴 구름톤에 대해 알아보고 지원서를 작성하게 됐다. 간략한 구름톤의 설명인데, 카카오 클라우드 이름인 과 구름 회사 이름을 합쳐서 9oormthon이 나왔다고 한다. 여담인데 카카오 클라우드 이름이 조만간 에서 로 바뀐다고 한다. 위 멘트를 보고 심장이 벌렁거려 지원하게 됐다 여러 프로젝트를 경험해봤는데도 불구하고 다양한 직종의 사람들과 협업을 해본 적이 별로 없어서, 흔치 않은 기회라 생각했다. “여기서 수상은 못해도 얻어가는 것이 정말 많겠다.”라는 생각이 들었고, 지원하게 된 계기인 것 같다. 해커톤 주제인데, 마지막 키워드는 진행 당일에 알려주신다. 지금와서 보면 예상할 수도 있고, 너무 당연한거라 예상을 못할 수도 있다. 🧚‍♀️ 구름톤 진행 이번 기수 지원자가 엄청 몰려 선발 발표가 하루 늦어졌지…

October 23, 2022
프로젝트
회고
한국어 유니코드 분석으로 문장화 해보기

🤖 자연어 처리(NLP) 란 인간의 언어 현상을 컴퓨터와 같은 기계를 이용해서 묘사할 수 있도록 연구하고 이를 구현하는 인공지능의 주요 분야 중 하나다. 자연 언어 처리는 연구 대상이 언어 이기 때문에 당연하게도 언어 자체를 연구하는 언어학과 언어 현상의 내적 기재를 탐구하는 언어 인지 과학과 연관이 깊다. 구현을 위해 수학적 통계적 도구를 많이 활용하며 특히 기계학습 도구를 많이 사용하는 대표적인 분야이다. 정보검색, QA 시스템, 문서 자동 분류, 신문기사 클러스터링, 대화형 Agent 등 다양한 응용이 이루어지고 있다. [출처] Wikipedia 쉽게 설명하자면, 인간이 일상에서 사용하는 언어를 컴퓨터에서도 자연스럽게 묘사할 수 있게 만드는 기술이다. 하지만 꼭 만으로 컴퓨터에서 자연어를 나타낼 수 있는것이 아니라 를 통해서도 자연어를 구현할 수 있다. 우리 개발자님이 마법을 부려 주실거야 🤔 AI 기술 없이 문장화가 가능할까? 한글이 웹 상에서 보여지는 것에도 공통된 이 있…

October 16, 2022
Node.js
Slack을 서버 오류 알림으로 사용해 보자

서버를 운영하다 보면, 예상치 못한 문제에 직면할 때가 많을 것이다. 서버가 죽는다던지, 특정 로직에서 오류가 발생하는 등 하루종일 서버를 관찰하지 않는 이상 즉각적인 대응은 힘들 것이다. 이런 를 대응하기 위해 Slack을 모니터링 알림으로 사용해 보고자 한다. Slack web hook을 이용해야 해서 다음 글을 참고하면 도움이 될 듯 하다. Slack Webhook API 생성하기 Sending messages using Incoming Webhooks 예시를 위해 일부러 Error를 throw 했는데, 직접 핸들링 하는 Error가 아니라 , , 등 당장 처리할 수 없는 Error에 대해 모니터링 프로세스를 통해 빠른 대응으로 안정적인 서비스를 운영할 수 있어야 한다. ✍️ Error Handling 모니터링 프로세스를 놓던, 로깅을 하던 일단 에러에 대해 Handling 할 수 있어야 한다. 단에서 지원하는 Filter가 있다면 상관없지만, 싱글 스레드로 동작하는 Node…

October 09, 2022
Node.js
기타
프랑스 - 한국 간 Latency 단축 전략

🐽 개요 프랑스에서 3초마다 데이터를 받아와 Slack으로 최신 데이터를 제공해주는 서비스를 운영중인데, 평균 2-3초의 가 있었다. 위와 같은 Flow로 데이터가 이동하였는데 아무리 프랑스에서 데이터가 전송된다 해도, 말이 평균이지 최소 2초의 지연시간은 발생하였다. 10초가 넘어가는 경우도 가끔 있었다. 이렇게 불안정한 환경으로 서버를 운영하는 것은 서비스 질적으로 최악이라 판단해서 서버 운영 1주년을 기념해 를 기획하게 되었다. 🎨 최적화 방법을 떠올려 보자 일단 데이터 Flow를 기준으로 , , 총 3가지를 트랜잭션으로 묶었고, 로깅을 진행했다. 📄 범인은 API 응답이 늦어서 였다. 프랑스에서 한국까지 API를 받아오는데 정도를 기록했고, 데이터 가공은 미만, slack 전송은 정도였다. 🤟🏻 Latency를 줄이기 위한 방법 를 줄이겠다고 서버 데이터 가공 로직을 최적화 하는건 한계가 있을 것이다. 그래서 최적화는 그대로 하되, 데이터를 받아오는 지역 자체를 프랑…

October 08, 2022
네트워크
회고
Session이란? JavaScript로 구현하는 Session

🌊 Session 이란? [출처] Wikipedia 쉽게 설명하자면 웹에선 가 사이트에 접속해 어느 위치에 있는지, 어떤 상호작용을 했는지 등 의 정보를 서버에 저장해 한 상태를 유지하는 개념이다. 세션을 쿠키와 굉장히 헷갈려 하는데, 일단 쿠키는 에서 관리되고, 세션은 에서 관리된다. 세션은 쿠키처럼 가시적인 부분에 있는 것이 아니라 이해하기 힘든데, 서버에 파일, 메모리, DB등 어디에든 저장되어 의 상태 관리를 하는 개념이다. 추상적인 개념이지만, 사용자가 사이트에 접속해 나가기 전 까지 서비스에 따라 사용자의 데이터를 서버에서 관리하는 것이다. 🤝 Session을 유지시키는 방법 프레임워크 내부 를 사용하는 방법이 제일 편하고, 사용하기 쉽지만, 이번엔 다른 방법으로 세션을 구현해 보려 한다. 💾 세션을 구현하기 위한 다양한 방법 위와 같은 게임 데이터가 있다고 가정을 해보고 세션 설계를 진행해 보자. 일단 를 사용하는 방법, 를 이용하는 방법이 있다. 서비스 요구사항에 …

September 30, 2022
Node.js
NestJS Interceptor를 이용한 횡단 관심사 분리

🤝 횡단 관심사 란? 비즈니스 로직의 핵심 기능이 아닌, 프로세스 중간에 삽입되는 기능을 말한다. 위 사진처럼 프로세스마다 공통되는 기능을 라고 부르며, 이러한 관심사들의 분리는 , 즉 관점 지향 프로그래밍에서 모듈성을 증가시키기 위한 패터다임이다. 🗿 AOP의 주요 개념 Aspect : 위에서 설명한 를 모듈화 한 것이다. Target : Aspect를 적용하는 곳이다. Advice : 실질적인 부가기능을 담은 구현체이다. JointPoint : 로 필드에서 값을 꺼내올 때 등 다양한 시점에 적용 가능하다. PointCut : 을 정의한 것으로 Advice가 실행될 지점을 정할 수 있음 👽 NestJS의 Interceptor 란? NestJS는 에서 영감을 받은 Interceptor를 다음과 같은 5가지의 예시를 들며 강조하고 있다. 메서드 실행 전후에 추가 논리 바인딩 함수에서 반환된 결과를 변환 함수에서 throw된 예외를 변환 기본 기능 동작 확장 특정 조건에 따라 함수를…

September 25, 2022
Node.js
NestJS
Socket이란 무엇인가 (Http Socket, Web Socket)

[출처] https://korea.ul.com/ict/ 💡 소켓 이란? 소켓은 특정한 파이프의 끝, 파이프 이음쇠 또는 위생 기구를 수용하기 위해 확장한 것으로, 또 다른 파이프의 끝이나 파이프 이음쇠을 가리킨다. 또한 소켓(socket)은 통신선 또는 전기선, 전구 따위를 끼워 넣어 연결선과 접속하게 하는 연결기구를 가리킨다. [출처] Wikipedia 쉽게 말해, 특정 지점의 를 의미하는 것이다. 오늘 알아볼 내용은 중 을 알아보는 것이 목적이고, 도 위에 설명된 소켓과 유사한 개념이다. 단지 가 특정 프로세스 일 뿐이다. 🌐 네크워크 소켓 네트워크 소켓은 네트워크를 통해 데이터를 보내고 받기 위한 의 끝점 역할을 하는 내의 소프트웨어 구조다. 소켓의 구조와 속성은 네트워크 API에 따라 정의되며, 일반적인 경우 소켓은 실행 중인 프로세스의 생명주기와 맞물린다. 🟡 HTTP Socket [출처] Mozilla HTTP 우리가 매일 사용하는 HTTP 통신도 으로 작동한다. …

July 30, 2022
네트워크
예약 자동화 서버 개발기

💫 개발하게 된 계기 아는 멘토님이 외주를 받아오셔서 슬랙에 구인공고를 하시길래, 한번 들여다 보니 서버를 제작해 달라는 것이였다. 오랜기간 프로젝트를 하던 도중이라 힘이 빠져서 기분 전환 겸 새로운 것을 찾고 있었고, ”취업은 비공식적으로 문제 없을거다” 라는 멘트에 혹해 지원해서 개발하게 되었지만, 나중에 생각해보니 장난으로 하신 말씀같다. 이렇게 5명의 개발인원 + 리딩해 주시는 멘토님이 만났다. 🤝 첫번째 미팅 확실히 현업에서 오래 종사하던 분이 리딩을 해주셔서 그런지 기획과 설계의 처리가 남달랐다. 요구사항 명세, 아키텍쳐 설계, 유저 시나리오 등 재직하시며 갖고 계시던 설계 보따리를 풀어 우리에게 제공해주시고, 작성하는 방법을 알려주셨고, 확실한 설계서가 3일만에 만들어 졌다. 📝 요구사항이 들어왔다. 페이지 구성은 심플했다. 이것만 보고 ”생각보다 얼마 안되겠네ㅋ“라는 지금와서 돌이켜 보면 미친 생각을 할정도로. 위 요구사항을 바탕으로 제작된 😵‍💫 우당탕탕 …

April 23, 2022
프로젝트
회고
Typeorm Virtual Column 설정 (2)

Typeorm Virtual Column 설정 (1) 이전 포스팅에서 함수와 함수의 차이점을 알아보게 되었는데 이번 포스팅에선 가상컬럼을 사용하며 join시 위 함수의 문제와 해결법을 포스팅 해보려 한다. 😵‍💫 Custom Virtual Column을 사용해야 하는 이유 예를들어 위처럼 버스 정류소와 주변 맛집이 정류소 pk를 통해 foreign key로 연결이 되어있다 가정해 보자. 이렇게 정류소와 주변 맛집의 관계가 맺어져 있는 상황에서 현재 거리 기준 2km 이내 정류소 주변 맛집을 조회하는 쿼리를 실행하면 어떻게 될까? getRawMany()의 문제 지금 보니 함수를 사용하니 가상 컬럼 효과를 낸 것 같은데 해결된거 아니냐? 할 수 있다. 그런데 문제는 지금부터이다. 여기서 또는 을 할 경우 위처럼 를 추가해 조회 할 경우 원래 대로면 부모 객체 안에 join된 객체들이 배열을 이뤄 지정한 key의 배열로 저장이 되어야 한다. 하지만 를 사용하면 부모객체와의 의존성이 모두…

January 17, 2022
Node.js
Express
Typeorm Virtual Column 설정 (1)

Typeorm Virtual Column 설정 (2) Typeorm을 사용하며 대부분 마음에 들었는데 한가지 딱 아쉬운 부분이 있다… Mysql에서는 테이블에 특정 컬럼이 없어도 SELECT시에 새로 만들어 출력 할 수 있다. 현재 Typeorm에 가상 컬럼 기능이 있긴 한데 원하는 목적과 좀 달라서 원하는 데이터를 가공 후 새로운 컬럼을 추가 해 return 받을 수 있게 가상 컬럼에 관해 포스팅 하려 한다. Typeorm 버전 0.2.37에 가상컬럼 업데이트 될거라는 얘기가 있었지만 현재 0.2.41 버전까지 지원이 안되고 있다… 🎓 가상 컬럼이란? Mysql 5.7 부터 지원되는 가상 컬럼은 가상의 컬럼을 둬서 수식과 조건문을 사용해 데이터의 가공 결과를 저장하는 것을 말한다. 사용 방법은 PERSISTENT(stored)와 VIRTUAL(generated-only)이라는 두 가지 타입이 존재하고 디폴트는 PERSISTENT 이다 PERSISTENT virtual column…

January 15, 2022
Node.js
Express
Express Afterware 도입

오늘은 생소하고 아무도 사용 안하는 개념을 도입해 모든 API 응답에 JWT가 만료되었다면 새로 발행해주는 코드 짜고자 한다. 원래 Express에 개념이 있고 실제로 지원이 된다. 하지만 현재 구현하는 로직 상 를 사용하면 유지보수에 상당히 도움이 될 것 같다 🤔 Afterware 란? 사실 Express 프레임워크에 란 기능은 없다 그냥 맨 마지막에 실행되는 함수라 이렇게 부르는 것일 뿐이다 가 요청 - 응답 사이에 엑세스 권한을 갖는 함수라면 는 어플리케이션의 모든 프로세스가 끝난 뒤 응답 직전에 실행되는 함수이다 Afterware 이해를 돕기 위한 그림 왼쪽은 일반적인 Express Process이다. 이 경우에 Express 디자인 패턴이 적용 돼 -> -> 순으로 실행이 되며 Service가 실행된 뒤 바로 Client에 요청한 데이터를 응답 해준다. 그리고 오른쪽 프로세스 처럼 를 적용했을 때 Service가 끝이나면 함수를 거쳐 응답이 된다. 🎓 사용하는 …

January 07, 2022
Node.js
Express
Express error middleware & Custom error module

⛔️ Custom Error 개발을 하다 보면 자체 여러 클래스가 필요한 경우가 종종 생긴다. 네트워크 관련 작업 중 에러가 발생했다면 , 데이터베이스 관련 작업 중 에러가 발생했다면 , 검색 관련 작업 중 에러가 발생했다면 등등 직접 연관된 에러를 발생시키는게 직관적이기 때문이다. 나는 API 서버를 제작 중이여서 위주로 작성 했다. 직접 에러 클래스를 만든 경우, 이 에러들은 , , 처럼 여러 프로퍼티를 지원하게 할 수 있다. 물론 이외의 프로퍼티도 지원 하게 만들 수 있다. 에서 의 인수에 아무런 제약이 없기 때문에 커스텀 에러 클래스는 반드시 를 상속할 필요가 없다. 하지만 를 상속받아 커스텀 에러 클래스를 만들게 되면 를 사용해 여러 객체를 식별 할 수 있다는 장점이 있다. 그래서 Error를 상속해서 커스텀 Error 클래스를 만들자 🛠 Custom Error 제작 Api 서버에서 사용하는 Api Custom Error이다 인자로 , 를 받아오고 옵션으로 , 을 받아…

January 06, 2022
Node.js
Express
쉽고 간단한 Slack Bot 만들기

를 이용하면 슬랙의 특정 채널에 자동으로 글을 올리거나, 올라온 글을 받아 오는 Bot을 만들 수 있다. 먼저, 페이지에서 App을 만들고 권한 설정 작업을 시작해야 한다. App 생성 및 권한 설정이 완료되었다면 Slack에 해당 App을 설치하고, 글을 등록할 채널에 생성할 App을 추가해 준다. 이후 Node.js 또는 여러 Api 서버로 글을 등록 할 수 있다. 특정 주기마다 자동으로 글을 올리고 싶다면 각 언어, 프레임 워크 별 전용 모듈을 활용하면 된다! 🤖 Slack Bot 생성 먼저, https://api.slack.com 에 접속해 준다. 사이트에 접속 했다면 왼쪽 아래에 버튼을 눌러준다. 밑의 From an app manifest는 신경쓰지 말자 그럼 이렇게 창이 뜨는데 위의 를 클릭하자! 워크스페이스가 없다면 여기로! 봇 이름을 입력해 주고 밑에 어느 워크스페이스에 생성할 지 정해준다. 그러면 밑의 이 활성화 되는데 눌러주자! 슬랙 봇을 전반적으로 설…

January 03, 2022
기타
Jest를 이용한 Express 단위 테스트

개발이 어느정도 진행되고, API 서버가 정상 작동하는지 포스트맨으로 일일히 확인해봤다. 하지만 단계이긴 하지만 규모가 점차 커질수록 기능이 많아져 수작업으로 테스트를 하는게 불안해지기 시작했다. 그래서 를 이용한 단위 테스트로 TDD를 적용해 보고자 포스팅을 하게 되었다. 👠 Jest 란 는 코드가 정상적으로 동작하는 지 확인하는 테스트 케이스를 만들어 정해놓은 값과 반환되는 값을 비교해 코드의 상태를 확인해주는 프레임워크 이다. ❓ Jest를 사용하는 이유 가 코드 스타일에 규칙을 정하는 것이라면 코드가 올바른 기능을 하는 지 체크 할 수 있다. 이를 통해 보다 안정적이고 제대로 동작하는 코드를 작성할 수 있다. 🛠 Jest 설정하기 현재 개발 환경이 이므로 , 관련 모듈도 설치해 준다. 그리고 는 통신을 만들어 주는 역할을 하니 테스트를 위해 필요하므로 같이 설치해 준다. 그 뒤 script 설정과 jest 설정을 따로 해줘야 한다. test 환경으로 핸들링 하기 위해…

January 02, 2022
Node.js
Express
2021년 회고

👣 이번년도를 돌아보며 개발을 처음 접해보고 올해 42 라피신, 42 본과정, 현재까지의 모습을 돌아보려 한다. 💻 개발 시작 처음 국비지원 학원을 다니게 되었다. 으로 웹 개발 풀스택 6개월 과정에 접하며 6개월만 지나면 나도 번듯한 곳에 취업하고, 앞날이 창창대로 일 줄 알고 매우 설레었다 😂 국비를 포기하게 된 결정적인 이유인 짤이다 하지만 다닌지 1주일 후 강사님의 자질이 의심이 되어 여러 사이트를 돌아보며 국비의 한계와 개발자의 로드맵 등을 읽어봤고 내가 생각했던 상상은 모두 박살이 나버렸다. 역시 인생은 쉽게 흘러가지 않고 열심히 살아야 한다는것을 알게 되었다. 일주일만에 학원을 그만 둘 생각을 했지만 한달이라도 다니면 40만원을 나라에서 줬기에 수업은 듣지않고 여러 사이트를 돌아다니며 처음 공부하면 좋을만한 언어를 검색 또 검색을 하여 를 접하게 되었다. 모든 언어의 근본이라길래 를 시작했지만 막상 처음 배울때는 영어를 처음 배울때 이상으로 어려웠다…🥲 그래서…

December 31, 2021
회고
Slack Api를 이용한 42Alert 프로젝트

🤔 만들게 된 이유 42 과정에는 , , , , 등등 여러 이벤트를 자체 인트라넷에 알려주는 알림 서비스가 있다. 라피신 봉사나 멘토특강 등 특정 이벤트는 선착순이라 빠르면 1분안에 자리가 꽉찬다 42 월렛마켓에는 AWS $1000 Credit, 학장님과의 식사(학장님이 사주신다ㅋ) 등 재미난 상품들이 많다 현재 존재하는 이벤트 알림이 있지만 지금 본과정에 들어온지 8개월 가량이 지났는데 선별과정(2월)부터 항상 인트라 알림 서비스에 불만이 있었다. 자체 API를 사용하지 않는이상 알림을 메일 또는 메신저로 받을 방법이 없고, 직접 사이트에 접속해서 확인을 해야 이벤트 등록이 가능하다보니 선착순으로 진행되는 이벤트는 놓치기 부지기수였다. 그렇게 내가 편해지기 위해 다짐을 한 뒤 반년이 넘는 시간이 지나고 어느날 갑자기 새벽감성에 젖어 개발에 시작하게 되었다 ..🤣 👨‍💻 개발 시작 이번 프로젝트의 개발환경 일단 요즘 정말 맘에들어 배우는 중인 를 이용해 제작을 하였다. 그리고 배…

December 29, 2021
프로젝트
회고
Node.js TypeScript 설정

🧢 Typescript 를 사용하며 프로젝트를 진행했을 때 규모가 커질 수록 클래스 기반 객체지향 언어 , , 등에 익숙한 개발자에게 혼란을 야기할 수 있다. 이유는 단지 가 동적 타입 언어이기 때문이며 이의 문제를 극복하고자 정적 타입 언어인 를 도입하게 되었다. 애초에 언어가 잘 정제되기 전에 서두른 출시와 웹페이지의 보조적인 기능을 수행하던 의 태생적 한계이기도 하다. Typescript superset 는 의 이므로 기존의 문법을 그대로 사용할 수 있다. 또한, 의 새로운 기능들을 사용하기 위해 과 같은 별도 를 사용하지 않아도 의 새로운 기능을 기존의 자바스크립트 엔진(현재의 브라우저 또는 Node.js)에서 실행할 수 있다. 이후 의 업그레이드에 따른 새로운 기능을 지속적으로 추가할 예정이여서 매년 업그레이드될 의 표준을 따라갈 수 있는 좋은 수단이 될 것이다. ⚙️ Setting 먼저 를 설치해야한다 아래와 같이 또는 을 통해 설치해 준다. 컴파일은 라는 명령어를 …

December 29, 2021
Node.js
Express
Express 디자인 패턴

어느 프레임워크/언어 간에 이 지켜지지 않은채 개발을 시작하게 되면 후에 유지보수, 가독성, 비효율적인 코드의 문제에 직면하게 된다. 이 올바르게 지켜진 채 개발을 하게 되면 코드의 중복을 피해주며 안정성이 높아지며 유지보수에 많은 도움이 된다. 이번에 프로젝트를 진행하며 배우게 된 설계를 포스팅 해보려 한다. 🚀 Express.js 프레임워크 Node.js 상에서 구동되는 서버 프레임워크 MVC 패턴을 사용한다. 많은 Method 및 Middleware를 통해 쉬운 API 작성 🌀 MVC 패턴 Model 모델은 클라이언트에 노출되지 않는다. 연산처리 및 DB 처리가 주 된 목적이다. 에서 요청이 들어오면 해당 연산처리 후 정보를 한다. View 클라이언트에 나타나는 부분이다. HTML/CSS/Javascript 등으로 꾸미고, 움직이고, 표현하는게 가능하다. 뷰는 사용자에게 보여지는 반드시 필요한 부분이다. 가공된 정보를 사용자가 보기 쉽게 나타내야 하는 곳이다. Control…

December 27, 2021
Node.js
Express