예상 독자MySQL의 공간 타입(sptial type)을 사용하고 있는데 공간 인덱스를 적용해보고 싶은 분공간인덱스가 적용이 안 되는 분핵심 요약MySQL의 공간인덱스를 적용하기 위해 SRID는 하나로 통일되어 있나요? (ex. 4326)공간 인덱스가 존재하더라도 옵티마이저의 선택을 받지 못하다면 풀스캔을 할 수 있습니다.문제 상황CareerBee에선 사용자의 현재 위치(위도, 경도) 기반으로 5KM 이내의 기업들을 조회하고 정보를 제공하고 있습니다. 이를 구현하기 위해 MySQL의 공감함수를 사용하고 있습니다. (아래 코드 참고)private BooleanExpression inDistance(String point, Integer radius) { return radius != null ..
SpringBoot
문제 상황Signoz 상에서 Slow Query를 확인해 보니 아래의 두 쿼리가 상위권에 선정되었습니다.Token이 블랙리스트인지 확인 (7.10ms 소요)spring 인증객체로 두기위한 member select (8.18ms 소요) 크게 느린 속도는 아니지만 Slow Query로 선정됐으므로 개선을 진행해보고자 합니다.해결 방법위의 두가지 Slow Query는 인증이 필요한 모든 요청에서 사용되는데요. 아래와 같이 점진적으로 성능을 개선하고자 합니다.인증객체를 Member 엔티티 → 인증 DTO 로 변경MySQL → Redis로 토큰 저장소 변경인증객체를 Member에서 DTO로 변경현재 인증 및 인가를 위해 Spring Security + JWT를 혼합하여 사용하고 있습니다. 서비스 코드에서 인증객체..
CareerBee 서비스에서 백엔드 개발을 맡고 있는 mumu입니다. 이번 글에서는 대회 참여 후 알림은 송신되지만 저장되지 않는 문제를 해결하며 배운 것들에 대해 다뤄보고자 합니다.예상 독자해당 글은 아래와 같은 독자들에게 도움이 될 것입니다.Spring의 @Transactional을 사용했지만 내부 동작방식을 몰라요.@TransactionalEventListener를 사용하며 DB CUD 연산이 적용되지 않는 문제를 겪고 있어요.핵심 요약@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)에서 DB CUD 작업이 적용되지 않는 문제 발생@Transactional 내부 동작방식에 따라 AFTER_COMMIT 이후 DB 트랜잭션은 끊어져 ..
기업의 마커 정보 조회의 성능을 높이고자 캐싱을 적용하고 있습니다. 이를 위해 직접 Redis에서 데이터를 get 해오고 없다면 put 해오는 코드를 다음과 같이 작성하였습니다.@Overridepublic CompanyMarkerInfo fetchCompanyLocation(Long companyId) { RBucket cachedCompanyMarkerInfo = redissonClient.getBucket( GEO_KEY_PREFIX + companyId ); String cached = cachedCompanyMarkerInfo.get(); if (cached != null) { try { return objectMapper.read..
나는 docker compose 파일을 통해 ec2에서 Nginx, springboot, redis 총 3개의 컨테이너를 띄웠다. Redis는 로그인과 로그아웃 기능을 위해 필히 스프링부트와 연동이 되어야하는 상황이었다. 일단 docker ps 명령을 통해 Nginx, springboot, Redis 가 모두 돌아가는 것을 확인하였고, docker exec -it redis-cli 명령어를 통해 레디스에 접근하고 ping 명령어를 통해 제대로 작동하는지 여부또한 체크하였다. 근데!! 포스트맨을 통한 로그인 API를 테스트하려고 할 때마다 자꾸 레디스와 연결이 안되는 오류가 발생하였다. 구글링을 해보니 간단히 해결법을 찾았다. spring: data: redis: host: redis port: 6379 ..
나의 스프링부트 프로젝트를 도커 이미지로 만들었고 이 이미지를 도커 허브에 push하고 싶어서 아래 명령어를 실행했다. docker push fxteam:1.0 결과는? 왜이러니,,,,,? 찾아보니 크게 두가지 이유가 있다고 한다. 1. Docker Hub에 로그인 하지 않은 경우 난 로그인이 됐으니 이 문제는 아니다. 2. Docker Hub에 로그인 한 ID와 도커 이미지의 유저 ID가 다른 경우 이 문제였다. docker images 이미지 조회 명령어를 통해서 확인해보니 도커 이미지의 유저 ID가 로그인 한 ID와 달랐다. 이를 tag명령어를 이용하여 다시 만들어줄 수 있지만 나는 이미지를 다시 만들었다! docker hub에서 이미지가 push된걸 볼 수 있다.
도메인 영역의 주요 구성 요소 앞선 글에서 도메인 영역은 도메인의 핵심 모델을 구현한다고 하였다. 도메인 영역의 모델은 도메인의 주요 개념을 표현하며 핵심 로직을 구현한다. 1장에서 나왔던 엔티티와 밸류 타입은 도메인 영역의 주요 구성 요소이다. 이 두 요소와 함께 도메인 영역을 구성하는 요소를 아래의 표와 함께 살펴보자. 요소 설명 엔티티 ENTITY 고유의 식별자를 갖는 객체로 자신의 라이프 사이클을 갖는다. 주문, 회원, 상품과 같이 도메인의 고유한 개념을 표현한다. 도메인 모델의 데이터를 포함하며 해당 데이터와 관련된 기능을 함께 제공한다. 밸류 VALUE 고유의 식별자를 갖지 않는 객체로 주로 개념적으로 하나인 값을 표현할 때 사용된다. 배송지 주소를 표현하기 위한 주소나 구매 금액을 위한 금액..