쓰로틀링과 디바운싱은 마우스 스크롤 이벤트가 적용되어있는 웹페이지에서 유저가 마우스 스크롤을 하니 수백수천번의 호출이 일어나 브라우저가 메모리 외상을 입는 등의 상황에 대한 해결책이다. 다수 호출로 인한 성능저하를 방지하기 위해서는 호출 수를 줄이면 된다. 호출 수를 줄이는 방법 중 호출간 간격을 두는것이 쓰로틀링(Throttling)이고 다수 호출을 적은수의 호출로 그룹핑하는걸 디바운싱(Debouncing)이라한다.
필자가 웹 개발을 가장 처음했을때 맞닥뜨렸던 이슈가 CORS 였다. CORS 는 그 자체가 이슈가 아닌 규약으로 개발자에게 해당 요청이 CORS 규약을 따르지 않음을 알려주는것이다. CORS 규약은 웹 브라우저의 보안을 위한 요소이다. 우리는 블로그를 만들때 외부 이미지들을 링크할때가 있다. 이처럼 외부에 있는 단순 자원을 가져오는건 보안의 문제가 되지 않는데, POST 이나 PUT 과 같은 AJAX 호출을 통해 외부에 있는 동적 자원을 가져오는건 서버의 상태를 바꾸게되어 보안의 문제가 된다. 이에 서버 상태 변경(쿠키 헤더 등을 통한 클라이언트 상태 변경도 포함) 관련 호출 시 본 호출이 진짜 개발자가 의도한 호출인지 철저히 검증해야한다. 그렇지 않으면 블로그에서 악의적 스크립트 주입에 의해 외부 도메인에 원치않는 서버 자원을 조작할 수 있는 AJAX 가 호출될 수 있기 때문이다.
크롬 브라우저와 Node.js 둘 모두 V8 이라는 유명한 자바스크립트 엔진을 쓴다. 자바스크립트 엔진을 기반으로 구성된 크롬 브라우저와 Node.js 를 자바스크립트 런타임 환경(Javascript Runtime Environment)라 부른다. 간단하게 말하자면, 자바스크립트 언어를 통해 돌아가는 환경이라는 의미이다. 그럼 차이점이 무엇일까? 크롬 브라우저 환경은 렌더에 관련된 DOM 처리나 AXIOS 와 같은 외부 자원 호출 처리, 이미지 처리 등 브라우저에서 유저가 필요로하는 모든 기능을 Web API 로 추가 제공해주고, Node.js 서버 환경에서는 수많은 요청을 받기위해 이벤트 큐, 이벤트 루프(싱글 스레드)와 함께 워커 스레드 구성을 추가 제공한다.
병렬 처리를 위해 도입한 parallelStream 내에서 Spring Security의 세션 정보가 간헐적으로 사라지는 기이한 버그를 마주했다. '슈뢰딩거의 고양이'처럼 새로고침할 때마다 결과가 달라지는 이 현상의 원인을 파헤치고, SecurityContextHolder가 멀티스레드 환경에서 세션 데이터를 공유하는 세 가지 전략을 살펴본다.
Java에서 Integer 객체를 == 연산자로 비교할 때, 왜 어떤 값은 '참'이고 어떤 값은 '거짓'일까? 단순한 실수처럼 보이는 이 현상의 이면에는 메모리 효율을 극대화하기 위한 JVM의 'Wrapper Class Caching' 메커니즘이 숨어 있다. 실무에서 마주친 간헐적 버그 사례를 통해 자바의 메모리 관리 전략을 파헤쳐 본다.