개요socket.io의 공식 문서를 읽으며 알게 된 특징과 장단점을 기술해보려 합니다. 왜 web socket이 아닌 socket.io를 사용해야 하는지, socket.io는 어떤 환경에 적합한지 알아보겠습니다.본문1. Socket.io 와 Web socket은 다르다 - socket.io는 web socket의 구현체가 아니다. 웹 소켓도 이미 구현체이고, 이에 추가적인 기능을 가진 개체가 Socket.io이다. - web socket과 다르게 socket.io는 Acknowledgement, connection recovery, event 단위 처리 등이 가능하다는 장점이 있다. 2. socket.io는 백그라운드 프로그램에 어울리지 않다. - 지속적으로 open TCP 연결을 해야 하기 때문에 모..
전체 글
하고 싶은 것들을 하며 성공하기개요채팅을 구현하는 것은 이번이 두 번째입니다. 처음 구현할 때는 웹 개발을 처음했을 때라 웹소켓보다 기본적인 API에 집중했습니다. 그러다 보니 소켓 관련 부분은 게임 파트 동료가 만들어둔 것을 사용하는 형식으로 했고, 디테일이 부족했습니다. 하지만 이번에 채팅을 한 번 더 구현할 기회가 생겨 관련하여 공부하고, 기록으로 남겨볼 예정입니다. 본문현재 ec2 docker의 WAS의 아키텍처는 무중단 배포를 위해 인스턴스가 두 개 존재합니다. 때문에 클라이언트와의 통신 요청-응답 사이에 상태를 서버에서 저장하면 안 됩니다. DB 등의 또다른 인스턴스에서 저장해야 한다는 이야기이죠. 때문에 In-memory caching을 할 수 있는 Redis 등을 이용하여 서버 소켓을 저장해야 합니다. 이렇게 redis..
개요Socket.io는 무엇이고, 언제 사용할 수 있는지, 그리고 WebSocket과의 차이점을 알아보겠습니다.본문Socket.io이란?Socket.io는 클라이언트와 서버 간의 짧은 지연 시간, 양방향, 이벤트 기반의 통신입니다. 때문에 실시간 서비스에서 사용하기에 적합한 라이브러리입니다. Socket.io는 HTTP와 다르게 연결만 되어 있다면 서버에서도 원할 때 요청을 먼저 줄 수 있습니다. 또 클라이언트와 연결이 비정상적으로 끊어졌을 때 자동으로 재연결을 시도하며, 패킷을 자동으로 버퍼에 저장하고, 재연결이 되면 이를 전송합니다. 주의 할 점은 Socket.io는 모바일 애플리케이션의 백그라운드 서비스에서 사용하기에 적합하지 않습니다. 서버와 개방형 TCP 연결을 유지하므로 배터리를 많이 소모할 ..
개요자사 서비스 어드민 페이지 유지 보수 및 기능 개발을 맡게 되었다. 이에 따라 처음으로 프론트 리액트 공부를 하게 되었고, 내용을 정리하여 한다.본문 Total clicks: 0 Click me span특정 텍스트를 감싸는 인라인 컨테이너이다. javascript로 특정 span의 텍스트 내용을 변경할 수 있다.템플릿 리터럴(``)자바스크립트에서 문자열로 나타낼 수 있으며 변수를 문자열과 같이 넣을 수 있어 편리하다. java나 C 같은 언어에서는 문자열에서 '+' 같은 연산자를 사용해야 하는데 자바스크립트는 이것도 지원하지만 더 편리하게 이를 사용할 수 있다. ${variable name}을 내부에 적으면 된다. 여기에선 count 변수의 값을 넣어주고 있다.document로드된 HTML 문서..

개요 벌써 취업해서 일한지 4주차이다. 나는 지금 하루가 다르게 성장하며 배우고 즐겁게 일하고 있다. 다만 시간이 부족할 뿐...! 입사하자 마자 4주차까지 SI로 일했고, 이제 드디어 자사 서비스 개발에 들어간다. 그래서 4주간 일했던 경험을 피드백으로 작성해볼 것이다. 평소 나는 ORM을 주로 사용했다. Spring에 DataJPA 또는 NestJS에 TypeORM으로 코드로 추상화 된 DB 작업만 했는데 여기에선 Spring에 xml 파일 기반의 MyBatis라는 DB Mapper를 사용했다. 4주간 이 덕분에 기술 부채로 남겨뒀던 SELECT 문을 맘껏 써봤다. 지금은 SELECT문 작성과 두 개 이상의 서브 쿼리, CTE(Common Table Expression)을 사용한 복잡한 조회 문을 손..
Function DATE_FORMAT() WHERE date_format(sales_ym, '%Y%m') = date_format(date_add(now(), interval - 1 month), '%Y%m'), '%Y%m' 값을 주어진 형식에 맞춰 문자열로 변환하는 함수이다. 위처럼 sales_ym이 char(6)의 문자열일 때 이를 date_format으로 받을 수 없다. date_format은 단순 문자열이 아니라 날짜 또는 시간만 받을 수 있다. WHERE sales_ym = date_format(date_add(now(), interval - 1 month), '%Y%m') 그렇기 때문에 가장 위처럼 하는 것은 이미 202403, 202404 등의 형식으로 저장된 문자열을 의미 없이 같은 타입의..
개요 Spring JPA를 사용하여 개발을 진행하다 cascade = CascadeType.ALL과 orphanRemoval = true에 대한 예시를 많이 봐왔다. 연관관계를 갖는 엔티티 간 설정하는 것이라 들었고, 무엇인가 삭제했을 때 연쇄적으로 쉽게 삭제해준다고 막연하게 알고 있었다. 하지만 이를 남용하기엔 '삭제'와 관련 되어 있어 위험하다 판단 되어 제대로 찾아보기로 했다. 본문 Cascade.ALL은 PERSIST, MERGE, REMOVE, REFRESH, DETACH와 같은 상태 변환를 관리한다. 즉, 수정, 삭제, 추가의 작업이 일어날 때 연쇄적으로 관계를 갖는 엔티티에 영향을 주는 것이다. orphanRemoval은 부모, 자식을 가질 때 부모와의 관계가 끊어졌을 때 자식을 삭제하는 것..

A Review of Filters Spring security support는 Servlet Filter 기반이기 때문에 일반적으로 처음에 Filter의 역할을 찾아보는 것이 유용하다. 아래는 하나의 HTTP 요청을 위한 handler의 전형적인 계층을 보여준다. 클라이언트가 애플리케이션에 요청을 보내면, 컨테이너는 요청 URI를 기반으로 한 HttpServletRequest를 처리해야 하는 Filter instance와 Servlet을 포함한 FilterChain을 생성한다. Spring MVC application에서의 Servlet은 DispatcherServlet이다. 많아 봐야 하나의 Servlet은 하나의 HttpServletRequest와 HttpServletResponse를 다룰 수 있다..