본문 바로가기

Spring

Nginx로 로드 밸런싱과 부하 테스트 1. 서론2. 테스트3. 결론1. 서론프로젝트에서 '한 개의 Nginx 서버'가 '두 개의 스프링 서버'로 요청을 로드 밸런싱 하도록 했습니다.그에 따라 서버를 scale-out 하면 어느 정도의 부하까지 견딜 수 있는지 테스트하고자 했습니다. 2. 테스트취준생 입장에서 서버 요금은 부담스럽기 때문에, AWS와 네이버 클라우드의 프리티어를 최대한 활용했습니다. 필요한 서버Spring WAS 서버 2개Nginx 로드 밸런싱 서버 1개 (네이버 클라우스 micro server)RDS 1개 (AWS  db.t3.micro)10만 User, 10만 Contract, 30만 Board 데이터 부하JMeter로 초당 300 스레드를 20회 반복하여, 총 6000번 요청했습니다. 테스트 목록2-1. Spring 서버.. 더보기
Spring 세션과 Redis를 활용한 조회수 증가 중복 방지 1. 서론2. 여러 방법과 비교3. 구현4. 마무리 1. 서론프로젝트를 진행하면서 게시글의 조회수를 카운트하도록 했습니다.여러 서비스들을 살펴봤을 때, 새로고침을 할 때마다 조회수가 증가되는 서비스가 있었고, 새로고침하여도 조회수가 증가 되지 않도록 중복을 방지한 서비스도 있었습니다. 다른 서비스들은 조회수 증가의 중복을 방지하기 위해 어떤 방법을 사용하는지 알아봤는데, 그 중 대표적으로 유튜브는사용자가 의도적으로 동영상을 시작한다사용자는 적어도 30초동안 영상을 시청한다최대 반복수는 300번으로 예상된다최대 반복수를 넘었을 시 봇을 이용하는지 유효성 검사 단계가 수행되면서 더 이상 조회수가 증가하지 않는다조회수 증가하지 않는 상황많은 장치에 대해 하나의 IP 주소를 사용하여 동시에 동일한 영상을 시청할.. 더보기
(1) Querydsl 성능 최적화와 테스트 목차1. 서론2. dto로 조회하기3. 성능 테스트4. 결론 1. 서론기존에 JPA를 사용하면서 생기는 N+1 문제를 모두 해결했었습니다. 또한 fetch join, batch_size를 사용하여 쿼리 횟수를 최소화하였으며, 중복되는 insert 쿼리를 jdbc template을 사용하여 bulk 쿼리로 대체하는 모든 최적화 과정을 마쳤었습니다. 하지만 DTO로 필요한 데이터만 가져와 최적화하는 것은 하지 않았기 때문에, 이 글에서 기존의 조회 API를 DTO로 조회하면 성능 차이가 얼마나 생길지, 적용 후 테스트 하고자 합니다. 2. DTO로 조회하기DTO로 조회하는 것을 기존에 하지 않았던 이유1:N 관계에 있는 컬렉션은 DTO로 바로 조회하지 못합니다. one 쪽 엔티티의 id(들)을 사용하여 ma.. 더보기
스프링 JPA 테스트 코드에 무심코 적용한 @Transactional 스프링 프로젝트에서 많은 사람들이 JUnit으로 테스트 코드를 작성할 때, @Transactional 어노테이션을 사용한다. 하지만 Spring Data JPA와 함께 Service 테스트 클래스에 @Transactional을 무심코 사용한다면 예상하지 못한 테스트 실패나 누락이 발생할 수 있다. 문제 상황 1:N 연관 관계에 있는 엔티티들을 fetch join으로 잘 조회되는지 테스트하고자 했다. @Entity public class Board extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "board_id") private Long boardId; @ManyToOne(fetch = F.. 더보기