전체 글
-
스터디룸 동시가입 상황 제어하기백엔드 : 서버공부/Spring 2024. 12. 25. 11:42
동시성 제어 구현기최근 프로젝트에서 동시성 제어 관련 이슈를 겪었다. 스터디룸인원제한이 6명인데 동시에 5명인 스터디룸에 동시에 여러 사용자가 동시 가입하는 상황을 방지하고자하는 목적에서 구현 + 학습이 시작되었다!비관적 락(Pessimistic Lock)해결책으로 먼저 알게된것은 Pessimistic Lock 이었다. 비관적 락은 이름 그대로 '비관적'인 가정에서 출발한다. 데이터 수정 시 충돌이 발생할 것이라고 가정하고, 우선 락을 걸고 보는 방식이다.데이터베이스에서의 구현먼저 데이터베이스 레벨에서 비관적 락이 어떻게 동작하는지 살펴보자. MySQL을 예로 들면, FOR UPDATE 구문을 통해 락을 구현한다. SELECT * FROM studyroom WHERE id = 1 FOR UPDATE; M..
-
람다사용하면서 느낀점백엔드 : 서버공부 2024. 11. 24. 22:18
이번에 AWS Lambda와 DynamoDB를 사용해 데이터 수집 시스템을 구현하게 되었다. 개발을 진행하면서 Spring과는 꽤 다른 패턴들을 많이 마주쳤는데, 특히 도메인 객체를 다루는 방식에서 차이점들을 발견했다. 그래서 스프링이 아님에도 간단하게 배운점 + 느낀점들을 정리하게 되었다. DynamoDB의 도메인 객체 가장 먼저 눈에 띈 것은 도메인 객체의 구조였다. Spring에서는 보통 아래와 같은 방식으로 작성했다.@Entitypublic class Event { @Id private String id; private final String title; protected Event() {}}하지만 DynamoDB에서는 조금 달랐다.@DynamoDbBeanpublic cla..
-
Spring/WebClient 맛보기백엔드 : 서버공부/Spring 2024. 11. 24. 02:05
최근 프로젝트에서 외부 API로 요청을 보내야 하는 작업을 진행하게 되었다. 최초에는 RestTemplate을 통해 구현하였지만, 최근 스프링에서는 WebClient를 권장한다는 이야기를 듣고 RestTemplate을 WebClient로 교체하는 작업을 진행하였다. 처음에는 단순하게 최신 기술을 도입한다는 생각으로 작업을 시작했지만, 적용해보니 여러 장점들을 발견할 수 있었다. 내가 WebClient로의 전환을 하고 느낀 가장 큰 장점은 빌더 패턴을 활용할 수 있다는 점이었다. 이 점이 가장 마음에 들었는데, 프로젝트에서 DTO 등에 빌더 패턴을 사용하고 있었고, 레포지토리도 복잡한 경우엔 QueryDSL을 활용하기 때문에 빌더 패턴을 사용 중이었다. WebClient를 이용함으로써 코드 스타일..
-
Querydsl 로 페이징 처리기능 타입 세이프하게 구현하기백엔드 : 서버공부/Spring 2024. 11. 23. 22:50
프로잭트를 진행하던중 깃허브 이슈리스트 조회 기능을 구현하게되었다. 그런데 이슈 리스트라는 기능 특성상 무한 스크롤로 구현해야하는 소요가 생겼고, 그에따라 서버사이드에서 페이징 처리를 해줘야했다. 일반적으로 페이징처리라 하면 `OffSet`방식을 많이 떠올릴 것이다. 하지만 이 방식은 처음부터 오프셋 값만큼 데이터를 건너뛴 후 필요한 데이터를 조회하는 방식이기때문에 오프셋 값이 커질수록 건너뛸 데이터를 스캔하는 과정에서 처리할 데이터 양이 많아지고, 때문에 성능 저하가 발생한다. 또한 오프셋 방식은 실시간 처리에서 데이터 누락 등의 문제를 발생시킨다. 때문에 나는 `Cursor` 방식의 페이징을 구현하기로 했다. `OffSet` 방식을 구현하는 것은 Page 인터페이스 등을 사용하면 ..
-
SELECT 절 최적화를 통한 API 성능개선 해보기백엔드 : 서버공부/Spring 2024. 8. 11. 13:07
JPA를 공부하던 중 전 우아한형제들의 이동욱님의 영상을 보게되었다. [수십억건에서 QUERYDSL 사용하기](https://m.youtube.com/watch?si=Jxf1-cfuPN_mFssc&v=zMAX7g6rO_Y&feature=youtu.be)라는 영상이었다. 해당영상은 QUERYDSL을 사용하시며 정말 많은 DB속에서 최적화를 하기위해 고민하신 이야기를 들을 수 있는 정말 유익한 영상이었다. 이런 좋은 영상을 보면 나의 프로젝트에 도입할 수 있는 부분은 무엇인가 찾아보게되는 습관이있다. 지금 진행중인 프로젝트에선 QUERYDSL을 사용하지않아 QUERYDSL과 직접적인 관련있는 부분은 도입하진 못했다. (추후에 꼭 도입할것이다!) 하지만 영상내용중 JPA를 사용할때 엔티티자체를 조회하는..
-
흔히 보이는 애노테이션 1탄백엔드 : 서버공부/Spring 2024. 8. 3. 16:24
프로젝트를 진행하면서 빈 등록에 흔히 쓰이는 애노테이션들로는 아래와 같이 크게 4가지가 있다.`@Service`, `@Controller`, `@Repository`, `@Component`가 있다.기본적으로 아래와 같이 클래스 최상단에 붙이며 `@ComponentScan`과 `ClassPathBeanDefinitionScanner`이 빈을 스캔하여 등록할 수 있게 해준다. 여기서 빈이란 스프링 컨테이너에서 관리하는 객체로, 이 객체들은 필요할 때 컨테이너로부터 주입받아 사용하게 된다. 기본적으로 `@Service`, `@Repository`, `@Component`는 기능이 비슷하다. 하지만 프로젝트를 진행할 때 각 클래스의 계층에 맞게 붙이는 것이 좋다. 특히 `@Repository`는 데이터 액세스..
-
DispatcherServlet 이야기...백엔드 : 서버공부/Spring 2024. 8. 2. 02:13
스프링부트를 이용해서 여러 프로젝트를 진행하던 중 문득 스프링을 처음배울때 크게 중요하게 공부하지않아 잊고있던 DispatcherServlet의 작동 메커니즘이 궁금해졌다. 정확하게 말하자면 스프링부트가 어떻게 HTTP요청을 주고받는지 궁금해졌다. 스프링부트는 기본적으로 DispatcherServlet을 통해 HTTP 요청을 받아들이고 처리 과정을 조정한다. DispatcherServlet은 웹 애플리케이션의 중앙 진입점으로, 모든 요청을 받아 핸들러로 전달하고, 결과를 다시 클라이언트에게 응답한다.대략적인 흐름이 이러하다. HTTP 요청 수신: 클라이언트가 HTTP 요청을 보내면 이 요청은 서블릿 컨테이너(예: Tomcat)로 들어온다. 서블릿 컨테이너는 이 요청을 DispatcherServlet으로 ..
-
스프링으로 소켓구현 : 세션 관리백엔드 : 서버공부/Spring 2024. 7. 15. 15:48
현재 프로젝트에서 WebRTC를 통한 실시간 서비스를 개발중이다. 그에따라 나는 스프링 부트로 시그널링서버를 구축하는 역할을 맡게 되었다.생각보다 순탄했다. WebRTC에서 시그널링서버는 클라이언트가 P2P로 서로의 정보만 최초교환 할 수 있게 해주면 된다.잘 알려진 코드들과 스프링부트의 라이브러리들로 소켓핸들러를 구현하였다.소켓핸들러는 크게 3-4가지 정도의 함수들로 구성된다.afterConnectedEstablished(),handleTextMessage(),afterConnectionClosed(),broadcastMessage()먼저 afterConnectedEstablished()함수는 소켓 연결된 후 호출되는 함수이다.나는 이 함수에게 세션을 소켓 URI에서 추출한 유저의 아이디, 스터디룸의 ..