Spring (9) 썸네일형 리스트형 Hikari Connection Pool 최적화 하기 (with nGrinder) Connection커넥션이란 웹 어플리케이션 서버(WAS)와 데이터베이스(DB)사이의 연결을 뜻한다. 커넥션을 생성하려면 위와 그림과 같이 3-Way Handshake 과정을 거친다. 3-Way Handshake는 TCP 통신에서 클라이언트와 서버 간의 연결을 설정하기 위한 3단계 과정으로, 해당 과정이 쿼리를 요청할 때 마다 반복적으로 실행되면 네트워크 구간에서 병목의 원인이 될 수있다. MySQL 공식문서 에서는 MySQL 8.0 기준으로 INSERT문을 수행할 때 아래와 같은 비율로 비용이 발생한다고 안내한다.Connecting: (3)Sending query to server: (2)Parsing query: (2)Inserting row: (1)Inserting index: (1)Closing:.. Spring JDBC Batch Insert 성능 최적화 하기 프로젝트를 진행하다보면 대량의 데이터를 삽입 및 수정해야할 때가 있다. 이 경우 사용되는 다양한 방법들과 Spring JDBC Batch Insert를 활용하여 성능 최적화를 하는 방법을 알아보자. 본 글에서는 더미 데이터 10만개를 생성하여 성능을 테스트 할 예정이며, 이를 위해 'data faker' 라이브러리를 사용하였다.https://www.datafaker.net/documentation/getting-started/JPA의 save()와 saveAll() 성능 테스트@SpringBootTestclass AdminSpotServiceTest { private final Faker faker = new Faker(new Locale("ko")); private static final I.. ApplicationEventPublisher를 활용하여 서비스 강결합 문제 해결하기 ApplicationEventPublisher를 활용하여 트랜잭션 강결합 문제를 해결하는 방법을 알아보겠습니다. 프로젝트를 진행하다 보면 의도치 않게 서비스끼리 강결합되는 문제가 발생합니다. 아래 예시가 있습니다. UserService @Service @RequiredArgsConstructor @Transactional public class UserService { private final UserRepository userRepository; private final MailService mailService; public Long create(UserReqDto dto) { User user = userRepository.save(User.builder() .email(dto.getEmail()).. Spring에서 AWS RDS MySQL Replication 적용하기 현재 진행하고 있는 개인 프로젝트에서 DB로 AWS RDS MySQL 한 대만 사용하고 있다. 캐시 서버를 운용하여 DB에 가해지는 부하를 줄인다고 하더라도 트래픽의 증가에 따라 한 대 뿐인 데이터베이스에 장애가 발생할 가능성이 있다. 이에 이러한 상황에 대비하기 위해 AWS RDS 환경에서 MySQL Replication을 적용해보았다. 이해를 돕기위해 실제 프로젝트에 사용한 깃허브 레포지토리의 패키지 주소를 공유합니다. 아래 주소를 참고해주세요. https://github.com/ProjectShallWe/shallwe-backend/tree/main/src/main/java/com/project/board/global/datasource AWS RDS 설정 기존 RDS의 읽기 전용 DB 하나를 생성.. 본인 확인은 어떤 layer에서 이루어져야 할까? 개인 프로젝트를 진행하며 고민한 문제가 있다. 현재 프로젝트에서 게시판에 작성된 글이나 댓글을 update하거나 delete할 때, 작성한 본인 혹은 관리자만 삭제할 수 있게 만들고 싶었다. 1. Service Layer // PostService.class @Service @RequiredArgsConstructor public class PostService { private final UserRepository userRepository; private final PostRepository postRepository; // Service code... @Transactional public Long update(String email, Long id, PostUpdateRequestDto updat.. yaml 파일을 그룹으로 관리하기 yaml 파일을 그룹으로 관리하는 법을 알아보자. application-dev.yml application.yml 프로젝트를 진행하다 보니 yaml 파일 내 외부에 유출되서는 안되는 정보들이 늘어났다. 내 프로젝트는 RDS나 S3등 다양한 AWS 서비스들을 사용하여 connection 정보들이 yaml파일 내 산재해 있었다. 이에 외부에 공개해서는 안되는 yaml 파일들을 모듈화시켜 깃허브에 올라가지 않게 관리하기 위해 spring.profiles.group 옵션을 사용하였다. application.yml application-dev.yml application-rds.yml .gitignore spring.profiles.group 옵션은 jar파일 실행시 그룹화된 프로필 내의 모든 설정 정보를 전달한.. Springboot에서 Redis Cache 적용하기 (2022.12.05 최종 수정) 개인 프로젝트를 진행하던 중 페이지 별로 반복 호출되는 API들이 있었다. 대표적으로 게시판 별 추천글 목록, 전체 인기글 목록 등이 있었다. 이러한 반복적으로 호출되는 쿼리를 줄여 부하 분산을 하기 위해 프로젝트에 Spring Cache를 도입하였다. 왜 Redis를 선택했을까? 캐시는 크게 로컬 캐시와 글로벌 캐시 두 가지가 있다. 로컬 캐시는 각각의 WAS 내부 저장소에 캐시를 저장하는 방식이다. WAS의 리소스를 사용하기 때문에 속도는 빠르지만 Scale-Out 방식의 서버 확장시 서버간 데이터 공유가 안되어 일관성 문제가 발생할 수 있다는 문제가 있다. 글로벌 캐시는 별도의 캐시 서버를 두고 WAS에서 캐시서버를 참조하는 방식이다. 캐시 데이터를 얻을 때 마다 .. 스프링 스케줄러(@Scheduled) 사용하는 법 스프링 스케줄러를 사용하는 법에 대해 알아보자. @Scheduled 우선 스프링 스케줄러를 사용하기 위해서 간단한 세팅을 해주어야 한다. @Configuration @EnableScheduling public class ScheduledConfig { } 1. 스케줄러 설정 클래스를 만들고, @EnableScheduling 어노테이션을 붙여준다. @Scheduled(fixedDelay = 5, initialDelay = 3000) public void helloWorld() { System.out.println("Hello World"); } 2. 사용할 메서드 위에 @Scheduled 어노테이션을 붙이고, 언제 작업을 수행할지 속성을 설정한다. 속성 cron : cron 표현식을 지원한다. (자세한 내.. 이전 1 2 다음