Stream 사용시 주의 해야 할 점 (외부에 있는 변수 사용해도 될까?)
Stream 으로 외부에 있는 변수 사용해도될까? Stream은 내부가 lambda함수로 구성이 되어있다. 따라서 이때 외부의 stack 에 위치한 변수들은 캡처되어 람다식 내부에 추가가 된다. stream안에서 외부에 있는 변수를 수정하는것은 불가능하다! 따라서 요런 코드는 불가능하다 int a = 5; numbers.forEach(num -&g...
Stream 으로 외부에 있는 변수 사용해도될까? Stream은 내부가 lambda함수로 구성이 되어있다. 따라서 이때 외부의 stack 에 위치한 변수들은 캡처되어 람다식 내부에 추가가 된다. stream안에서 외부에 있는 변수를 수정하는것은 불가능하다! 따라서 요런 코드는 불가능하다 int a = 5; numbers.forEach(num -&g...
사용자가 마지막까지 이 페이지에 얼마나 머물렀는지 알고 싶다면? 사용자가 어떤 페이지에서 떠날 때를 알고 싶을때 사용 할 수 있는것이 beforeunload 이벤트이다! 요게 나는 단순하게 뒤로가기나 다른 페이지를 눌렀을때만 발생하는줄 알았는데 이거 뿐만 아니라 브라우저를 종료했을때도 어김없이 요 이벤트가 호출이 된다! 코드를 살펴보자 이렇게...
RDBMS 에서 언제 index를 지정하는것이 좋을까? RDBMS에서 index 지정이란 데이터베이스에서 검색 속도를 빠르게 하기위해 설정하는 것으로 B+ tree 자료 구조를 사용하여 구현되기에 binary search를 활용할수 있게 한다. 어떤 경우에 index로 설정하는 것이 유리한지 한번 쭉 정리하면 나만의 기준도 생길 것 같아서 오늘 정...
String, Stringbuffer, Stringbuilder 의 차이가 뭘까? java 개발을 하다보면 String을 다루게 되는 경우가 정말 정말 많다! 문자열을 다룰수 있는 Class는 크게 String, Stirngbuffer, StringBuilder 가 있다! 생긴것도 비슷한데 과연 도대체 어떤 차이가 있을까? String 우선 ...
이미지를 브라우저 캐시에 저장 했을때 장점 spring 에서는 resource 아래에 있는 자원(image, css, js) 의 경우에는 기본적으로 브라우저에서 캐싱을 하도록 지원을 한다. 하지만 다른 곳에 있는 이미지는! 따로 우리가 처리를 해줘야 브라우저에서 이를 알고 캐시에 넣는다! 물론 이미지 한장 가져오는것이 엄청 큰 부하는 아니지만 이미...
Transactional 의 propagation 옵션은 뭘까? transactional를 붙이면서 개발하다보면 간혹 Transactional 이 Transactional을 부르는 경우가 있을 수 있다! 그럼 그때는 어떻게 동작할까? 에 대한 정보가 바로 propagation이다! 나를 부른 부모가 transaction이 있는가 없는가를 보고 내...
CompletableFuture 사용하다가 어느 시점부터 코드가 진행이 안된다면? SW Q&A 플랫폼에서 질문을 게시할 때 다음과 같이 진행하는 부분이 있다. graph TD subgraph "Ask Question" B1(글을 올린다) --> B2(사내 게시판에 CompletableFuture로 비동기 요청) ...
Spring transactional 를 사용하면 변화하는 점 스프링에서 Transactional은 저번에도 공유했지만 atomic하게 하기위해 필요한 annotation이다! 하지만 원하는 method의 위에다가 적는다고 해서 무조건 해주는 것은 아니다! 우선 이것을 이해하기위해서는 Spring의 proxy에 대해 조금 알아볼 필요가 있다! ...
Constructor 로 field를 정리하는게 복잡해 보일 때 DTO 를 사용하다보면 필드가 많아지는 경우가 있다! @AllArgsConstructor public class DTO { private String id; private String name; private String phone; private String ... } ...
Transaction 이 여러개가 되면 생기는 문제! 하나의 transaction은 atomic을 보장한다. 하지만 그게 2개 3개가 늘어나서 동시에 실행이 되다보면 간혹 문제가 되는 경우가 있을 것이다! 대표적으로 3가지의 경우가 있다! Dirty Read Dirty Read 의 경우는 커밋되지 않은 값을 읽게되는 경우를 의미한다. ...
Transactional 사실 사내 SW Q&A 플랫폼을 개발하면서 중간에 에러가 나는 상황이 발생해서 디비에 절반의 쿼리만 적용이 되어도 문제가 없는 상황이 많아서였을까 transaction에 대한 고민을 많이 해보지 못했던거 같다. 하지만 점점 사람이 많은 시스템을 운영하거나 돈이 관련된 서비스를 운영하게 되면 이건 정말 무조건! 필요하...
Post 요청이 너무 늦게 끝난다 SW Q&A 플랫폼에서 글을 올릴때 submit이 되고 post request 의 모든 동작이 끝나고 방금 올린 글의 url로 이동하는 동작이 있다. 그런데 그 동작내부에 조금씩 조금씩 로직이 추가되다보니 시간이 꽤 걸리게 되었다. 대략적으로 시간이 오래걸리는 작업의 플로우는 아래와 같았다. flowch...
저번에 검색 개선한것이 효과가 있다 불과 5일전에 검색 성능을 개선하기 위해서 and 일 경우 boost 한것이 물론 효과는 있었지만 반례가 있음을 알았다. 예를 들어 “A B C D” 라고 검색했을 경우 모든 토큰이 포함된 document가 없으면 사실상 의미가 없는 쿼리라는것이 허점이었다. 나는 그런 상황에서도 A, B ,C 3개가 포함된 친...
검색 시스템을 개선하고 싶다! 우리 플랫폼이 SW Q&A 플랫폼이다 보니 검색 성능에 대해서 개선을 상당히 긴 시간 동안 못하고 있었다… 사실은 핑계인거 같지만! 예전에 검색을 개선한다고 Elastic Search 를 도입하고 모든 post를 indexing하고 다음과 같은 query를 날려서 검색결과를 가져오고 있었다. title 과 ...
사용자의 traffic을 제한 해보자 최근에 우리 플랫폼에서 이벤트를 개최했다. 이벤트 공지가 나가자 마자 사람들이 많이 몰려왔고 어느 날 저녁에는 매크로를 통해서 이벤트를 참가하는 사람도 있었다… 매크로를 막을 방법이 필요하던 와중 생각난 것이 traffic을 제한 하는 것이었다. 사이트 곳곳에 숨어있는 이미지를 찾은 것인데 사람들이 메인 페이...