본문 바로가기

전체 글

(161)
사용하면서 느낀 Kotlin의 Null Safety val length: Int = nullableVariable?.length ?: 0Null 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에서 읽어오는 부분에서 문제가 발생했다고 판단을 했다. 해결 시도하기인텔리제이에서 제공하는 캐시 삭제 후 재..
IntelliJ Compound 기능으로 여러 프로젝트를 한 번에 실행시키기 개요회사 코드는 여러 프로젝트로 이루어져 있다. 하나의 로컬에서 API를 호출하기 위해 관련된 프로젝트를 전체 실행을 시켜야만 했다. 이걸 계속 하다보니 불편함이 너무 많았다. 관련 프로젝트를 하나하나 Gradle에서 실행을 시켜야 하는 번거로움이 있었기 때문이다. 편하게 해줄 수 있는 관련 기능이 있는지 확인했고, IntelliJ에서 여러 프로젝트를 한 번에 실행시켜줄 수 있는 Compound라는 기능을 제공해준다는 것을 알았다.Compound에 여러 프로젝트 설정하기"Run - Edit Configuration - Compound" 에서 설정을 할 수 있었다. 새로운 Compound를 생성하고 실행시키고자 하는 프로젝트들을 담으면 되었다.  추가적으로 각 프로젝트는 실행이 되어야하는 포트가 달랐기 ..
기존 API 응답 형식 변경할 때 주의점 기존 API 대체 문제사이드 프로젝트를 하면서 기존 API의 응답 구조가 변경이 되는 상황이 발생했다. API의 경로를 유지하기 위해 기존 API를 변경하는 방향으로 작업이 진행이 되었다. 작업을 완료하고 배포를 하고 나니 응답 값의 구조 변경으로 API와 관련된 앱의 기능들이 동작하지 않게 되었다.API 대체 방안사이드 프로젝트를 같이하는 선배 개발자 분이 기존 API의 변경으로 운영 환경에 영향을 줄 수 있다면 새로운 API를 만들어야 한다고 조언을 해주었다. 함께 일하는 백엔드 분들과 논의를 해서 API에 버전을 붙이기로 이야기를 했다. 기존 API@GetMapping(value="/hero")public HeroResponse getHero(){}추가 API@GetMapping(value="/v2..
개발 장애 대응에 대한 절차 개요 사이드 프로젝트 인생퍼즐 개발을 진행하면서, 이번에 몇몇 버그를 마주하게 되었다. 이번에 발생한 버그들은 배포된 앱이 정상적으로 동작하지 않도록 만든 케이스였다. 프리티어 만료로 인하여 AWS에 구성해둔 서버를 옮기게 되었는데, 이 때도 서버 이전 도중 문제가 발생하여 배포된 앱이 API를 호출하는 데에 문제가 발생해 앱 동작이 멈추었다. 이런 과정을 겪고나니, 장애가 발생했을 때 어떻게 대응하는 것이지 알아보고 사이드 프로젝트에 적용할 수 있는 것은 해보기로 했다. 장애란? 장애는 일시적으로나 영구적으로 시스템, 서비스, 또는 기능이 제대로 작동하지 않는 상황으로 기술적인 결함으로 하드웨어 또는 소프트웨어의 오류, 인프라, 네트워크, 보안 문제 등 다양한 요인에 의해 발생한다. 장애 대응 절차가 ..