본문 바로가기
관리자

Programming-[Backend]

(417)
[TIL] JVM HeapSize, HeapDumpPath 설정 buildPack의 bootBuildImage를 통해 JvmOption을 줄 때, 아래와 같이 설정함 static def getEnvs(heapDumpPath, envVal) {def jvmOptions = ["-Xms512m","-Xmx1024m","-XX: MaxDirectMemorySize=100M","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=${heapDumpPath}"]return [ "BPE_DELIM_JAVA_TOOL_OPTIONS": " ", "BPE_APPEND_JAVA_TOOL_OPTIONS": jvmOptions.join(" ")] Heap Memory Size를 512 ~ 1024 MB로 설정, nio 패키지..
Swagger UI(feat. keycloak Open API) 1. Swagger UISwagger UI라는 도커 이미지가 제공된다!https://github.com/swagger-api/swagger-ui/blob/HEAD/docs/usage/installation.md  docker run -p 80:8080 swaggerapi/swagger-ui  해당 도커 컨테이너를 실행하고, localhost로 접속하여 위 쪽 입력창에 .json 파일의 웹 주소를 입력하면 API를 사용할 수 있는 Swagger 문서가 생성된다.   나는 keycloak의 REST API를 확인해보기 위해서 keycloak의 OPEN API 문서의 주소를 붙여넣었다.https://www.keycloak.org/docs-api/latest/rest-api/openapi.json   2. Ke..
[TIL] @JsonInclude: 응답 객체 json의 끝부분이 깨질 때 문제외부 서버에서 응답을 받아왔는데, 맨 끝에 }로 json이 닫히는 부분이 제대로 오지 않아서 parsing이 일부 실패하여 오류가 나고 있었다. 원인Ro 객체로 응답을 지정하고 있었는데, body의 마지막 데이터들이 results가 아닌 code, name, description 속성값들이 모두 null로 오고 있었다. json에는 null이 없으므로 null이 맨 마지막에 오면 역직렬화 시에 위와 같이 불완전한 parsing이 일어날 수 있다. 해결책 1. 응답하는 쪽에서 null 데이터가 있는 경우 "null"로 String 처리해주는 것이 좋다.2. Ro 객체에 아래처럼 @JsonInclude(JsonInclude.Include.NON_NULL)을 추가해주면 null 데이터는 역직렬화시에 무시되..
성능 테스트: jmeter, @Profile, chaos monkey 배경로컬에서 잘 만든 애플리케이션을 클라우드 환경 등에 배포하기 위해서는 컴퓨팅 자원을 얼마나 쓸 것인지 결정하는 것이 필요하다. 실제 애플리케이션의 요구사항에 따른 적절한 자원 임계치를 설정하고 그에 맞게 설정해야 불필요한 자원 낭비를 막을 수 있다. jmeter애플리케이션을 테스트하기 위한 대상 API를 선정했다면, 해당 API 쪽으로 많은 요청을 한 번에 쏴볼 수 있는 도구가 필요한데, 이를 가능하게 해주는 것이 jmeter이다. 아래 jmeter 홈페이지에서 실행파일이 포함된 바이너리 파일을 다운로드 받고, 압축을 푼 뒤, 내부의 /bin/jmeter 파일을 실행하면된다.https://jmeter.apache.org/download_jmeter.cgi 아래 그림처럼 Thread Group -> H..
CircuitBreaker: Resilience4j - 지연 및 실패 전파 방지하기 배경여러 서비스들을 운영하는 환경에서 Gateway처럼 공통으로 쓰는 서버가 있다고 가정해보면, 이 공통으로 쓰는 서버에서 지연이 발생했을 때 해당 지연이 모든 서비들로 전파되는 문제가 발생할 수 있다.  이를 막기 위해 Resilience4j 라이브러리의 CircuitBreaker 기능이 있다. 일정 호출 수, 지연 시간 등의 기준을 두고 그 시간이 넘어가면 빠르게 각 서비스들에 Response를 주는 방식이다. 그럼 지연 대기를 위해 각 서비스에서 대기 중이던 스레드들이 Response를 빠르게 받고 자원 해제가 되어 부하 지연 전파가 없어지게 된다. 더 자세한 내용은 참고 자료들을 보면 된다.ref.) https://wellbell.tistory.com/256   적용 내용 살펴보기 아래와 같이 설..
[TIL] ResponseEntity<?>, inner class File name too Long ResponseEntity: objectMapper 처리 상황다른 API에 요청을 보내고 ResponseEntity의 파라미터에 ResponseEntity으로 응답 객체의 타입을 구체화하여 받을려고 했다. 문제SomeType과 일치하지 않는 응답이 오면 유연하게 대처가 안된다. 이를 위해 ? 타입이 존재한다. 이렇게 ? 타입으로 유연하게 받은 뒤에 objectMapper 등을 이용하여 json으로 변환하고 다시 읽어들이면 유연하게 응답을 받을 수 있다.  예시ResponseEntity response = imageUpload(file);try { String jsonBody = objectMapper.writeValueAsString(response.getBody()); SomeType imageUp..
스프링 데이터, 파일 동시에 전달 시 Swagger Schema 표시 개요정확한 내용은 아니다. 그런데 찾아봐도 답이 없는 것 같아서 기록해둔다.  상황스프링 부트 및 Swagger를 사용하여 컨트롤러에서 입력 객체(po)와 파일 업로드 리스트를 동시에 받아야하는 상황이 생겼다.@PostMapping(value = "send/mms/{type}", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity sendMms( @Parameter( ... ) @PathVariable("type") @ValidType(prefix = "mms") Stri..
id 설정하기. batchInsert, UUID, GenerationType.IDENTITY 상황스프링부트 + JPA 조합에서 batchInsert를 해야하는 상황  GenerationType.IDENTITY: batchInsert 불가public void saveMessages(dto) { List messages = new ArrayList(); dto.getMsgData().forEach(msgData -> { Message newMessage = new Message( UUID.fromString(msgData.getMsgKey()), null, null, msgData.getSenderNumber(), msgData.getRecei..