본문 바로가기

분류 전체보기205

Feign에서 multipart/form-data json 조금 더 잘 다루기 업무 중 외부 API 호출이 필요한 상황이 생겼습니다. 이미 사용하고 있던 ClientAPI는 FeignClient였고, 평소 Get, Post 그리고 application/json 형식의 요청을 주로 사용했습니다. 하지만 이번 경우에는 Multipart/form-data 형태의 요청 그리고 File과 json을 함께 전송하는 것을 필요로 했습니다. (예시) 외부 API의 컨트롤러 형태는 다음과 같습니다. Post 요청의 consumes는 Multipart/form-data 이며, 각각의 mapVlues, longValues, fileValue는 모두 @RequestPart로 요청받고 있습니다. 단순히 생각했을 때, 이 API를 feignClient로 요청한다면 아마 다음과 같은 interface를 구성.. 2024. 3. 10.
LOKI + Grafana를 사용한 분산 환경의 로그 수집 서버 개발을 진행하고 운영하면서 누구나 맞이하는 상황 중 하나는 로그 수집입니다. 최근 대부분의 서비스는 최소 2대 이상의 서버를 운용해 고가용성을 보장하고, 자원 사용량에 따라 오토스케일링 등의 스케일 아웃을 구성합니다. 이전에 ELK 스택을 사용해 Springboot 로그 수집하기 와 같이 ELK 스택을 사용해서 분산환경의 로그를 수집했지만, 관리포인트 증가로 인해 불편함이 있었고, 매트릭 수집을 위한 Prometheus + Grafana 도 함께 사용하기 위해 프로메테우스 제단의 로그 수집 툴 Loki를 적용했으며 이 과정을 공유합니다. Loki 설치 로그 수집 시스템을 구축하면서 가장 중요하게 생각한것은 스토리지에 대한 문제입니다. 로그 특성상 항상 새로운 데이터가 스토리지에 저장되고, 시간이 지.. 2024. 3. 3.
백엔드 서비스 운영시 고려해야할 점 지난 한 해 동안 사내에서 신규 서비스를 개발 및 오픈하게 되었습니다.🎉 보통 주니어 개발자는 입사 후 아래와 같은 상황인 경우가 많을 것이라 생각됩니다. 기존 운영되고 있던 서비스를 운영 개인(토이) 프로젝트 개발 -> 때에 따라 실제 서비스 오픈 (하지만 서비스 이용자가 많이 없어 배포까지만 완료하는 경우가 많음) 시니어 개발자가 프로젝트 설정 후 API 개발만을 담당함 저 또한 같은 주니어 개발자 입장이지만 팀 내 프로젝트 개발 표준 구성 데브옵스 & 인프라 구성 를 모두 담당하게 되면서 단순히 API 개발만 했더라면 알지 못하고 넘어갔을 내용들을 정리하여 공유하려 합니다. Java + Springboot 환경을 기준으로 작성합니다👋 요청 당 로그 트레이싱 서비스를 오픈하고 운영하는 단계 또는 그 .. 2024. 1. 21.
스프링부트 커넥션 설정도 체크하자 Issue 배치를 통해 async로 호출하는 API에서 응답시간이 60초 또는 30초, 심지어 에러까지 발생해서 정상 응답하지 않는 문제가 발생했습니다. 위 내용을 보면 HikariPool에서 커넥션을 30초동안 얻지 못해 생긴 에러임을 알 수 있습니다. TroubleShooting 첫 번째 의심 API 요청에 대한 응답이 너무 느려 타임아웃이 나는건가? 아닙니다. 직전 요청이 외부 서비스에 주문상태를 전달하는 Feign 요청이지만, 그렇다면 우리의 DB에서 커넥션을 얻지 못한다는 내용을 이렇게 상세하게 추적할 수 있을 리가 없습니다. 두 번째 의심 우리 DB가 문제가 있나? 아닙니다. 에러로그도 없고 데이터베이스 헬스체크 실패에 대한 로그도 없을 뿐더러, 동시간대 같은 API에 요청이 정상 응답한 경우.. 2024. 1. 21.
3년차 백엔드 개발자의 2023년 회고 2023년의 나, 참 열심히 했고 고생했다! 벌써 3년이라니? 2020년, 대학교 교양강의를 통해 개발자라는 길로 들어선지 벌써 4년째 그리고 실무에서 개발을 한 지 벌써 3년이 되었다. 마냥 개발자가 되겠어! 라는 생각을 가지고 달려왔고 수학교육 전공, 국비 교육, SI 부터 서비스회사로 이직하기까지 돌아보면 꽤나 괜찮게 2023년을 마무리 하는 것 같다. 백엔드 개발자로서 할 수 있는 많은 것들을 해보았다. 신규 서비스 구축 및 운영 올해 현재 내가 속하고 있는 조직은 두가지 서비스를 운영중이고, B to C 가 아닌 B to B 서비스로 신규 개발, 운영하는 것이 가장 큰 과제였다. 10년 가까이 운영되고 있던 두가지 서비스의 메인 기능을 외부 기업에 제공한다는 것은 생각보다 복잡한 과제였다. 10.. 2024. 1. 2.
AWS ECS + Fargate 를 이용해 애플리케이션 배포하기 현재 저희 백엔드 팀 신규 프로젝트의 인프라는 AWS ECS + fargate 으로 운영되고 있습니다. 저희 팀의 데브옵스 성격의 작업을 대부분 담당하는 입장에서 팀원 모두가 기본적인 인프라 구성을 이해해야 하고, 신규 서버 생성시 배포환경을 구성하는 과정을 정리할 필요성이 있다고 느껴 해당 글을 작성합니다. 왜 ECS + Fargate 인가? ECS를 선택한 이유는 여러가지 있습니다. 별도의 인스턴스 설정을 AWS 웹 또는 CLI에서 편리하게 설정할 수 있습니다. 데브옵스를 담당하는 팀(개발자) 인력이 별도로 존재하지 않을 때, ECS에 대한 이해도만 어느정도 있다면 서비스 운영을 할 수 있습니다. 기존 운영되고 있던 두개 서비스 모두 EC2 인스턴스 또는 마이그레이션 되지 않은 IDC 서버에서 운영되.. 2024. 1. 1.
Mysql 데이터정렬 collation 이슈 해결하기 Mysql 데이터정렬 collation 이슈 해결하기 Issue Springboot + jpa + querydsl 환경의 백엔드 개발 도중 당황스러운 에러가 나타났습니다. queryFactory.select() .from(entityA) .leftJoin(entityB) .on(entityA.entityBIdString.eq(entityB.entityBId.stringValue())) .fetch(); 먼저 간단히 환경은 entityA와 entityB는 논리상 N : 1 관계 데이터베이스 설계상 entityB의 id (entityBId) 컬럼은 bigint이고, entityA의 entityBIdString 컬럼은 varchar 타입 entityA와 entityB는 jpa entity에서 manyToOne.. 2023. 12. 22.
WOOWACON(우아콘) 2023 후기 - 2 WOOWACON(우아콘) 2023 후기 - 1에 이어 백엔드 두번째 세션에 대한 내용입니다. 모놀리식에서 점진적 서비스 분리: 사업과제와 병행하여 시스템 개선하기 배민상회개발팀 손민성님, 윤미현님 배민상회 서비스를 개발하고 있는 손민성님과 윤미현님의 세션입니다. 비즈니스의 성장에 따라 복잡도가 커지고, 특정 도메인의 변화가 다른 도메인에 영향을 끼치며, 빌드 시간이 길어져 개발에 영향이 갈 정도라는 것을 가장 큰 이유로 서비스 분리를 계획했다고 합니다. 배민상회개발팀에서 목표한 내용은 아래와 같습니다. 빌드/개발 단위를 작게 만들기 컴포넌트 분리 서비스 분리 안전한 배포 점진적 개발 빌드/개발 단위를 작게 만들기 큰 단위의 빌드는 코드 라인 수가 증가할수록 빌드 시간이 증가하지만, 작은 단위의 빌드는 빌.. 2023. 11. 17.
WOOWACON(우아콘) 2023 후기 - 1 2023년 11월 15일 수요일 woowacon 2023이 진행되었습니다. 좋은 기회로 현장참여를 할 수 있었고, 자세한 내용은 곧 오픈될 영상으로 확인할 수 있으니 메인으로 들었던 백엔드 세션에 주관적인 후기를 기록하려 합니다. 대규모 트랜잭션을 처리하는 배민 주문시스템 규모에 따른 진화 푸드주문서버개발팀 강홍구님 첫 세션은 푸드주문서버개탈팀의 강홍구님이 진행하셨습니다. 주문시스템은 가게, 메뉴, 주문, 결제, 배달 등 수많은 시스템과 통신하고 있고, 일평균 3000만건의 주문건을 저장하고, 수년간의 데이터를 보관하고 관리한다고 합니다. 대규모 트랜잭션 속에서 데이터의 정합성 보장, 조회성능을 위해 고민했고 그 과정 속에서 선택한 아키텍쳐를 소개해주셨습니다. 하나의 시스템 장애가 전체 시스템 장애로 퍼.. 2023. 11. 17.