macOS에서 nGrinder 설치 - 엔그라인더 환경 설정 📌 서론 우리가 진행하던 프로젝트의 베타 버전이 배포되었다. 이제 부하 테스트를 진행하기 위해 nGrinder를 사용해 보기로 했다. 실제로 부하 테스트를 진행하기 앞서 간단한 환경 설정을 하는 과정을 설명해 보겠다. 0. nGrinder란? nGrinder는 오픈 소스 기반의 성능 부하 테스트 도구로, 네트워크 상에서 다수의 사용자 요청을 시뮬레이션하여 웹 애플리케이션의 성능을 테스트하고 분석할 수 있게 해 준다. Java 기반으로 개발되었으며, Naver에서 만들었다. 이 도구는 크게 두 가지 주요 컴포넌트로 구성되어 있다. 컨트롤러(Controller) 테스트의 생성, 관리, 모니터링, 그리고 결과 분석을 담당하는 중앙 관리 시스템이다. ..
전체 글
하다보니 재미있는 AI에 빠져있는 평양냉면7 문의사항: ysoil8811@gmail.com폴링(Polling) 사용해서 CompletableFuture 결과 확인하기 📌 서론 이전 글에서 CompletableFuture를 사용해서 서버에서 비동기를 적용한 내용을 작성했다. 그 후에 서버에서 비동기로 처리한 결과를 클라이언트에게 어떻게 알려줄까?라는 게 궁금해져서 해당 내용을 알아보았다. 🔻 CompletableFuture가 무엇인지 궁금하다면? 🔻 CompletableFuture를 활용한 비동기 메일 전송 구현 CompletableFuture를 활용한 비동기 메일 전송 구현 CompletableFuture를 활용한 비동기 메일 전송 구현 📌 서론 Java Mail Sender를 사용하여 메일 전송 기능을 개발하는 과정에서, 외부 라이브러리의 동기적 특성으로 인해 응답 시간이 길어지는 문제에 ..
CompletableFuture를 활용한 비동기 메일 전송 구현 📌 서론 Java Mail Sender를 사용하여 메일 전송 기능을 개발하는 과정에서, 외부 라이브러리의 동기적 특성으로 인해 응답 시간이 길어지는 문제에 직면했다. 이러한 문제를 해결하기 위해, 메일 전송 로직을 비동기적으로 처리하기로 결정하였고, 이 과정에서 CompletableFuture를 도입했다. CompletableFuture의 사용은 비동기 프로그래밍의 복잡성을 줄이고, 애플리케이션의 성능을 향상시키는 데 큰 도움이 되었다. 아래에서 Future와 CompletableFuture의 차이점, 그리고 실제 서비스 코드에 적용한 예를 통해 비동기 프로그래밍의 장점을 설명해보겠다. Future와 CompletableFuture 차이 기..
HTTP 메서드 이해: 멱등성, 안전성 및 사용자 권한 검증까지 📌 서론 REST API에서 사용되는 HTTP 메서드들은 클라이언트가 서버에게 어떤 작업을 요청하는 방식을 정의한다. 이 메서드들은 특정 리소스에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행하는데 사용된다. 여기에는 주로 사용되는 여섯 가지 HTTP 메서드가 있으며, 각각의 특성과 멱등성 여부, 그리고 몇몇 메서드에 대해서 사용자 권한 검증을 아래에서 설명하겠다. 멱등성(Idempotency)이란? 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 말한다. 다른 말로는, 멱등성 메서드에는 통계기록..
AtomicInteger를 활용한 파일 저장 순서 동기화 문제 해결 📌 서론 멀티스레드 환경에서 동기화 문제는 개발자에게 항상 도전적인 문제 중 하나다. 특히, 파일 업로드 기능을 구현할 때 여러 파일을 순차적으로 저장하려고 할 때, 동일한 순서 값이 중복되어 발생하는 문제는 더욱 복잡하다. 이 글에서는 Java의 AtomicInteger 클래스를 사용하여 이러한 동기화 문제를 어떻게 해결했는지 공유하고자 한다. 문제 상황 Spring Boot와 AWS S3를 사용하여 파일을 업로드하고 관리하는 레시피 관리 시스템을 개발 중이었다. 각 레시피에 여러 이미지 파일을 첨부할 수 있으며, 각 파일은 순서대로 저장되어야 했다. 그러나 여러 파일을 동시에 업로드할 때, 모든 파일의 순서(fileOrder)가 동일..
QueryDSL 사용 시 자동 업데이트 되지 않는 JPA Auditing 수정 날짜 문제 해결 방법 📌 서론 프로젝트를 개발하다가 업데이트 관련 로직은 거의 QueryDSL을 사용하고 있었다. 그러다가 updateDttm 컬럼값이 바뀌지 않는 걸 확인하고 이를 수정하려다 알게 된 사실을 정리해보려고 한다. Auditing 필드 선언 JPA와 QueryDSL을 사용하여 엔티티의 생성 날짜와 수정 날짜를 자동으로 관리하는 것은 매우 흔한 패턴이다. 다음 코드는 우리가 작성한 생성 날짜와 수정 날짜 클래스다. /** * Auditing 필드 - 생성시간 등록 * 이 필드를 상속받으면 생성시간만 auditing이 적용된다. */ @ToString @Getter @MappedSuperclass @EntityLis..
QueryDSL에서 Projections.constructor 사용해서 SQL 함수 사용하기 문제 상황 SubComment와 Recipe 엔티티에는 다음과 같이 LocalDateTime 타입으로 선언된 생성 날짜가 있다. @CreatedDate @Column(name = "create_dttm", nullable = false) private LocalDateTime createDateTime; 이렇게 선언되어 있는 생성 날짜를 각각의 DTO객체인 SubCommentListResponseDto와 RecipeListResponseDto에서 String 객체인 createDate로 맵핑해서 조회하려고 시도했다. private String createDate; QueryDSL에서는 TO_CHAR 함수를 사용하..
스칼라 서브쿼리(Scalar Subquery)에서 Limit절 오류 해결 문제 상황 레시피의 썸네일 이미지를 가져오기 위한 쿼리 작성 시 문제가 발생했다. 목표는 각 레시피별로 fileOrder가 가장 낮은, 즉 가장 먼저 업로드한 썸네일 하나만을 추출하는 것이었다. 이를 위해 JPQL을 사용하여 서브쿼리를 구성하고, orderBy와 limit(1)을 통해 단일 결과를 얻으려 했다. 하지만 예상과 달리 문제가 발생했다. // 레시피 썸네일 조회 서브쿼리 JPQLQuery recipeThumbnailSubQuery = JPAExpressions .select(recipeFileEntity.storedFilePath) .from(recipeFileEntity) .where(recipeFileEntity.re..