전체 글 22

QueryDSL 과 Spring Cloud 의존성 충돌 문제

Gradle 을 통해 Spring-Cloud 의존성을 추가하고 빌드하는 과정에서 위와 같은 오류를 발견했다.      문제가 되는 의존성을 찾아내기 위해 하나하나 주석 처리해가면서 빌드해 본 결과 queryDSL 의존성에서 문제가 발생한다는 것을 알아냈다.      구글링을 조금 해보니 잘 정리된 게시물을 발견하였고, 위와 같이 수정해주니 잘 작동하는 것을 확인했다.

스프링 SQL 초기 데이터 삽입 시 나타나는 문제

JPA를 사용하는 환경에서 data.sql 파일 안에 insert 쿼리를 작성해서 초기 데이터가 자동으로 삽입되도록 만들었다.      근데 위와 같은 오류가 나타난다. insert 하려는데 데이터베이스 안에 테이블이 없다는 내용인거 같다.(Entity 는 이미 만들어두었고 DDL 설정도 create-drop 으로 잘 설정해뒀다.)     spring.jpa.defer-datasource-initialization=true 그러던 중 스프링 부트의 특정 버전 이후부터는 위와 같은 옵션을 추가해주어야 데이터 삽입이 잘 된다는 걸 알 수 있었다.         참고자료더보기https://velog.io/@kero1004/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-hib..

Redis 를 사용하여 성능 최적화

오늘은 스프링 애플리케이션에 Redis 의 캐싱 기능을 적용하여 보다 빠른 응답 속도를 내도록 만들어보겠다.   0. Redis 설치로컬 PC 에서 Redis 를 설치하고 테스트할 것이다. https://github.com/microsoftarchive/redis/releases Releases · microsoftarchive/redisRedis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redisgithub.com..

기타/관리 2024.06.01

자바 Jackson 라이브러리 LocalDateTime 직렬화 문제

스프링 애플리케이션 개발 과정 중 Dto 를 반환하는 단계에서 다음과 같은 오류를 만나게 됐다. Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling  구글링해보니 자바 8 버전 이후에 추가된 LocalDateTime 에 대한 직렬화 기능을 jackson 라이브러리에서 기본적으로 지원하지 않는다고 한다.      위와 같이 명시적으로 직렬화와 역직렬화에 대한 어노테이션을 지정해서 해결해주었다.

낙관적 락을 사용해 동시성 문제 해결

오늘은 애플리케이션에서 발생한 동시성 문제를 해결해보겠다.     가장 먼저 이해를 돕기 위해 프로젝트의 간략한 구조에 대해 설명한다.  하나의 플랫폼에는 멤버들이 여러 개의 리뷰를 작성할 수 있고 각각의 플랫폼들은 리뷰의 별점들을 토대로 평점을 가지고 있게 된다. (배달의 민족 리뷰 시스템과 비슷함)  이제 동시성 문제가 발생하는 코드를 살펴보자.      리뷰를 삭제하는 메서드이다. 삭제하고 난 뒤 refreshPlatformStar() 메서드를 호출하여 플랫폼의 평점을 업데이트한다.   리뷰를 작성하는 메서드이다. 이것도 refreshPlatformStar() 를 호출하여 플랫폼의 평점을 업데이트한다.      refreshPlatformStar() 메서드의 내부 코드인데, reviewReposit..

@Transactional 과 @Async 사용 시 주의점

이번 게시글에서는 동시성 문제를 테스트하기 위해 테스트 코드를 작성하던 중 발생했던 @Transactional 문제를 기록하려 한다.   테스트 코드다. @Transactional 이 붙어있고 리뷰를 저장하고 reviewService.deleteReview() 메서드를 호출해서 리뷰를 삭제하는 간단한 코드다.      reviewService.deleteReview() 내부 코드인데 (@Async 어노테이션을 주목하자) validateReview() 메서드를 호출해서 해당 리뷰가 존재하는 리뷰인지 확인한다.      그리고 validateReview() 내에서는 리포지토리를 통해 실제 DB(or 1차 캐시) 에 접근한다.     테스트 코드를 실행해보면 위와 같은 오류가 발생하게 된다. 리포지토리를 통해..

클라우드 환경에 nginx 설치하여 분산 처리(Scale-Out)하기

이번 게시글에서는 한번에 많은 양의 요청이 들어올 때, Scale-Out 을 적용하여 분산 처리하는 방법에 대해 다뤄보려 한다.  1. Scale-Out 적용 전일단 필자의 지갑 사정이 좋지 않으므로 한 개의 EC2 서버에서 여러 개의 Docker 컨테이너를 만들어서 분산 처리에 대한 효과를 체감해보도록 하겠다.  위 사진과 같이 자바 애플리케이션의 JVM 메모리를 설정하여 다소 적은 요청에도 서버에 부하가 발생되도록 만들었다.      nGrinder를 이용해 30개의 요청을 1분동안 테스트한다.     테스트 결과이다. 에러율 5.7%를 보이면서      서버가 다운되었다.    2. nginx 설치 및 로드밸런스 설정이제 위 문제를 해결하기 위해 nginx 를 설치하여 분산 처리를 하도록 설정해보겠..

기타/관리 2024.05.24

nGrinder 설치 및 사용(부하 테스트)해보기

오늘은 내가 만든 자바 애플리케이션을 nGrinder 라는 도구를 사용해 성능 테스트를 진행해보려고 한다.  0. 동작 흐름사용하기 전에 동작 흐름을 살펴보자. 이미지 출처 그림을 보면 다소 복잡해보이지만 간단하게 설명하자면 Controller 가 서버 역할을 하고 각각의 Agent 들이 Controller 의 명령을 받아서 타겟 서버에 데이터를 전송하는 역할을 수행한다. 그리고 그에 따른 응답 정보를 Agent 가 다시 Controller 로 전송한다.  1. nGrinder 설치자 그럼 본격적으로 설치 해보자. 필자는 nGrinder 의 Controller 와 Agent 를 모두 로컬 PC 에 설치해두고 서버 컴퓨터에 부하 테스트를 진행할 예정이다.  https://github.com/naver/ng..

기타/관리 2024.05.22

nGrinder 테스트 되지 않는 문제 해결 (Connection is not completed or cached files digest weren't received until 10 sec)

nGrinder 를 통해 부하 테스트를 진행하려 했는데 위와 같이 테스트가 실패했다.  (controller 는 AWS EC2 환경에서 구동 중이었고 agent 는 로컬 PC 환경에서 구동 중인 상태였다.)  컨트롤러의 오류 내용을 보니 Connection is not completed or cached files digest weren't received until 10 sec 라고 적혀있었다. 왜 이런지 원인 파악을 위해 테스트를 실행하는 주체인 agent 의 콘솔 로그를 확인해봤다.      위와 같은 오류 로그를 확인할 수 있었고 검색해보니 agent와 controller가 12000 ~ 13000 번 포트를 사용해 통신한다는 것을 알 수 있었다.      서버 컴퓨터(AWS EC2)의  설정(인..

[APM] Scouter 설치 및 자바 애플리케이션과 연동하기 with Docker

오늘은 내가 만든 자바 애플리케이션에 Scouter를 연동시켜보려 한다. 여기서 말하는 Scouter란 무엇일까?검색하면 바로 나오지만 그냥 간단히 말해서 자바로 만들어진 성능 관리 모니터링 도구라고 정의할 수 있겠다.  0. 동작 흐름 직접 Scouter를 사용해보기 전에 간단한 흐름을 알고 사용하면 좋다. Collector(Server) 를 띄우고 각각의 agent 들이 정보를 수집하여 Collector 로 보내는 방식이다.그리고 Collector의 정보를 Client 를 실행하여 확인이 가능하다.          1. Scouter 설치 및 실행자 그럼 본격적으로 스카우터를 설치하고 실행해보자 https://github.com/scouter-project/scouter/releases/tag/v2...

기타/관리 2024.05.17