Java & Kotlin44 Spring graceful shutdown (+ async, virtual thread) 배포나 scale-in 등의 이유로 Spring 서버 종료 시, 해당 서버가 처리하고 있는 HTTP 요청은 어떻게 될까?요청 처리를 중단하고 서버가 종료되기 보다는 요청 처리를 다 마친 뒤에 서버가 종료되는 것이 좋지 않을까? Spring에서는 프로세스 종료 시 처리하고 있는 요청을 끝까지 처리할 수 있도록 graceful shutdown 기능을 제공한다. 이번 포스팅에서는 Spring의 graceful shutdown 기능과 이를 비동기 작업에서 적용하는 방법에 대해서 알아보도록 하겠다.추가로 virtual thread 설정 시 TaskExecutor를 커스터마이징 해야하는 이유를 알아보도록 하겠다. graceful shutdown 설정graceful shutdown 설정을 하기 위해서 server.s.. 2025. 3. 9. Kotlin + Spring MVC 사용 시 요청 List 필드에 null이 들어가는 경우 Java와 비교했을 때 Kotlin은 컴파일 타임에서의 null-safety를 가질 수 있다는 장점이 있다.이를 통해 NullPointerException과 같은 런타임 오류 발생을 줄이고 더욱 안전한 코드를 작성할 수 있다. 하지만 generic에 있어서는 얘기가 조금 달라질 수 있는데generic은 컴파일 타임에 타입 체크가 이루어져 타입 안정성을 보장하지만, 런타임에는 타입 정보가 삭제되는 타입 소거(type erasure)가 발생하며 이로 인해 Kotlin의 null-safety가 깨질 수도 있다. 이번 포스팅에서는 Kotlin과 Spring MVC를 사용할 때, 요청 List 내 element의 null-safety가 깨지는 케이스에 대해 알아보고 이에 대한 대처에 대해 알아보도록 하겠다. (코.. 2025. 3. 3. Kotlin SpringBoot 환경에서 jOOQ 설정 JPA가 주는 개발의 편리함은 많은 사람들에 의해 검증되었지만, dirty checking과 같이 under the hood에서 동작하는 기능들로 인해 배포 후 운영 시에 마주치는 문제도 생기게된다.(관련해서 읽어보면 좋은 글: Hibernate 의 ‘불편한’ 편의 기능들) 가끔은 MyBatis를 쓰던 시절이 품은 조금 더 들지만 동작하는 방식은 명확해서 좋았던 것 같다.하지만 MyBatis를 쓰면서 생기는 가장 큰 불편함은 문자열로써 SQL query를 다루기 때문에 쿼리 상의 오류를 런타임에서나 알 수 있다는 것이다.반면 jOOQ의 경우 DB를 직접 스캔하여 query 용 class를 생성하는데 이 class를 사용하여 type safe 하게 SQL query를 사용할 수 있다.(DB를 스캔 방.. 2024. 12. 3. [Spring] Swagger UI 대신 Scalar API Reference를 사용하여 API 문서 사용하기 Scalar API Reference는 Swagger UI를 대체할 수 있는 또다른 API 문서화 방법이다. Swagger UI와 비교하였을 때 화면 구성이 깔끔하기도 하며 API를 호출할 때 Postman과 같은 편리한 UI를 제공해줘서 개인적으로는 Swagger UI의 대체제로써 훌륭한 선택이라는 생각이다. 이번 포스팅에서는 Spring Web MVC 프로젝트에서 Scalar API Reference를 사용하는 방법에 대해 알아보도록 하겠다. (코드 예제는 여기에서 확인할 수 있다) 0. Scalar Quickstart 살펴보기먼저 어떻게 Scalar API Reference를 사용하면 좋을지를 알아보기 위해Scalar repository README에 있는 Quckstart를 살펴보자. .. 2024. 10. 29. [Spring Data JPA] @OneToMany Entity 연관 관계에 대하여 JPA는 RDBMS의 table 연관 관계를 Java object로 표현되는 DB model로 표현하기 위해 @OneToMany, @ManyToOne, @Embedded 와 같이 entity 간의 연관 관계를 설정하는 여러 기능을 제공한다. 이는 JPA를 사용하면서 POJO로 이뤄진 Entity와 DB model인 JPA Entity를 굳이 분리하지 않아도 표현력 있는 Entity 코드를 작성할 수 있게 해준다. 이번 포스팅에서는 JPA를 사용했을 때 상위 객체가 하위 객체를 포함하고 있음을 표현하기 위해 @OneToMany로 일대다 관계를 만드는 방식에 대한 얘기를 해보겠다. 여기서는 다대일 관계(many-to-one)에 대해서는 다루지 않겠다. 다대일 관계는 query 효율을 위해 사용할 수 있지만,.. 2023. 1. 20. reified를 통해 generic type 정보 가져오기 generic을 사용하여 코드를 작성할 때, generic type의 정보를 사용하고 싶은 경우가 있을 것이다. 아래 코드는 generic을 사용하여 파라미터의 타입을 확인하는 함수이다. fun isInstanceOf(obj: Any): Boolean { println("check object(${obj::class}) is instance of ${T::class}") return obj is T } 하지만 generic은 compile 후 제거되기 때문에 위 코드와 같이 generic type을 직접적으로 사용하는 코드는 compile error를 낸다. 그래서 주로 아래와 같이 추가로 generic type과 같은 Class 타입의 파라미터를 받는 식으로 우회한다. fun isInstanceOf(o.. 2023. 1. 16. 이전 1 2 3 4 ··· 8 다음