목록분류 전체보기 (106)
훈훈훈
이번에는 스프링 부트와 Kotlin 그리고 JPA(Hibernate) 사용하면서 겪었던 N+1 이슈를 정리해보려고 한다. 여러 연관관계가 매핑되어 있는 테이블의 전체 데이터를 조회하는 API를 호출하였을 때, 한방 쿼리가 발생할 것으로 예상을 했지만.... 결과는 몇천만 건 이상 쿼리가 발생하는 이슈가 발견되었다. 해당 글에서는 문제를 해결하면서 알게된 사용한 기술들에서 발생한 문제점과 해결방안을 공유하려고 한다. Hibernate 하이버네이트는 지연로딩(Lazy Loading)을 할 때 Entity를 프록시 객체로 조회한다고 한다. 그리고 공식 문서를 확인해보면 Entity Class를 final 속성으로 선언하면 프록시 객체를 생성할 수 없기 때문에 지연로딩을 사용할 수 없다고 명시되어 있다. 코틀린..
이번에 사내에서 S3 업로드 방식을 멀티파트(Multipart) 업로드 방식으로 변경하는 일을 맡게 되었다. 해당 기능 구현 중 SDK를 사용한 예제는 많았지만 S3에서 지원하는 REST API를 사용하는 예제는 찾기 힘들었기 때문에 이 기회에 정리하게 되었다. ( 해당 예제 코드는 Spring boot 와 Kotlin으로 작성하였다. ) Why Multipart Upload ?? S3에서 단일 객체를 업로드할때 최대 5GB 이상은 업로드할 수 없다. 일반적으로 5GB를 초과하는 파일을 업로드할때 용량을 압축해서 올리는 방안이 있겠지만, 압축에도 한계가 발생할 수 있다. 그런 상황에서 멀티파트 업로드를 사용하면 하나의 파일을 최대 5GB까지 10,000개로 분할 후 업로드 할 수 있다. 즉 5TB 파일까..
Spring Security에서 제공하는 CSRF protection 기능에 대해 공부 중 읽어 보았던 블로그 & 스터디 자료로 선택한 강의에서 CSRF protection 기능을 무조건 Enable 하는 걸 권장하였다. 하지만 문득 CSRF에 취약하지 않은 환경이라면 무조건 Enable 해야하는가에 대한 의문이 갑자기 들어 해당 내용을 정리하게 되었다. 해당 글은 먼저 CSRF에 대한 내용과 Spring Security에서 제공하는 CSRF protection 기능을 간단히 살펴보고 CSRF protection 기능을 무조건 Enable 해야하는가에 대해 필자의 생각을 적으려고 한다. CSRF (Cross Script Resourse Forgery) CSRF 취약점은 공격자가 사용자가 의도하지 않는 요..
- 문제 발생한 코드 > 예제코드는 Kotlin으로 작성되었습니다. @PostMapping("/testController") fun testController( @RequestBody testDTO1: TestDTO1, @RequestBody testDTO2: TestDTO2 ): ResponseEntity { return ResponseEntity(HttpStatus.OK) } PostMapping 할 때 두개 이상 @RequestBody를 받는 경우 JSON parse error 발생 - 원인 request 할 때 Input Stream 은 한번만 실행이 된다. 따라서 두번째 인자를 받을땐 Input Stream 이 close 상태이기 때문에 에러가 발생 즉, RequestBody annotation..
해당 내용 및 그림은 공식문서, 블로그 등을 참고하였습니다. 출처는 글 하단에 작성하였습니다. 서비스(Service) 란? - 파드에서 실행되고 있는 애플리케이션을 외부로 노출 시키는 추상적인 방법 - 디플로이먼트로 관리되고 있는 여러 파드들은 재시작 할 때마다 부여받은 IP 주소가 변경되기 때문에 관리가 어렵다. - 위의 문제점은 서비스를 이용하여 해결할 수 있다. - 서비스는 지정된 IP로 생성 및 여러 파드들을 묶어서 관리 할 수 있으며, DNS로 조회가 가능하다. - 서비스도 파드와 마찬가지로 REST Object 이며, 서비스 생성 시 API Server에 POST하여 새 인스턴스를 생성할 수 있다. - 기본 프로토콜은 TCP, 다른 프로토콜은 해당 링크 참고 - 예시 1 2 3 4 5 6 7 ..
해당 내용은 공식문서와 쿠버네티스 인 액션을 참고하였습니다. LivenessProbe - Kubernets에서 제공하는 컨테이너 헬스체크 방식 중 한가지 - LivenessProbe를 사용하면 컨터이너가 서비스를 시작할 수 있는지 판별할 수 있다. - 즉, 외부로부터 Request를 요청받을 수 있는 상태인지 판별 - 같이 쓰이는 헬스체크 방식 중 ReadinessProbe도 있다. 해당 속성을 사용하면 서비스가 계속 유지되고 있는지 체크할 수 있다. 예제로 사용한 Deployment 매니페스트 파일은 아래와 같다. apiVersion: apps/v1 kind: Deployment metadata: name: test-depolyment labels: app: test-api spec: replicas:..
Spring boot와 Kotlin(코틀린)으로 Application 개발 중에 Jackson 라이브러리에서 LocalDate 타입을 Deserialize(serialize)를 하면서 발생했던 이슈를 정리해보려고 한다. - 오류 메시지 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDate` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value - 문제 상황 Applicat..
해당 내용은 공식문서, 쿠버네티스 인 액션 책을 참고 하였습니다. HPA(Horizontal Pod Autoscaler) - 파드를 수평적으로 오토스케일링함, Scale Out(파드 수 증가) - 컨트롤러가 주기적으로 Metric을 수집 후, 조건에 부합하면 HPA 리소스에 설정되어 있는 레플리카 수 계산 Metric 수집 과정 - kubelet 자체에 내장된 cAdvisor 에이전트에서 실행되는 개별 컨테이너 및 노드 전체 리소스 사용 데이터 수집 - cAdvisor 에이전트로 부터 수집된 데이터를 바탕으로 전체 클러스터에 대한 리소스 연산은 Metirc Server 혹은 힙스터에서 진행 - HPA는 Metric Server 혹은 힙스터의 API 호출을 통해 메트릭 수집 * 최근에는 힙스터 보다는 Me..