Spring5 Spring SSE의 내부 동작 탐색(AsyncRequestNotUsableException) SSE 연결 중, Client가 연결을 종료했을 때 AsyncRequestNotUsableException이 발생했습니다. 왜 이런 에러 로그가 찍히는 거고, 비동기 처리를 한 적이 없는데 왜 에러에 Async가 붙은 건지 궁금해 글을 작성하게 되었습니다. 이를 이해하기 위해서는 우선 Spring에서의 SSE 연결 흐름에 대해 알아야 합니다.SSE 요청 흐름SSE의 초기 요청 흐름입니다. 여기서 중요한 점은, 연결을 유지하는 동안 스레드를 계속 점유하고 있지 않는다는 점입니다. 하나의 스레드가 하나의 연결을 담당하는 대신에, NIO Selector에게 연결 정보를 넘겨준 후 스레드 풀에 반환이 됩니다. NIO Selector 내부에서는 하나의 스레드로 여러 개의 연결을 관리할 수 있는데요, 상당히 흥미로.. 2025. 12. 8. Filter, Interceptor 이번에 프로젝트를 진행하면서 Filter, Interceptor를 사용해 봤는데요, 어떤 친구들인지는 알고 있었지만 구체적으로 어느 상황에서 사용해야 하는지 헷갈려 정리를 하게 되었습니다. 우선 시작하기에 앞서 Spring의 요청 흐름에 대해 알고 있으면 많은 도움이 될 것 같습니다. 과거에 매우 간략하게 정리해놓은 글이 있는데요, 해당 게시글보다는 더 자세하게, 구체적으로 어떤 책임을 가지고 있는지까지 알아보도록 하겠습니다. https://codingmasterlsw.tistory.com/50 Spring HTTP 처리 과정흐름도 그림위의 그림을 보면서, 요청이 전달되는 과정에서 각 단계별 어떤 역할을 하는지 간단하게 이해하고 넘어가 보자. Tomcat- Client/ Web Server의 HTTP .. 2025. 10. 14. Spring HTTP 처리 과정 흐름도 그림위의 그림을 보면서, 요청이 전달되는 과정에서 각 단계별 어떤 역할을 하는지 간단하게 이해하고 넘어가 보자. Tomcat- Client/ Web Server의 HTTP 요청을 HttpServletRequest 객체로 변환한다. Filter- 인증/인가를 Filter를 통해 검증한다. ex) 유효한 권한을 가진 사람의 요청인가?만약 권한이 없는 사람이라면, 예외를 발생시킨다. Filter에서 권한 오류가 발생한다면, 해당 오류는 @ControllerAdvice / @ExceptionHandler에서 잡을 수 없다. 위의 그림을 보면 알 수 있듯이, DispatcherServlet 앞단에 Filter가 위치하기 때문이다. DispatcherServlet (Front Controller)- Http.. 2025. 6. 29. Spring Core 꼬리 질문 해보기 시작 질문 : Spring Bean이 뭐에요??-> Spring Bean은 Spring Container에서 관리되는 객체를 의미합니다. Bean은 내부적으로 BeanDefinition을 가지고 있고, 그 안에 Bean에 대한 정보(class, scope...)를 가지고 있습니다. 그러면 Spring Container에 Bean을 어떻게 등록할 수 있나요? -> 여러 방법이 있지만, 가장 보편적으로 사용하는 방법은 Annotation을 사용한 방법입니다. Bean으로 등록하고 싶은 클래스 상단에 @Component 어노테이션을 붙이면, 추후 @ComponentScan을 통해 @Component 어노테이션이 붙어있는 모든 클래스를 컨테이너에 빈으로 등록할 수 있습니다. XML 파일을 통해 주입하는 방법.. 2025. 4. 28. Spring Response/Request 어노테이션 @RequestParam- URL / Form 에서 오는 값을 읽을 때 사용한다. ex) ?name=jenson&age=20 이라는 쿼리 파라미터가 있고, 해당 URL을 통해 값을 가져오고 싶다면?@GetMappingpublic void read( @RequestParam("name") String name, @RequestParam("age") int age) { ... } 위와 같이 가져오려는 모든 매개변수에 @RequestParam 어노테이션을 붙여줘야 한다. 단, 파라미터 이름이 변수 이름과 같다면, @RequestParam 값은 생략 가능하다.@GetMappingpublic void read( @RequestParam String name, @RequestParam int age) { ... }.. 2025. 4. 16. 이전 1 다음