분류 전체보기
-
부하테스트를 위한 더미데이터 준비개발 2024. 8. 8. 22:08
SSAFY 11기 공통프로젝트 기능 개발이 완료되었습니다.고가용성을 가진 프로젝트를 만들어보는 것이 팀의 목표였기에 부하테스트를 통한 성능개선을 진행하기로 하였습니다.부하테스트와 관련된 글은 따로 정리하여 게시할 예정입니다. 어플리케이션에서 가장 중요하고 직관적인 신입 개발자가 필수적으로 할 수 있어야하는 성능 개선이 무엇이 있을까? 생각하였습니다. 쿼리 시간 개선을 1순위 목표로 잡고 성능 최적화 작업에 들어갔습니다. 테이블에 데이터가 10건, 100건인 상황에서의 테스트는 무의미하다고 생각하였고, 따라서 테이블마다 더미데이터를 100만건 씩 준비한 뒤 부하테스트를 진행하기로 했습니다. Java 코드로 더미데이터를 준비한 과정들을 공유하고자 합니다.ApplicationRunner 인터페이스Applic..
-
트랜잭션을 유의하여 DB작업과 메일알림을 처리하는 Spring Batch Job 작성Spring 2024. 8. 7. 23:41
SSAFY 11기 공통 프로젝트를 진행하며 배치 작업을 담당하게 되었다. 이전까지 배치처리가 어떤 것인지 왜 사용하는 것인지에 대한 이해는 어느 정도 있었으나, 실제로 Spring Batch를 사용하여 배치처리하는 것은 이번이 처음이었다. 프로젝트에서 처리되는 배치작업들을 스케줄러가 아닌 Spring Batch를 선택한 근거와 Spring Batch 공식문서를 보며 기본적인 사용법과 개념들을 정리하였고 팀원들도 Spring Batch를 사용해본 적이 없었기에 정리한 내용에 대해 발표도 진행했다. 많이 모자란 자료와 발표였지만 경청해주었던 팀원들 고맙습니다. 모든 코드는 깃허브에서 확인할 수 있습니다. https://github.com/kwondh5217/springbatch GitHub - kwondh5..
-
WebSocket, Redis 의 테스트 코드를 작성하며 마주친 에러와 해결개발 2024. 8. 6. 21:39
WebSocketStompClient로 소켓 통신을 하며 Redis에 접근하는 테스트 코드를 작성하며 발생한 에러를 해결하는 과정을 담고 있습니다.WebSocket은 실제로 동작하는 것을 꼼꼼히 확인해야 프론트와 연동하는 과정에서 어려움이 적을 거 같아서 통합테스트를 진행하면서 예기치 못한 상황들을 마주하였습니다.WebSocket에 대한 테스트 코드를 작성하고자 하는 분들에게 조금이나마 참고가 되었으면 합니다. 문제 상황WebSocketStompClient 로 소켓 통신에 대한 테스트 코드를 작성테스트 케이스는 4개로 아래와 같습니다.JWT 토큰 검증이 성공하면 소켓을 연결JWT 토큰 검증이 실패하면 에러 발생소켓이 연결되면 Redis에 사용자를 저장소켓이 해제되면 Redis에서 사용자를 제거테스트 케이..
-
Stomp, Redis 로 현재 접속중인 사용자 조회하기개발 2024. 8. 5. 00:33
현재 진행중인 도서 공유 서비스 프로젝트를 진행하며 새로운 기능을 구현한 내용입니다. 요구사항지역을 기준으로 도서 검색 시 해당 지역에 접속중인 사용자 목록을 조회하는 기능이 추가되었으면 한다는 피드백이 들어왔음접근채팅 기능으로 STOMP를 사용, 메일 인증 기능으로 Redis를 사용중이었음.이 둘을 사용하면 현재 접속중인 유저의 목록을 조회하는 것이 가능하지 않을까? 생각하여 둘을 활용하는 방향으로 접근하였음.구현방법소켓 연결 시, 현재 연결을 시도하는 사용자의 지역코드로 Redis의 Set에 사용자의 정보를 저장하기로 하였음.Set을 사용한 이유는 Redis의 set은 Java와 비슷하게 중복된 값을 허용하지 않으므로 데이터에 신뢰성을 높이기 위함이었음. 같은 유저의 정보가 두명이 있다면 해당 데이..
-
Spring Batch 도입기Spring 2024. 7. 23. 21:21
SSAFY 11기 공통 프로젝트로 우주도서(우리 주변의 도서)라는 도서 인프라 취약 지역의 사람들을 위한 도서 대여 공유 서비스를 개발하는 중이다.도서 대여가 이루어지고, 반납일자가 되었음에도 반납이 되지 않는 대여정보는 연체로 간주되며, 연체가 되면 사용자의 경험치와 포인트를 차감, 메일로 연체되었다는 알림을 주어야 하는 기능을 구현해야 했고, 스프링 배치를 사용하여 구현하기로 했다. 이 작업을 스케줄러가 아닌 스프링 배치를 선택한 이유는 다음과 같다.진행하는 프로젝트는 기존의 프로젝트와 달리 사용자가 많아질 경우를 염려에 두고 진행하는 프로젝트로 대용량데이터 배치 처리를 하기에는 스프링 배치가 유리하다.처리해야할 데이터가 많을 경우, 모든 데이터를 조회하여 처리하게 되면 메모리에 많은 자원을 사용하게..
-
Spring security test 에러Spring 2024. 4. 2. 23:44
Spring security 를 학습하며 테스트 코드를 작성하고 있었는데 이상하게 시큐리티 설정이 적용이 되지 않았다. @BeforeEach void setup(RestDocumentationContextProvider restDocumentationContextProvider){ this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) .addFilter(new CharacterEncodingFilter("UTF-8", true)) .apply(documentationConfiguration(restDocumentationContextProvider) .operationPreprocessors() .withRequestDefaul..
-
SWEA 1767 프로세서 연결하기PS 2024. 2. 28. 23:36
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4suNtaXFEDFAUf SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 문제를 보고서 기본적인 조합으로 모든 경우의 수를 찾으면 되겠다고 생각하고 접근을 했다. 1. 코어를 List에 담아 부분집합을 구한다. (가장 자리에 붙어있는 코어는 제외) 2. 탐색이 가능한 코어들로 구성된 부분집합을 dfs로 돌린다. - 여기서 주의할 점은 탐색을 진행할 때 map배열의 값을 갱신했다면 다시 원상복구를 하는 코드가 필요하다. 3. 연결된 코어수가 현재까지 나온 값보다 크다..
-
커스텀 어노테이션Java 2024. 2. 13. 23:10
어노테이션을 만드는 설정 방법 스프링 어노테이션에 대한 소스코드를 보면 @Documented, @Target, @Retention이란 어노테이션을 볼 수 있다. 아래는 다음에 대한 설명들이다. 1. @Retention - @Retention은 크게 source, class, runtime 세가지로 설정하여 나의 어노테이션을 유지할 수 있다. 이 말은 무엇이냐면 source 까지만 나의 어노테이션을 유지한다면 source파일 즉 컴파일하기 전이라면 나의 어노테이션이 유지되어 있고, 컴파일이 되는 시점엔 나의 어노테이션에 대한 정보는 사라진다. class로 설정하게 되면 나의 어노테이션에 대한 정보는 .class 파일이 되어서도 여전히 유지된다. 그러나 런타임 시에는 어노테이션에 대한 정보가 사라진다. ru..