spring boot18 다중 서버일 경우 Kafka를 통한 채팅 서버 중계(with stomp, spring boot) 들어가기 이 글은 채팅 프로그램 구현 후, 다중 서버일 경우 발생할 수 있는 문제를 해결하기 위해 카프카(kafka)를 적용하는 과정을 담은 글로, https://khdscor.tistory.com/122에서 구현한 채팅 프로젝트로부터 코드가 이어진다. Spring boot with React: STOMP를 통해 채팅 시스템을 구현해보자(With Mysql, MongoDB)(2)들어가기 이 글은 https://khdscor.tistory.com/121에서 이어진다. 여기선 의존성, Config 파일 등 세부적인 파일을 다루지 않고 바로 비즈니스 로직을 작성한 과정을 담았다. 이에 대해 궁금한 것은 이전khdscor.tistory.com 이전에 토이 프로젝트로 STOMP를 통해 Spring boot,.. 2024. 6. 17. Kafka - Producer 메시지 분배 전략(파티셔닝 전략)과 배치(feat. 하나의 파티션으로만 메시지가 전송된다?) 들어가기 Spring boot와 Kafka를 같이 사용하는 토이 프로젝트를 진행 중이었다.Kafka ui 툴을 통해서 메시지가 잘 전송이 되나~ 확인하려고 했는데 내 눈을 의심하였다...어째서 파티션 하나로만 메시지가 전송된거지?? Kafka를 공부했을 때는 파티션을 돌아가면서 메시지가 전송된다고 했는데? 처음에 당혹함을 감추지 못하였지만, 찾아보니 이는 단순한 이유였다. 공부했었던 파티션에 균등하게 분배하는 것은 파티션 분배 전략 중 라운드로빈(Round-Robin) 방식이고, 특정 파티션에 레코드를 축적하다가, 일정량이 채워지면 다른 파티션으로 이동하는 것이 스티키(Sticky) 방식이라고 한다. 스티키 방식은 파티션 전환 비용을 줄이고, 네트워크의 효율성을 높이며, 레코드의 일괄 전송(batch .. 2024. 6. 6. 파일 업로드, 다운로드, 이미지 미리보기 구현(Spring boot With React) 들어가기 Spring boot로 프로젝트 도중 채팅방을 구현하면서 채팅 내용뿐만 아니라 파일을 업로드, 다운로드할 수 있도록 추가하려고 한다. 그러기 위해선 파일을 업로드 후 서버에서 파일을 보관하고, 다운로드 기능을 학습해야 한다. 이 글에선 간단한 프로젝트로 파일 업로드, 다운로드 기능을 Spring boot, React로 구현하는 과정을 담았다.HTTP를 통한 파일 업로드, 다운로드를 구현하였다. 업로드할 때는 MultiPartFile로 파일을 받고, 다운로드 시에는 byte[]와 같은 형태로 파일을 반환하도록 하였다.(또 다른 방법으로는 ResponseEntity가 있다고 하지만 이 글에서는 사용하지 않았다.) java 17, spring boot는 3.2.3를 사용하였고 데이터베이스는 h2.. 2024. 5. 30. Spring boot with React: STOMP를 통해 채팅 시스템을 구현해보자(With Mysql, MongoDB)(2) 들어가기 이 글은 https://khdscor.tistory.com/121에서 이어진다. 여기선 의존성, Config 파일 등 세부적인 파일을 다루지 않고 바로 비즈니스 로직을 작성한 과정을 담았다. 이에 대해 궁금한 것은 이전 글을 참고하길 바란다.이 글에선 Mysql과 MongoDB과 함께 Spring boot와 React 연동 및 STOMP를 통한 간단한 채팅 시스템을 구현하는 과정을 작성하였다. 참고로 Spring boot 버전은 '3.2.5'이다.구현한 내용은 크게 3가지로 아래와 같다.1. 채팅방 리스트 조회, 새 채팅방 생성 2. 채팅방 별 이전에 작성한 채팅 리스트 조회3. 메시지 전송Mysql에는 채팅방 테이블만, MongoDB에는 채팅 내용 컬렉션만을 생성할 것이다.서번 단(Sprin.. 2024. 5. 17. Spring boot with React: STOMP를 통해 채팅 시스템을 구현해보자(With Mysql, MongoDB)(1) 들어가기 Spring boot로 채팅방을 구현하는 프로젝트를 진행하려고 한다. 채팅방은 실시간으로 채팅 내용을 저장할 수 있게 데이터베이스에 저장하도록 생각하였다. 하지만 채팅내용이 보내질 때마다 데이터베이스에 저장을 하는 비용이 발생한다. 이를 위한 해결 방법으로는 메모리에 채팅 내용을 저장해 두고 스케줄링하여 일정 주기마다 데이터베이스에 Bulk Insert 하는 방식, RDB보다 데이터 접근 비용이 적은 NoSQL을 사용하는 방식 등이 있다.나는 두번째 방법을 선택하여 NoSQL 중 MongoDB를 사용하기로 하였다.처음 프로젝트 설정부터 연동 및 React 부분까지 두 개의 글로 나눠서 작성할 것이다.이 글에선 데이터베이스 연동 없이 Spring boot와 React 연동 및 STOMP를 통한 .. 2024. 5. 13. Spring boot With MongoDB - WebFlux를 통해 비동기적으로 MongoDB에 접근해보자. 들어가기 이전에 채팅방 채팅 내용을 저장하기 위해서 MongoDB를 사용해 본 적이 있었다. Gradle 의존성을 'spring-boot-starter-data-mongodb'로 설정하였었는데, 알고 보니 'spring-boot-starter-data-mongodb-reactive'라는 의존성이 따로 있었다. 이 두 의존성의 차이는 동기적으로 접근할 것인가, 비동기 적으로 접근할 것인가였다. 'reactive'가 추가된 의존성이 비동기 적으로 접근하는 것이다. 찾아보니 채팅 애플리케이션에서 채팅 내용을 저장하고 조회하는 기능은 실시간성(real-time)이 중요한 요소이기에, 비동기적인 처리가 더 적합할 수 있다고 한다. 이는 아래의 비동기 처리의 장점과 동기 처리의 단점을 통해 확인할 수 있다. 비.. 2024. 4. 23. Docker compose를 통한 Nginx, Spring boot, React, Mysql 연동 및 배포 서론 최근 프로젝트에서 도커를 통해 Spring boot와 React 프로젝트를 진행하면서 리버스 프록시 역할을 수행하는 Nginx를 같이 실행해 보았다. 추가로 Mysql까지 실행하며 모든 컨테이너는 Docker compose에 의해 실행될 수 있도록 구현하였다. Spring boot는 비즈니스 로직을 처리하며 Mysql과 연동하여 데이터를 저장, 처리, 조회하는 기능을 담당한다. React는 사용자와 상호작용하는 부분으로 Nginx 서버를 통해 구동되며, Nginx 서버는 사용자 요청을 url에 따라 Spring boot로 보낼지, React로 보낼지 정하는 리버스 프록시 역할을 수행한다. 이 글에서는 docker-compose를 통해 각 서비스를 배포한 과정을 기록한 것이다. 본론 우선 실행을 위한.. 2024. 4. 7. Spring boot with MongoDB - Spring Data MongoDB를 사용해보자. 들어가기 Springboot로 채팅방을 구현하는 프로젝트를 진행하려고 한다. 채팅방은 실시간으로 채팅 내용을 저장할 수 있게 데이터베이스에 저장하도록 생각하였다. 하지만 채팅내용이 보내질 때마다 데이터베이스에 저장을 하는 비용이 발생한다. 이를 위한 해결 방법으로는 메모리에 채팅 내용을 저장해두고 스케줄링하여 일정 주기마다 데이터베이스에 Bulk Insert 하는 방식, RDB보다 데이터 접근 비용이 적은 NoSQL을 사용하는 방식 등이 있다.나는 두번째 방법을 선택하여 NoSQL 중 MongoDB를 사용하기로 하였다.그러기 위해선 MongoDB에 대한 사용방법을 알아야 한다.이 글은 MongoDB에 대한 내용과 Spring boot 프로젝트에서 Spring Data MongoDB를 통해 데이터 저장, .. 2024. 3. 7. Spring boot - 서버의 존재하지 않는 URL 접근 시 예외 처리 프로젝트를 진행하면서 서버의 존재하지 않는 URL로 접근 시, 아래와 같이 404 Status코드와 함께 에러메시지가 반환되는 것을 보았다. 이 페이지는 사용자가 보기에 매우 가독성 없는 페이지다. 이제 Spring boot에서 간단한 설정을 통해 위 페이지를 사용자의 가독성을 향상하도록 수정해 보겠다. 여기서 사용할 것은 예외 처리를 위한 @ExceptionHandler이다. @ExceptionHandler에 대해 궁금한 사항은 https://khdscor.tistory.com/29를 참고하길 바란다. 스프링 @ExceptionHandler 를 통한 예외 처리스프링으로 프로젝트를 진행하다 보면 정해진 입력값이 잘못되거나 없거나 하는 등 다양한 예외들이 발생할 것이다. 아래와 같이 흔히 JPA로 데이터를.. 2022. 4. 9. 이전 1 2 다음