Spring에서의 Event 동작 방식 뜯어보기
2025. 8. 30. 02:51
Spring
스프링 프레임워크는 옵저버 패턴(Observer Pattern) 기반으로 이벤트 발행과 구독을 지원한다.즉, 한쪽에서 이벤트를 publish 하면, 등록된 여러 listener 가 이를 받아 처리할 수 있다.발행과 구독은 어떤 방식으로 하는지, 더 나아가 내부적으로는 어떻게 동작하는지 코드로 확인해보자. 스프링에서 이벤트 기능을 쓸 때 따라야 하는 기본 규칙은 다음과 같다:(스프링 4.2 이전) 이벤트 클래스는 ApplicationEvent를 상속해야 함이벤트 발행은 ApplicationEventPublisher 주입받아 사용이벤트 구독은 ApplicationListener 인터페이스 구현 or @EventListener 사용 이벤트 발행 (Publish)이벤트 발행은 Applicatio..

동시성 문제 해결 - 수강신청하기
2025. 6. 2. 16:58
Spring
수강인원이 있는 강의의 수강신청 기능을 개발하며잔여인원을 알맞게 카운팅 할 필요가 있었다. 이 때, 사용자가 같은 버튼을 여러번 누를 때 같은 주문이 여러 번 발생하거나,A와 B가 동시에 1개 남은 잔여 강의 구매 시-> 재고가 마이너스되는 등의 오류가 발생할 수 있다. 위와같은 문제를 동시성 문제라고 한다. 이런 동시성 문제를 해결하려면, 데이터에 하나의 스레드만 접근이 가능하도록 해야한다.그렇다면 어떻게 데이터에 동시에 하나의 스레드만 접근이 가능하게 할 수 잇을까? 동시성 문제를 해결하는 방법들과, 각각의 장단점에 대해 알아보자. 1. JAVA의 synchronized 자바에서는 Synchronized 키워드를 통해 데이터에 하나의 스레드만 접근이 가능하도록 만들어준다. 작동 ..

[Spring] Filter vs. Interceptor
2024. 11. 27. 11:48
Spring
개발을 하다 보면 공통적으로 처리해야 할 업무들이 많다.공통 업무에 관련된 코드를 페이지마다 작성한다면 비효율적일 것이다.이에 Spring은 공통적으로 여러 작업을 처리할 수 있는 다음과 같은 기능들을 지원하고 있다.1. Filter(필터)2. Interceptor(인터셉터)3. AOP(Aspect Oriented Programming, 관점 지향 프로그래밍) 이제 필터(Filter)와 인터셉터(Interceptor)가 무엇인지 그리고 차이점에 대해서도 알아보자.또한, 간략하게 인터셉터(Interceptor)와 AOP에 대해서도 비교해보자. Filter 요청과 응답을 거른 후 정제- Dispatcher Servlet에 요청이 전달되기 전/ 후에 url 패턴에 맞는 모든 요청에 대해 부가 작업을 처리..

[Spring] Spring에서의 요청처리 흐름(+Spring Security/MVC의 에러 처리 위치)
2024. 11. 26. 16:46
Spring
에러 커스텀 리팩토링 작업을 하다가Spring Security의 요청 처리 단계는 MVC 요청 처리 흐름보다 앞서 있다는 사실을 알았고,이런 처리를 명확하게 하기 위해서는요청 처리 흐름에 대해 조금 더 자세히 정리해 둬야 겠다는 생각이 들었다. 먼저 Spring Framework의 간략한 요청 흐름은 다음과 같다.🐣요청 흐름클라이언트 → Filter: 요청 가공, 인증 토큰 확인 등.→ DispatcherServlet: 요청 라우팅 중심.→ Interceptor (preHandle): 컨트롤러 실행 전 공통 작업.→ Handler (Controller): 요청 처리.→ Interceptor (postHandle): 컨트롤러 실행 후 응답 수정 가능.→ View: 응답 렌더링.→ Interceptor..

[Spring Security] 401, 403 에러처리(Spring 3.xx)
2024. 11. 26. 15:01
Spring
🐣문제상황 스프링 프로젝트에서에러를 커스텀하다가 401, 403에러는 커스텀한대로 나오지 않는 것을 발견했다. 난 요기에 넣어서 나오게 하고싶었고, 다른 에러는 요런식으로 잘 나오는데 그치만 401 에러는 이렇게만 나왔다 🐣원인Spring Security에서 발생하는 예외는 Spring MVC의 기본 예외 처리와 별도로 처리하기 때문!401 Unauthorized 응답은 기본적으로 Spring Security의 AuthenticationEntryPoint에서 처리된다.이 처리 방식은@RestControllerAdvice, @ExceptionHandler를 통해 설정해줬던 Spring MVC의 예외 처리 흐름과 다르다!! Spring Security의 요청 처리 단계는 MVC 요청 처리 ..

Spring 프로젝트에서 웹소켓 적용하기~!! 2탄
2024. 6. 12. 21:44
Spring
🔎하고싶은것유저중 한명이 POST,UPDATE,DELETE요청을 보내서 여행 일정을 변경하면같은 세션에 있는 다른 유저들에게도 페이지 새로고침되어 변경사항이 보였으면 좋겠다! 🔎구현 방법서버에서 클라이언트의 엔티티변경(POST,UPDATE,DELETE) 요청을 처리한 후 브로드캐스트하여 변경사항을 모든 클라이언트에게 알림=> 웹소켓에 연결된 클라이언트는 메시지를 받을 때 페이지를 새로고침함 브로드캐스트❔❓한 장치가 여러 장치에게 동시에 메세지를 전송하는 것을 의미하며여기서는 웹소켓을 통해 서버에서 클라이언트들에게 동시에 메세지를 전송하는 방식을 의미한다. 브로드캐스트: 한 번의 메시지 전송으로 네트워크에 연결된 모든 장치(또는 지정된 그룹)에게 메시지를 전달하는 방식멀티캐스트(Multicast):..

Spring 프로젝트에서 웹소켓 적용하기~!! 1탄
2024. 6. 10. 23:01
Spring
여행 일정 공유사이트를 만들며 여러명이서 실시간으로 편집상태를 공유하는 기능이 있으면 좋겠다고 생각했고, 이를 위해 웹소켓을 연동하게 되었다. 기본 HTTP는 stateless하기 때문에 서버에 변경사항이 생겨도 클라이언트에서 요청을 하지 않으면 변경사항이 적용되지 않는 반면 WebSocket은 지속적으로 connection을 유지하기 때문에 실시간으로 변경사항이 적용된다! 웹소켓의 이런 특징을 이용해 실시간 편집기능을 구현할 수 있다. 그리고 WebSocket 은 HTTP를 통해 최초 연결(핸드세이크)되며 이후 일정 시간이 지나면 HTTP연결은 자동으로 끊어지고 WebSocket Connection은 유지된다 다만 웹소켓은 stateful 프로토콜로서 connection을 항상 유지해야하기 때문에 트..

Google Oauth2
2024. 4. 2. 15:18
Spring
OAuth란? 타사 웹사이트나 웹이 리소스에 접근할 수 있게 허용해 주는 것이 주 목적이다 OAuth는 인증(Authentication)과 인가(Authorization)중 인가에 조금 더 초점을 맞추고 있따. 인증이란 ? 인증은 사용자가 자신의 신원을 사용하는 프로세스이다. 예를 들어 시스템에 로그인하려면 직원 ID, 또는 사용자 ID를 확인한다. 인가란? 인증된 사용자에 대해 특정 자원 또는 서비스에 대한 엑세스 권한을 부여 즉, 누가 어떤 자원에 접근할 수 있는지 결정 구글 로그인을 예로 들자면, 우리는 사용자의 정보, 즉 해당 사용자가 구글에 가입이 되어있는지는 구글 서버측에서 확인을 하고, 그 후 해당 정보와 인증된 사용자에게 권한을 제공해준다. 웹 서버 애플리케이션에서의 Google Oauth..

Pagination 조회 시의 Query tuning , 그리고 N+1
2023. 9. 13. 22:50
Spring
전체 조회시 속도 개선을 위한 쿼리 최적화를 하기 위해 이전 프로젝트에서 했던 것처럼 fetch join을 도입했다. 현재 프로젝트에는 Pagination이 구현되어 있었고, fetch join을 통해 1:N 연관관계인 테이블들을 조인하려는 시도를 했다. 그러나 이렇게 하면 문제가 발생할 수 있다고 한다. 어떤 문제인지, 그리고 해결법은 무엇일지 알아보았다. 📌쿼리 튜닝시 fetch Join을 쓰는 이유 우리는 보통 일대다 , 다대일 연결시 fetchType을 LAZY, 즉 지연로딩으로 설정한다. 이렇게 되면 한쪽 객체를 조회할 때 연관된 객체는 일단 Proxy 객체로 가져온 후 연관 객체가 실제로 필요할 때 select 쿼리를 따로 날려서 가져온다. 이렇게 하면 굳이 필요 없는 객체의 조회를 막을 수 ..