트랜잭션 격리 수준과 동시성 제어 이야기 (1) : @Transactional과 synchronized
·
etc
들어가기 전.. Spring @Transactional with synchronized keyword doesn't workLet's say I have a java class with a method like this (just an example) @Transactional public synchronized void onRequest(Request request) { if (request.shouldAddBook()) { if (database.stackoverflow.com해당 스택오버플로우 질문을 참고하여 글을 작성하였습니다. 프로젝트를 진행하면서 마주친 동시성 문제의 해결을 위해 자료를 찾아보던 중 `@Transactional`과 `synchronized`를 함께 사용하면 문제가 발생한다는 것..
[Spring Data Redis] Redis repository에서 existBy로 올바르게 값이 검색되지 않는 문제 해결
·
Java
배경서버에서 refresh token을 저장하는 DB를 mySql에서 Redis로 변경하면서 기존에 Redis를 사용하고 있는 방식대로 Spring Data Redis Repository를 적용하게 되었습니다. 토큰 재발급 요청이 들어오는 경우 Redis에 해당 refresh token이 존재하는지 검증이 필요하기 때문에, 레포지토리에 다음과 같이 `existsByToken` 메서드를 정의해 두었습니다.@Repositorypublic interface RefreshTokenRepository extends KeyValueRepository { boolean existsByToken(String token);}@RedisHash(value = "refresh", timeToLive = 3600L)pu..
[Java Spring] Swagger에서 multipart/form-data 테스트 시 Content-Type 'application/octet-stream' is not supported 예외 발생
·
Java
배경진행 중인 프로젝트에서 새로운 펫의 정보를 등록하는 경우 펫의 정보와 함께 프로필 이미지를 등록할 수 있도록 하는 요건이 있었습니다.따라서 POST /pet 요청을 하는 경우 JSON 값과 이미지를 함께 담아서 보내야 했고, 이를 위해 Content-Type을 `multipart/form-data`로 지정해서 request 요청을 받도록 구현했습니다. 또 추가적으로 api 문서화를 위해 swagger에서도 해당 엔드포인트를 테스트할 수 있도록 다음과 같이 구성했습니다.문제 상황그런데 이상하게도 postman로 진행할 때는 문제가 없었는데, swagger를 통해 테스트를 진행하면 예외가 발생하면서 펫 등록이 이루어지지 않는 상황이 발생했습니다. 해결을 위해 예외 메시지를 확인해 보니 Content-Ty..
[Spring Security] anyRequest().permitAll() 설정 변경 후, login 요청 시 404 예외 발생 문제
·
Java
배경로그인 기능을 정상적으로 구현하여 적용하게 된 후, 이제 모든 api에 테스트 요청을 보낼 때 먼저 로그인을 통해 액세스 토큰을 추가하여야 하는 환경으로 변경되었습니다. 그런데 api 요청 시마다 계속 토큰을 추가하는 작업은 테스트 단계에서는 다소 번거로울 수 있었기 때문에, 테스트 기간에는 임시적으로 액세스 토큰 없이도 api 호출이 가능하게 변경을 해달라는 팀원들의 요청이 있었는데요. security 설정에서 현재는 제한된 부분들만 permit이고, 나머지 부분은 authenticated 인 상황이라 간단하게 기존 부분을 주석처리 후, anyRequest().permitAll() 를 추가하면 아무 문제 없이 로직이 잘 작동하리라고 예상했습니다.// 기존 설정http.authorizeHttpRequ..
왜 내가 만든 서버는 서버가 먼저 요청을 끊는 걸까? 궁금증 해결기
·
etc
배경네트워크 스터디를 진행하면서 HTTP 1.1에서는 일반적으로 연결을 끊을 때 클라이언트 측이 먼저 close를 통해 FIN 플래그를 1로 만든 패킷을 보낸다는 사실을 알게 되었습니다. 이에 제가 구현한 WAS 서버에서도 마찬가지인지가 궁금해져 WireShark를 통해 패킷을 주고받은 내역을 확인해 보게 되었는데, 저의 WAS 서버에서는 클라이언트 측이 아닌 서버 측에서 먼저 FIN 플래그를 보내 연결을 끊고 있었습니다. 물론 서버 - 클라이언트 둘 다 먼저 연결을 끊는 것이 가능하기 때문에 크게 문제 되는 상황은 아니지만, 학습 차원에서 WAS 서버와 통신을 진행할 때도 클라이언트가 먼저 FIN 요청을 보내도록 하는 상황을 만들어 보고 싶었습니다.기존 코드 구조소켓을 이용해 실제로 클라이언트의 요청을..
스레드 풀 사용시 vs 직접 스레드 사용시 시스템 리소스 비교해보기
·
Java
배경소켓 네트워크 통신 서버에서 Thread 대신 Thread Pool을 사용하는 것에 대한 장점이 무엇인지 이론적으로는 이해하고 있었으나, WAS 서버 프로젝트를 진행하면서 작고 간단한 규모의 서버 어플리케이션에서도 두 방법 사이에 눈에 보일만한 차이가 나는지 궁금해져 리소스 측정 도구들을 이용해 관찰해 보고자 했습니다.스레드 풀의 장점일반적으로 리퀘스트 요청 마다 스레드를 만들어서 작동시키는는 것에 비해, 스레드 풀을 이용해 미리 스레드를 생성해 놓고 사용하는 것의 장점은 성능과 관련이 있습니다.스레드의 생성-종료 시 리소스의 소비량 감소대부분의 경우에서 자바의 스레드는 OS 네이티브 스레드에 직접적으로 매핑됩니다. 따라서 스레드를 새롭게 생성하는 작업은 시스템 리소스를 많이 소비하게 됩니다.반면 미..