본문 바로가기

전체 글86

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.
모놀리식과 MSA 방식은 어떻게 다른가 들어가기 프로젝트를 진행할 때마다 항상 갖는 궁금증이 있었다. 다른 언어를 주로 사용하는 사람들끼리는 프로젝트를 어떻게 함께 진행할까? 전체 기능 중 일부만을 수정하기 위해 전체 기능을 담당하는 사람들이 이를 인지하고 대비하여야 하는 것인가? 수백 명의 백엔드 개발자들이 하나의 커다란 프로젝트로만 진행을 할 수밖에 없는 것인가? 이러한 것들을 해결하기 위한 방식이 바로 MSA인 것이다. MSA는 'Mircro Service Architecture'의 약자로 기준 별로 애플리케이션들이 분리되어 전체 서비스를 이루는 개발 방식이다. 그렇다면 MSA를 사용하기 전인 하나의 거대한 서비스를 가지는 것을 무엇이라 하는가? 바로 '모놀리식 아키텍처'라고 한다. 모놀리식 아키텍처란 용어는 MSA의 반대되는 개념으로 .. 2024. 2. 23.
Springboot 3.x.x 를 사용해보자 들어가기 최근 Springboot 프로젝트를 생성하기 위해 Spring.io(https://start.spring.io/)에서 다운을 받으려고 들어갔더니 아래와 같이 나왔다. Spring Boot의 버전과 Java 버전을 봐보자. Springboot는 3.x.x이고 Java는 최소가 17이다. 나는 Springboot 2.x.x 때 시작하였고 Java 버전은 항상 11 버전을 사용하였기에 어색한 모습이었다. 확인해 보니 Springboot 3.x.x는 22년 1월부터 정식 릴리즈 됐었고, 2.x.x 버전은 23년 11월까지 지원하는 것이었다. Springboot 프로젝트를 이전 버전으로 사용하려면 위의 방법으로 jar 파일로 다운로드하지 않고 gradle 혹은 maven에서 직접 하면 되기는 하지만, 계.. 2024. 1. 24.
JPA 영속성 컨텍스트는 어떻게 사용되는가 들어가기 예전에 JPA를 Spring Data JPA를 통해 다루면서 repository.save()를 할 시 반환 값으로 Primary Key 값이 포함된 객체를 반환하는 것에 의문이 생겼던 적이 있다. auto_increment 전략을 사용하기에 DB에 데이터가 들어간 이후에 Primary Key가 정해지기 때문이다. DB에 접근하기 전 영속성 컨텍스트에 데이터가 있으면 DB를 조회하지 않고 영속성 컨텍스트에서 데이터를 조회한다. 그리고 데이터를 저장 시 영속성 컨텍스트에 '쓰기 지연'이라는 기능 덕분에 INSERT 문을 모아두었다가 트랜잭션이 끝났을 때 한꺼번에 DB로 전송하도록 되어 있다. 그렇다면 repository.save()를 할 경우 inesrt 문은 트랜잭션이 끝났을 때 실행될 텐데 어떻.. 2024. 1. 14.
프로젝트 일지 - 쿼리 통합: 여러 번의 db접근을 감소시키자(with springboot, mysql, mybatis) 들어가기 현재 진행하는 프로젝트는 지도 위에 게시 글을 작성하는 웹 사이트이다. 게시글 페이지에 접근 시 위도, 경도의 정보와 게시글이 가지는 기본적인 정보 및 좋아요, 댓글, 댓글 좋아요 등 정보들을 확인할 수 있도록 하였다. 사용자가 게시글 페이지에 접근 시, 프론트 서버에서는 백엔드에 한번 접근 시 위 정보들을 모두 얻지만, 백엔드 서버에서 DB에 접근하는 횟수는 4번이다. DB 접근할 때마다 얻는 내용은 아래와 같다. 게시글 상세 정보 조회 게시글에 회원이 좋아요를 눌렀는지 조회 게시글에 달린 댓글 리스트 조회 댓글마다 회원이 좋아요를 눌렀는지 조회 게시글 페이지를 들어갈 시, 위 4번의 DB에 접근하는 메서드가 실행된다. 서버는 DB에 접근하는 경우에 비용이 발생하므로 최적화를 위해선 DB 접근.. 2023. 12. 25.
카프카(Kafka)를 스프링부트와 함께 사용해보자! 들어가기 최근 모놀리식 아키텍처와 MSA( MircroService Architecture)에 대해 공부를 하였다. 모놀리식 아키텍처는 하나의 애플리케이션 안에 서비스의 모든 부분을 담아서 개발을 하는 것이고, MSA는 서비스의 기능별로 다른 서버를 두어 각각의 애플리케이션으로 개발하는 것이다. 이러한 MSA는 기능별로 독립된 서버이기에 서로의 의존성을 낮추고 나눠서 개발할 수 있으며, 단위테스트가 용이하다는 장점이 있다. 단점으로는 모놀리식 아키텍처보다 훨씬 복잡하다는 점이 있다. 그렇다면 MSA 방식으로 기능을 구현한 애플리케이션들 간에는 어떻게 소통이 이루어질 수 있을까? gateway를 통해 서로 간의 api를 호출하는 방식이 있고 메시지를 주고받아 소통을 하는 방식이 있다고 한다. 메시지 처리 .. 2023. 12. 14.
카프카(Kafka)는 어떻게 사용하는가? 들어가기 최근 모놀리식 아키텍처와 MSA( MircroService Architecture)에 대해 공부를 하였다. 모놀리식 아키텍처는 하나의 애플리케이션 안에 서비스의 모든 부분을 담아서 개발을 하는 것이고, MSA는 서비스의 기능별로 다른 서버를 두어 각각의 애플리케이션으로 개발하는 것이다. 이러한 MSA는 기능별로 독립된 서버이기에 서로의 의존성을 낮추고 나눠서 개발할 수 있으며, 단위테스트가 용이하다는 장점이 있다. 단점으로는 모놀리식 아키텍처보다 훨씬 복잡하다는 점이 있다. 그렇다면 MSA 방식으로 기능을 구현한 애플리케이션들 간에는 어떻게 소통이 이루어질 수 있을까? gateway를 통해 서로 간의 api를 호출하는 방식이 있고 메시지를 주고받아 소통을 하는 방식이 있다고 한다. 메시지 처리 .. 2023. 12. 9.