본문 바로가기
728x90

전체 글410

직접 만들어 보면서 이해하는 웹소켓 (1) - 왜 웹소켓(WebSocket)인가? 💡 왜 웹소켓(WebSocket)인가? 포털 사이트의 실시간 검색 순위, 주식이나 코인 거래소의 실시간 차트 정보, 음악 사이트의 실시간 음원 순위 등 웹 기반의 애플리케이션에서 실시간 정보 공유는 사용자 경험을 대폭 향상할 수 있는 중요한 요소이다. 그러나 전통적인 HTTP 통신 방식은 이러한 실시간 정보 공유에 몇 가지 제약이 있다. 이 글에서는 실시간 통신에 있어 기존 HTTP 통신 방식의 문제점에 대해 알아보고 이를 해결할 수 있는 몇 가지 방법을 논의한 후 왜 웹소켓이 실시간 통신에 있어 가장 우수한 선택인지를 직접 구현해 봄으로써 이해하려고 한다.🥲 실시간 통신에서 HTTP의 한계HTTP 통신은 클라이언트가 서버에 요청을 보내고, 서버가 그 요청에 대한 응답을 보내는 요청-응답(Reque.. 2024. 5. 10.
비전공자, 부트캠프 출신 백엔드 개발자의 솔직한 취업 1년 후기 1년 차 목표 달성했나요? - 취업한 지 3주 정도 지났을 때 블로그에 1년 목표를 세웠는데, 부끄럽지만 달성에 실패했다. 두 가지 목표는 자격증 취득이었고 한 가지 목표는 개발 공부에 관한 내용이었다. 자격증 취득부터 얘기하면 아직도 쿠버네티스 공부 중이다. 시험은 작년 사이버 먼데이 때 응시 신청을 해두었고 1년 기한이니 대략 올해 12월 초까지 시험에 2 번 응시할 기회가 있다. 현재로서는 응시 만료 기한 전까지 충분히 공부하고 안전하게 합격할 생각이다. aws의 경우 현재는 전혀 공부할 생각이 없다. 회사에서 오라클 클라우드를 사용하기도 하고 아직까지 클라우드 관련 세팅까지 깊게 관여할 기회나 일이 없기 때문에 완전히 후순위로 밀려버렸다. 나중에 이직하게 되었을 때 해당 회사에서 aws를 사용한다.. 2024. 4. 20.
자바에서 중복 요소를 남김없이 모두 제거하는 방법 💡 자바에서 리스트의 중복 요소를 제거하는 대표적인 방법에는 두 가지가 있다. 1. Set을 이용한 중복 제거 List list = new ArrayList(Arrays.asList("A", "B", "A", "C", "B")); Set setWithoutDuplicates = new LinkedHashSet(list); List listWithoutDuplicates = new ArrayList(setWithoutDuplicates); System.out.println(listWithoutDuplicates); // 출력: [A, B, C] Set은 자바 컬렉션 프레임워크의 인터페이스 중 하나로 중복된 요소를 허용하지 않고 순서를 보장하지 않는 자료구조이다. 중복을 허용하지 않기 때문에 동일한 요소가 .. 2024. 3. 21.
JPA Specification을 이용하여 다중 조건 검색 로직을 구현해보자. 🤔 다중 조건 검색이란? 다중 조건 검색이란 카테고리 검색, 상세 검색 등과 같이 쇼핑몰 등에서 여러 필터 조건으로 검색된 결과를 축소시켜 사용자가 원하는 결괏값만을 도출하기 위해 사용한다. 이를 어떻게 구현할 수 있을까 고민해보면 한 가지 방법으로 귀결되는데 바로 '동적 쿼리'이다. 사용자가 원하는 필터링에 맞춰 조회 쿼리를 날려주면 되는 것인데 결국 매 요청마다 쿼리문이 달라지게 된다는 이야기이므로 Jpa에서 제공하는 기본 메서드와 같이 정해진 쿼리에 value만 다르게 보내는 것과는 다른 방법을 사용해야 한다. 📜 테스트에 사용될 View member 테이블과 team 테이블에서 추출하여 만든 view이다. view나 테이블 구조에 대해 자세히 알고 싶다면 이 글을 참고하자. 💡 대표적인 방법 세 .. 2024. 1. 31.
뷰(View)에 대해 알아보고 엔티티(Entity) 객체와 매핑해보자. 📌 MySQL에서의 뷰(View) 뷰(View)는 가상의 테이블로 하나 이상의 테이블로부터 개발자가 미리 유도한 결과 집합을 보여준다. 데이터를 실제로 저장하지 않고 쿼리를 실행할 때마다 기본 테이블에서 데이터를 가져와서 결과를 생성한다. 기존 테이블을 커스텀한, 읽기 전용의 테이블이라고 볼 수 있으며 매번 뷰가 참조하는 실제 테이블에 수정, 삭제 등의 쿼리가 있을 때마다 변경된 결과로 갱신된다. 일반적으로 뷰를 통해 데이터를 수정하거나 삭제하는 것은 불가능하며 수정 작업은 해당하는 기본 테이블에서 직접 수행되어야 한다. MySQL의 경우 옵션을 이용하여 수정이 가능하기는 하나 기존 데이터의 가공과 조회를 위한 용도로 활용하는 것이 적합하다. 데이터의 가공, 필터링, 보안 설정 등 다양한 용도로 활용된다.. 2024. 1. 30.
수만명의 회원 데이터를 데이터베이스에 효과적으로 인서트하기 (2) - bulk & batch insert 💡 지난 글에서는 Spring Data JPA를 활용한 저장 방법 중 save()와 saveAll() 메서드를 비교해 보았다. 당연하게도 saveAll()이 더 빨랐지만 동작 방식은 생각했던 것과 달랐다. 일괄적으로 insert 쿼리가 나갈 것이라고 생각했던 것과는 달리 save와 마찬가지로 단일 insert 쿼리가 나가는 것을 확인할 수 있었다. 이 글에서는 그 이유를 찾아보고 최종적으로 bulk insert로 회원 데이터를 저장했을 때 어느 정도 속도 차이가 나는지를 테스트해보려고 한다. 🥸 기본키 매핑 전략 중 IDENTITY를 사용하면 Bulk Insert를 할 수 없다! JPA에서 IDENTITY 전략을 사용하면 일부 제약 사항이 있다. 이 제약 사항은 IDENTITY 전략이 특정 DBMS에서 .. 2024. 1. 25.
수만명의 회원 데이터를 데이터베이스에 효과적으로 인서트하기 (1) - save() vs saveAll() 💡 현재 회사에서 개발 중인 앱에는 회원 초대 기능이 있다. 회원 초대는 앱과 웹 두 가지 방식으로 이루어진다. 앱에서는 회원의 이름과 전화번호를 일일이 입력하여 초대가 가능하고, 웹에서는 직접 입력 기능에 더하여 별도의 회원 데이터가 있다면 지정된 양식의 엑셀 데이터로 업로드해 초대가 가능하다. 백엔드 서버 회원 초대 api는 내가 만들었는데 초기 개발 당시에는 대용량의 회원 데이터가 업로드될 때의 상황을 고려하지 않았다. 따라서 수백 건의 데이터는 문제없이 업로드가 가능했지만, 천, 만 단위가 넘어가는 상황에서는 매우 느려질 것이 분명했다. 미래에 서비스가 커져 대용량 데이터가 업로드되는 상황이 온다면 분명 문제가 발생할 것이다. 이를 미리 대비하기 위해 공부하고 테스트한 과정을 기록하려고 한다. 📌.. 2024. 1. 23.
kubernetes - Node Update(drain, cordon, uncordon) 🛠️ 쿠버네티스에서의 클러스터 유지보수 쿠버네티스의 클러스터는 여러 개의 노드로 구성되어 있다. 각 노드는 하나의 인스턴스로 구성되어 각자에 맞는 OS와 Kubelet 버전이 있을 것이다. 만약 이 OS 혹은 kubelet 버전을 업데이트하거나, 하드웨어를 교체하는 등 노드의 유지보수 작업이 수행될 때 파드의 서비스 중단 없이 안전하게 노드를 유지 보수하려면 어떻게 해야 할까? 쿠버네티스에는 pod의 스케줄링 정책을 커스텀하게 설정할 수 있는 여러 명령어를 제공한다. 이를 통해 업데이트가 필요한 노드의 파드를 다른 노드로 옮기고 안전하게 업데이트를 진행할 수 있다. 📌 drain kubectl drain --ignore-daemonsets drain은 '물을 빼다'라는 뜻으로 쿠버네티스에서는 해당 노드의.. 2024. 1. 20.
728x90