분류 전체보기 (172) 썸네일형 리스트형 AWS SQS 메시지 소비할 때 Visibility Timeout 문제 배경회사에서 앱으로 단체 알림을 보내는 서비스를 만들 때 순차 실행을 위해 메시지 큐 서비스인 SQS를 사용했다. SQS에 발행된 메시지를 서버 리스너가 일정 주기마다 체크를 해서 받아왔다. 받은 메시지를 기반으로 정해진 로직을 수행을 하였다. 이 때, 모든 로직이 완료가 되었을 때 SQS 메시지가 삭제가 되어야 했는데 삭제가 되지 않고 SQS에 메시지가 계속 남아있는 현상이 발생하였다.원인SQS에서 가져온 메시지를 소비할 수 있는 시간이 정해져 있었다. 소비 시간이 지나면 메시지는 반환이 되고 다른 컨슈머가 사용할 수 있는 상태가 된다. 메시지 소비 시간은 별도로 설정하지 않아 30초로 설정이 되었다. 단체 알림 로직은 대상이 되는 유저에 따라 처리 시간이 30초가 넘는 경우가 생겨 처리 완료 이전에 .. Header 데이터 처리에 발생하는 예외에 람다 사용하기 Header 데이터 추출에서 문제앱에서 서버로 전송하는 Header에서 추출해서 사용해야 하는 데이터가 있었다. 필수값이 아니었으며 값이 있더라도 구분자로 분리를 해야 하는 데이터였다. 그러다 보니 값이 없거나, 데이터 형식이 변경이 되어 구분자로 분리하여 인덱스로 불러오는 과정에서 NPE 또는 "Index Out Of Range"가 발생할 수 있는 상황이었다. ✔ 상황S3에 데이터를 Json 형식으로 저장을 하고 있었고, 비어있는 경우 해당 필드에 Null 값을 넣는 것으로 처리하기로 되어있었다. 각 데이터에 필요한 값들을 얻기 위해 Header를 읽기 및 파싱 처리를 여러 번 해야 했다. Try Catch 문으로 여러 번 쓰는 것은 불편하다는 생각이 들어서 함수로 처리하기로 했다. ✔ 처리각기 다른 .. 앱으로 보내는 멀티 스레드 단체 알림 진행도 처리하기 단체 알림 진행도 응답관리자 페이지에서 앱으로 단체 알림의 진행도를 볼 수 있으면 좋겠다는 요구사항이 생겼다. 실시간으로 정확하게 알려줄 필요는 없다고는 했다. 그래서 관리자 페이지에서 사용할 진행도 API를 만들어 명세서를 전달하기로 했다. ✔ 비동기 멀티 스레드 환경단체 알림은 한 번에 약 100만 건 이상을 보낼 수 있도록 설계가 되었다. 비동기 멀티 스레드 환경으로 구성했으며, 보내는 알림의 전체 수를 나누어 각 스레드에 할당을 했다. ✔ 고려 사항비동기로 처리가 되다 보니, 각 스레드의 값을 하나로 합칠 수 있는 공유 자원이 필요했다. 그리고 하나의 단체 메시지만 있는 것이 아니었기 때문에 각 단체 메시지마다 구별을 해서 진행도를 처리해야 했다. 마지막으로 단체 알림 서버가 증원이 될 수 있.. 사용하면서 느낀 Kotlin의 Null Safety Null SafetyKotlin에서는 Null Safety(널 안정성)을 제공을 한다. 개발을 하면서 흔하게 발생을 하는 예외 NPE(NullPointerException)에 대해 개발작 방지 할 수 있도록 하는 장치이다. 기존 Java에서도 이를 위해 Optional을 사용했으며, 이를 Kotlin에서는 처음부터 문법에 적용을 한 것이다. ❓Null 사용 여부처음 따로 공부를 하지 않고 사용했을 때 Kotlin에서 Null 사용을 못하게 막은 것인 줄 알았다. 회사 Java 코드를 Kotlin으로 옮기면서 Null Safety에 대해 공부를 해보니, 변수 값에 Null을 허용을 할지 말지를 (Type + ?)를 통해서 정할 수 있다는 것을 알 수 있었다. ❓이점개발자의 실수를 많이 줄여줄 수 있다는 .. Java Spring에서 Kotlin' Data Class의 Json Parsing 문제 Java Spring MVC에서 Json 역직렬화 문제Kotlin 언어를 사용하면서 데이터의 불변성을 위해 Data Class를 사용을 한다. 그런데 Java Spring Controller에서 API 요청을 받을 때 데이터를 역직렬화를 못하는 문제가 발생한다. Java Spring에서 Jackson 라이브러리를 사용하고 있는데, 이 라이브러리가 Data Class 역직렬화를 못하는 것이었다. Data Class는 데이터 불변성을 위해 Setter를 제공하지 않아, 역직렬화 방식을 사용하지 못하는 것이다.Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct .. Java에서 Mybatis Custom TypeHandler 생성해서 사용하기 문제 사항Java에서 DB를 위해 Mybatis를 사용을 하고 있다. Mybatis에서는 기본적으로 제공을 해주는 타입이 아니면 변환을 하지 못해서 Sql 예외를 발생시킨다. 이번에 PK를 UUID로 사용을 하기로 했고, UUID를 Binary(16)으로 저장하기로 하면서 위와 같은 문제가 발생했다. 이를 해결 하기 위해 TypeHandler를 설정함으로 UUID가 Binary(16)으로 바뀔 수 있도록 작성을 해줘야 했다. TypeHandler 정의package com.example.typehandler;import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import java.sql.*;public c.. client intended to send too large body 문제 해결하기 문제 사항사이드 프로젝트 배포 앱에서 프로필 업데이트를 하는데 실패를 하는 상황이 발생했다. 테스트 환경에서도 문제가 없었으며, Postman을 통해 요청을 보냈을 때도 정상적으로 처리가 되는 것을 확인했다. 그래서 ElasticBeanstalk을 통해 배포된 서버의 로그를 확인했고 아래와 같은 예외가 발생한다는 것을 알았다. [error] 2580#2580: *19639 client intended to send too large body: 2537093 bytes원인로그를 확인한 결과 클라이언트에서 API를 요청할 때 보내는 데이터의 크기가 커서 생기는 문제라는 것을 알 수 있었다. Postman을 통해서 요청을 했을 때는 크기가 작은 사진을 보내다보니 확인할 수 없었던 문제였다.해결하기사진의 크기로.. 인텔리제이 Gradle dependency 인식 오류 문제 사항회사에서 기존 프로젝트를 이벤트 기반과 Kotlin 언어로 이전을 하기 위해 새로운 환경을 구성하기로 했다. 멀티 프로젝트 형식이었고, 루트 프로젝트를 구성할 때까지는 문제가 발생하지 않았다. 이후 하위 프로젝트를 몇 개 만들고 Dependency를 추가했는데 인식을 하지 못하는 현상이 발생했다. org.gradle.internal.resolve.ArtifactNotFoundException 그래서 gradle에서 다운받은 캐시에 정상적으로 다운로드가 되었는지 확인했다. 윈도우 환경에서 ".gradle/caches" 폴더 내부에서 해당 라이브러리를 찾았다. 라이브러리는 존재했기에 Cache에서 읽어오는 부분에서 문제가 발생했다고 판단을 했다. 해결 시도하기인텔리제이에서 제공하는 캐시 삭제 후 재.. 이전 1 2 3 4 5 ··· 22 다음 목록 더보기