본문 바로가기

Spring10

kotlin coroutine 정리 1. couroutine?Coroutine은 thread의 Background 작업을 대신할 수 있는 asynchronous/non-blocking programming을 제공하는 경량쓰레드(Light-Weight Threads)여기서 경량(Light-Weight Threads)란?기존 Java 쓰레드는 OS의 Java Native Interface(JNI)를 통해 커널 영역을 호출하여 OS가 커널 쓰레드를 생성하고 1:1로 매핑했다. 이때 Context Swiching을 하면 OS에서도 Context Switching이 된다.경량 쓰레드는 OS의 쓰레드와 1:1로 매핑되지 않는다. OS의 쓰레드를 여러 경량 쓰레드가 번갈아가며 사용한다. 이때 발생하는 context swiching은 어플리케이션 단계에.. 2024. 9. 4.
[Spring] Event로 느슨한 결합 찍먹하기 0. 이 글을 쓰게 된 이유 이번 프로젝트를 진행하며 Event를 활용하여 요구사항을 해결한 적이 있다. 그 과정을 기록하고자 이 글을 쓰게 되었다. 1. 쉽지 않은 요구사항 로드맵을 생성하는 로직이 있다. 이 로드맵은 각 단계가 있고, 각 단계에 사진 파일이 여러개 저장될 수 있다. 이 로직은 간단해보이지만 다음과 같은 문제점이 있다. 1. I/O가 실패하여 사진이 없어도 로드맵 생성 자체는 되어야한다라는 요구사항이 있다. 2. I/O중 예외가 발생하면 로드맵 생성 자체가 롤백된다. 3. 각 사진 파일은 I/O가 발생한다. 한 요청에 파일 I/O가 10번이상 발생할 수 있으니 트랜잭션이 굉장히 길게 걸린다. 4. 파일 I/O 후 경로와 같은 메타 데이터를 DB에 저장해야한다. 즉, 파일 I/O하는 서브.. 2023. 8. 29.
[Spring] 커스텀한 multipart/form-data 요청 받기 0. 이 글을 쓰게 된 이유 프로젝트를 진행하며 쉽지 않은 요구사항을 기술적으로 해결한 사례에 대해서 기록하고자 이 글을 쓰게 되었다. 1. 쉽지 않은 요구사항 로드맵을 생성하는 API를 만들어야하는데 다음과 같은 특이한 요구사항이 있다. 요구사항을 정리하면 다음과 같다. 1. 로드맵은 여러개의 단계를 가질 수 있다. 단계의 수는 가변적이다. 2. 각 단계는 0~2개의 사진 파일을 가질 수 있다. 즉, 사진의 수도 가변적이다. 3. 로드맵 생성에 필요한 다른 데이터는 json 형식으로 넘어온다. 4. 위 요구사항을 하나의 API로 해결해야한다. 2. 고려한 방법들 다음과 같은 방법들을 고려했었다. 2.1 API 분리 처음에는 이 정도로 큰 요청은 분리를 하는게 맞다고 생각했다. 애초에 API 설계가 잘못.. 2023. 8. 29.
[Spring] RequestBodyAdvice로 @RequestBody 커스텀하기 1. RequestBodyAdvice란? @RequestBody가 붙은 파라미터 객체를 커스텀하고 싶다고 가정하자. 우리는 자연스럽게 ArgumentResolver를 통해 커스텀 하려고 할 것이다. 하지만 ArgumentResolver는 1개의 파라미터 객체에 1개의 ArgumentResolver만을 허락한다. 우선 순위를 커스텀하지 않는 이상 @RequestBody가 우선순위를 갖고, 우리가 설정한 ArgumentResolver는 동작하지 않을 것이다. 그렇다면 @RequestBody를 커스텀할 방법은 없을까? 당연히 아니다. 이미 스프링은 이런 요구를 반영해서 RequestBodyAdvice를 만들어놨다. RequestBodyAdvice는 RequestBody를 커스텀 할 수 있는 기능을 제공한다. .. 2023. 5. 8.
[Spring] ViewResolver 코드 파보기 0. 이 글을 쓰게 된 이유 최근 Dispatcher Servlet에 대해 공부하면서 ViewResolver에 대해서 궁금증이 생겨 이 글을 쓰게 되었다. 1. ViewResolver란? ViewResolver는 요청이 들어오면 DispatcherServlet이 핸들러를 찾아서 해당 핸들러가 ModelAndView 객체를 반환한다. DispatcherServlet은 ViewResolver를 List로 가지고있는데, ModelAndView에 있는 View의 name을 활용해서 적절한 View를 찾아서 반환한다. 즉, ViewResolver는 적절한 View를 찾는 역할을 한다. 2. ViewResolver 동작 원리 2.1 ModelAndView 객체 찾아와서 실행한다. protected void doDi.. 2023. 5. 4.
[Spring] 필터(Filter)와 인터셉터(Interceptor) 0. 이 글을 쓰게 된 이유 스프링은 개발자가 비즈니스 코드에 더 집중할 수 있게 여러 기능들을 숨기고있다. 대표적으로 AOP, Filter, Interceptor라는 기술을 사용한다. AOP는 스프링의 대표 기술로써 프록시를 이용해 코드를 숨겨주는 기능을 한다는 것은 대부분 알고 있을 것이다. 그렇다면 Filter와 Interceptor는 무엇일까? 그 차이와 용도에 대해서 알아보자. 1. Filter 필터는 스프링의 기술이 아닌 JavaEE 표준 스펙 기능으로써 톰캣과 같은 WAS가 가지고있는 기술이다. JavaEE 필터 공식문서를 보면 필터는 요청이나 응답 또는 둘 다에 대해 필터링을 수행하는 객체라고 소개한다. 즉, Web Context 단에서 Spring으로 요청을 보내기 전과 응답이 온 후로 .. 2023. 4. 19.