[SpringBoot] PostGIS와 OSRM을 사용한 합승 매칭방 추천 구현
·
Backend/SpringBoot
소마 프로젝트를 진행하며 사용자 요구사항으로 탑승하고 싶은 위치와 하차하고 싶은 위치를 지정하면 탑승 구역과 하차 구역에서 가장 가까운 매칭방을 순위로 보여주는 기능을 추가하면 좋을거같다고 생각하여 사용자의 요구사항과 니즈를 반영하여 어떻게 기술적으로 해결하였는지 과정을 적어본다. 합승 매칭방 추천 요구사항해당 기능을 수행하기 위한 요건은 다음과 같다.출발지와 목적지로 추천을 요청한다.출발지와 목적지까지 걷는 시간이 짧은 순서로 추천한다.도보 10분거리 이상은 추천에서 제외한다.사용자는 참여한 방이 존재하지 않아야한다. 주어진 요건대로 기술적으로 해결책을 생각해보았다. 첫번째 요건과 두번째 요건을 구현하기 위해서 어떻게 구현할지 생각해보았다. 사용자에게는 가장 최적이고 좋은 방법은 사용자가 탑승하고 싶은..
[SpringBoot] Modulith 아웃박스를 afterCommit으로 분리한 과정
·
Backend/SpringBoot
현재 소마에서 진행하고 있는 프로젝트는 목적지가 비슷한 사람끼리 택시를 같이 타도록 묶어주는 동승 서비스이다. 사용자가 매칭방에서 기다리는 동안 누가 들어오고 나가는지가 화면에 바로 보여야 하기에 대기 화면을 SSE와 Redis Pub/Sub으로 실시간 갱신하고 있다. 폴링에서 SSE로 바꾼 과정은 이전 글에 정리하였다.https://mari-laveau.tistory.com/327 그러다 서버 2대에 부하테스트를 돌려보니 이상한 수치 두 개가 보였다. 모듈 간 이벤트를 기록해두는 event_publication 테이블에 초당 약 150행이 새로 쌓이고 있었고 방 정보를 다시 조회하는 요청이 테스트 한 번에 약 9,600번이나 일어났다. 화면이 틀린 채 남은 경우는 없어서 겉으로는 멀쩡했지만 따라가 보니..
[Java] buildSrc를 사용하여 의존성 관리하기
·
Programming/Java
gradle의 lifecycle을 공부하면서 발견한 내용인데 의존성을 하나의 파일에서 관리한다는 편함이 있어 협업할때 자주 사용하면 좋을거같아 공부를 해보았다. gradle lifecycle에 대해서 궁금하면 아래 블로그를 참고하면 좋을거같다.https://mari-laveau.tistory.com/324 [Java] Gradle과 동작 원리(Build Lifecycle)Spring으로 개발을 하며 너무 당연하다고 사용하는 것들의 원리가 정확히 어떻게 동작하는지 이해하지 않고 사용하고 있었다. 이번에 정리할 주제가 바로 이해하지않고 사용했으며 이번에 글을mari-laveau.tistory.com buildSrc 동작원리gradle에 동작 원리중 setting.gradle(.kts)를 먼저 읽어 어떤 프로..
[Java] Gradle과 동작 원리(Build Lifecycle)
·
Programming/Java
Spring으로 개발을 하며 너무 당연하다고 사용하는 것들의 원리가 정확히 어떻게 동작하는지 이해하지 않고 사용하고 있었다. 이번에 정리할 주제가 바로 이해하지않고 사용했으며 이번에 글을 정리하면서 왜 해당 빌드 도구를 사용하는지 내부적으로 어떻게 동작하는지 파헤쳐보자 구글에 Gradle을 검색하면 나오는 정의다.'소스 코드를 실행 가능한 애플리케이션으로 만들어 주는 빌드 자동화 도구이다' 로 나와있다. 그렇다면 우리가 작성한 .java 코드를 실행 가능한 어플리케이션으로 어떻게 만들 수 있을까? 이때 나오는 키워드가 컴파일과 빌드이다. 컴파일.java 파일을 .class 파일로 번역하여 바이트 코드로 변환빌드의존성 준비, 컴파일, 리소스 처리, 테스트, 패키징까지 합친 것모든 .java로 작성된 파일은..
[Java] 가비지 컬렉션(GC) 동작 원리
·
Programming/Java
Java에서는 객체를 생성하면 heap에 할당된다고 알고 있다 하지만 heap에서 사용되지 않은 객체들을 회수해야 다른 객체가 저장이 될 수 있다 우리는 Java를 사용하며 C/C++ 처럼 free를 사용해서 할당한 메모리를 시스템에 반환하지 않는다 이는 Java의 특성으로 JVM 안의 가비지 컬렉터가 더 이상 사용되지 않는 객체를 찾아 그 메모리를 자동으로 회수해 주기 때문이다. 이렇게 사용하지 않는 메모리를 찾아 회수하는 과정을 가비지 컬렉션이라고 하고, 그 일을 실제로 수행하는 JVM의 구성 요소를 가비지 컬렉터라고 한다. GC 수집 알고리즘Mark객체가 계속해서 참조를 가지는지 아닌지 체크해 놓는 것으로 해당 객체가 가비지 컬렉션의 대상이 되는 참조가 없는 래퍼런스인지 확인하고, 참조가 ..
[Kafka] Spring에서는 Kafka가 실제로 어떻게 동작할까?
·
Backend/Kafka
Kafka를 사용하면서 나는 Kafka에 대한 설정 값들 세팅을 application.yaml 파일에 넣었다 하지만 다른 블로그들을 참고해보니 설정 파일들을 KafkaConfig.java 파일로 따로 관리를 하는것을 보았다. 해당 글들을 보며 궁금해진 의문증은 총 2개였다. consumer가 broaker에 연결을 맺어 메시지를 주고 소비할 수 있는데 이것이 어떻게 구현이 되어 있고 실제로 어떻게 동작할까?yaml 파일로도 관리할 수 있을것 같은데 .java 파일로 관리하는 이유가 뭘까? 먼저 첫번째 의문을 해결하기 위해 Kafka 외부 라이브러리를 설치하여 구현이 어떻게 되어있는지 확인해보았다. 제일 먼저 Consumer쪽에서 메시지를 consume 하기 위해 사용하는 어노테이션은 @KafkaListe..