Spring11 [WebFlux] Thread Test 🐻 Overview 웹플럭스는 흔히 비동기/논블로킹 이벤트루프 모델이라고 말합니다. 적은 수의 쓰레드로 많은 요청을 처리할 수 있는 걸 장점으로 내세우고 있는데, 항상 의문이 있었습니다. 흔히 블록킹 구간이라고 하는 네트워크 I/O 또는 데이터베이스 I/O 작업은 결국 어디선가 또는 누군가가 대기했다가 결과를 받아서 처리해야 합니다. 기존 MVC 모델에서 비동기 처리를 하면 별도의 쓰레드를 사용해서 처리했었기 때문에 큰 의문이 없었지만 쓰레드 하나로는 어떻게 처리하는지 궁금했습니다. 만약 웹플럭스에서도 별도 쓰레드풀을 만들어 처리한다면 요청량 증가에 따라 점점 백그라운드 쓰레드가 많아질거고 적은 수의 쓰레드로 컨텍스트 스위칭 비용 최소화 라는 장점이 무색해질 것 같았습니다. 이것저것 찾아본 결과 I/O .. 2022. 9. 7. [WebFlux] 기본 개념 / Mono와 Flux 🐻 WebFlux란? Spring WebFlux는 Spring 5에서 새롭게 추가된 모듈입니다. WebFlux는 클라이언트, 서버에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이며, reactive-stack web framework이며 non-blocking에 reactive stream을 지원합니다. □ 장점 : 고성능, spring 과 완벽한 통합, netty 지원, 비동기 non-blocking 메세지 처리 □ 단점 : 오류처리가 다소 복잡하다. Back Pressure 기능 없음 스프링5는 Spring Boot 2 부터 도입이 되었으며, Spring Boot 2 의 stack 는 아래와 같습니다. Reactive Stack 를 사용할지, Servlet Stack 를 사용할지 선택.. 2022. 8. 23. [Spring] 웹 소켓 연결 끊김 감지하기 Summary 클라이언트A가 서버와 소켓 연결을 끊을 경우(Disconnect) 서버에 해당 소식을 전달하고, 소식을 접한 서버가 나머지 클라이언트들에게 클라이언트A의 연결이 끊겼음을(퇴장했음을) 알리는 형태를 구성하고 싶었다. 사용자가 Disconnect 버튼을 직접 눌러서 서버와 소켓 연결을 끊을 경우엔 연결이 끊기기 직전 서버 쪽으로 알림 요청을 먼저 보내는 방법이 채택 가능하겠으나, 사용자들은 브라우저의 탭을 닫는 등 (개발자 기준)비정상적인 방법을 많이 이용한다. 그래서 우리는 Disconnect 버튼과 관계없이, 클라이언트와 연결이 끊기면 서버에서 이를 감지해내는 방법을 찾아야 했다. @EventListener + SessionDisconnectEvent @Configuration public.. 2022. 8. 17. [JPA] DTO 정의와 활용 범위 (※ 아래 글은 MVC 패턴을 먼저 숙지 하셔야 됩니다) 엔티티 객체(도메인 객체)는 DB table 그 자체입니다. 따라서, 엔티티를 통째로 Veiw 에게 넘겨주면, password 와 같은 민감한 정보도 함께 넘어갑니다. User.java (엔티티) public class User { public Long id; public String name; public String email; public String password; //외부에 노출되서는 안 될 정보 public DetailInformation detailInformation; //외부에 노출되서는 안 될 정보 //비즈니스 로직, getter, setter 등 생략 } UserController.java (DB 정보를 통째로 넘김 ㅠ) @G.. 2022. 8. 16. JPA 기본 - 엔티티 매핑 1. @Entity @Entity가 붙은 클래스는 JPA가 관리 JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 JPA 스펙상 파라미터가 없는 public 또는 protected 기본 생성자 필수 임베디드 타입에도 기본 생성자 필수 생성자에 파라미터 줄 경우 기본 생성자가 자동으로 생성안되기 때문에 따로 만들어줘야 한다. 기본 생성자를 사용할 일이 없고 그냥 스펙상 만들어 준 경우라면 public 대신 protected로 범위를 지정한다. 이렇게 해두면 나중에 사용할 때 기본 생성자는 스펙상 둔거구나 하고 알 수 있다. 이런 제약을 두는 이유는 JPA 구현 라이브러리가 객체를 생성할 때 프록시나 리플랙션 같은 기술을 사용할 수 있도록 지원해야 하기 때문 final 클래스, enum, int.. 2022. 8. 14. JPA 기본 - 영속성 관리 1. 영속성 컨텍스트 엔티티를 영구 저장하는 환경이라는 뜻으로 EntityManager을 생성하면 영속성 컨텍스트가 J2SE 환경에서는 1:1로 눈에 보이지 않게 생성된다고 보면 된다.(스프링 프레임워크 같은 컨테이너 환경에서는 엔티티 매니저와 영속성 컨텍스트가 N:1의 관계를 가진다.) 즉, 애플리케이션 계층과 DB계층 사이에 영속성 컨텍스트가 있다고 생각하면 된다. persist 한다고 해서 바로 db에 쿼리가 날려지는게 아니라 1차적으로 영속성 컨텍스트의 관리하에 들어가 있는 것이다. EntityManager em // 주입 받았다고 가정 // Member은 Entity 클래스 Member member = new Member(); // member은 비영속 상태 em.persist(member); .. 2022. 8. 13. 이전 1 2 다음