본문 바로가기
728x90

분류 전체보기149

[Project] 인스턴스 서버에 너무 많은 부하가 쏠리다면? 지금부터 우리 서비스의 아키텍쳐를 우선 설명하겟다. 초기 아키텍쳐고 서버에선 jwt을 엑세스토큰과 리프레쉬토큰로 검증해서 사용하고 있는데 문제점이 발생했다.토큰이 유효한지 확인하려면 아래와 같이 계속해서 데이터베이스를 조회하는 과정이 있었다. 이렇게 계속해서 데이터베이스를 거치는 과정은 비용이 클 뿐만 아니라 사용자에게 안좋은 영향을 끼치고 있었다.이러한 문제점을 데이터베이스를 거치는 대신 아래와 같이 Redis를 사용하여 서비스 로직을 단축시키는 아이디어 적용해 우리 서비스에 적용할 수 있었다. 그래서 그다음 아키텍쳐 구조는 아래와 같이 진화할 수 있었다. 우리 서버에서는 자주 조회되는 데이터에 대해서 로컬캐시로 저장하고 있었다. 캐싱전략은 Cash Aside 전략을 사용해 아래와 같은 흐름으로 동.. 2025. 4. 17.
[CS] 데이터베이스 트랜잭션 격리 수준과 낙관적 락, 비관적 락의 비교 트랜젝션에 대해서 아직 정확히 모르는 것 같아 정리하고자 한다.  우선 트랜젝션은 무엇일까?? 데이터베이스 트랜잭션(Database Transaction)은 데이터베이스에서 수행되는 작업의 논리적인 단위라고 한다. 이렇게 정의로만 들으면 이해가 잘 안된다. 논리적인 단위? 차라리 사전적 의미인 거래라고 생각하면 편할 것 같다.내가 다른사람한테 송금할때 내 계좌에서 돈이 빠져나가고 다른 사람 계좌에 입금이 되는 작업이 하나로 이루어져야되기에 이런 것을 트랜잭션으로 이해하면 좋은 것 같다. 그래서 이러한 트랜잭션은 4가지 특성이 있는데 아주 유명한 ACID 특성이다.  Atomicity (원자성)트랜잭션의 작업들이 모두 수행되거나 전혀 수행되지 않아야 함중간에 오류가 나면 모든 작업이 취소(Rollback).. 2025. 3. 28.
[Project] 적절한 풀 사이즈 설정하기 우선적으로 풀이란 무엇이고 왜 해야되는가?? 우선 풀(Pool)이라는 것은 수영장 풀이라고 생각해도 될 것 같다. (유튜브에서 봤었던거같은? 이해가 잘 되었다) 한마디로 우리가 수영장 풀에다 물을 미리 부어놓고 재미있게 놀 듯이 프로그램에서 자원을 미리 생성해두고 관리하는 것을 의미한다.보통 백엔드 관점에서는 2가지로 나뉘는 것 같다. 첫번째는 데이터베이스 커넥션 풀과 쓰레드 풀로 나뉜다. 데이터베이스 커넥션 풀: DB에 연결할 때마다 새 커넥션을 맺는 대신, 일정 수의 커넥션을 미리 만들어 두고 필요할 때 꺼내 쓰는 방식쓰레드 풀: 요청 혹은 작업을 처리할 쓰레드를 매번 새로 생성하지 않고 일정 수의 쓰레드를 유지하며 돌아가게 하는 방식 둘 다 하는 역할은 자원을 미리 생성해두는 건 똑같다. 근데 왜 .. 2025. 3. 26.
[Project] Spring 직렬화, 역직렬화 문제 - getWriter() has already been called for this response 프로젝트 진행 중 처음 보는 새로운 에러이다. 정보도 많이 없어서 게시물을 작성한다.2025-02-28T09:25:04.226Z WARN 1 --- [sejong-auth] [io-8080-exec-10] .m.m.a.ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler org.example.backend.common.exception.ExceptionControllerAdvice#handleException(HttpServletRequest, Exception)java.lang.IllegalStateException: getWriter() has already been called for this response at org.apache... 2025. 2. 28.
728x90