본문 바로가기
apache jmeter로 부하테스트 해보기 2025.01.23 - [개인 공부용 프로젝트/loadbalancer.project] - 로드밸런서의 동시성 문제 해결을 위한 각종 플랜ㄴ이 글에서 이어집니다 이전 부하테스트가 왜 실패했는가를 생각해보았는데 그건 부하테스트가 아니었다초당 100건으로 부하테스트라니 내가 생각해도 웃기긴 하다그래서 오늘 상당한 과부하를 일으킬거기 때문에 내 노트북에서 테스트할 순 없고 이놈이 희생해야겠다도커에다 로드밸런서를 올리고,도커내부의 같은 네트워크 안에서 실행되기에 서버 주소도 로컬호스트에서 도커내부의 주소로 바꿔주었다인식이 잘 된다 바로 부하테스트를 진행해보자 오늘은 모두 같은 플랜으로 하기보다는, 부하를 점점 늘려서 한계치를 테스트 해볼 계획이다.우선 우리 도커가 튼튼하리라 믿고 초당 10만의 사용자를 보내보자1.. 2025. 1. 25.
로드밸런서의 동시성 문제 해결을 위한 각종 플랜 2025.01.17 - [개인 공부용 프로젝트/loadbalancer.project] - 직접 만든 로드밸런서로 다중인스턴스 관리하기지난 로드밸런서 글에서, synchronized와 atomic변수의 차이를 개념적으로 알아보았다면이번에는 concurrentHashMap과 threadLocal을 이용한 전략도 추가하고, 부하테스트를 진행해서 4가지 방법의 차이를 몸소 느껴보자  synchronizedpublic class RoundRobinSynchronized implements LoadBalancerStrategy { private int currentIndex = 0; @Override public synchronized String getNextServer(List healthySe.. 2025. 1. 23.
내 애기 로드밸런서가 드디어 숨을 쉬어요 https://github.com/roqkfchqh/loadbalancer GitHub - roqkfchqh/loadbalancerContribute to roqkfchqh/loadbalancer development by creating an account on GitHub.github.com10시간 걸렸다대충 깡통 스프링부트 프로젝트를 생성하고 헬스체킹용 컨트롤러 클래스 메서드를 추가한다근데 깡통으로 하는데 왜 10시간 걸렸냐면 아웃소싱 프로젝트로 실험하겠다고 욕심부렸다가 8시간날렸다리눅스놋북으로 환경이 바뀌어서 db쪽에서 계속 에러나서(알고보니까 이것도 ㅋ sql ddl auto설정 안 했었음 멍청이)깔끔히 포기하고 로드밸런서만 확인하는쪽으로 틀었다services: app1: containe.. 2025. 1. 21.
직접 만든 로드밸런서로 다중인스턴스 관리하기 로드밸런싱은 서버에 가해지는 부하(로드)를 분산(밸런싱) 해주는 기술이다. 클라이언트와 서버 풀 사이에 위치하며, 한 대의 서버로 부하가 집중되지 않도록 트래픽을 관리해서 각각의 서버가 최적의 퍼포먼스를 보일 수 있도록 해준다. ELB로 그냥 사용하면 되지만 어떻게 모르고 사용할 수 있겠는가 싶어서(사실 튜터님한테 과제받음 ㅋ) 직접 구현해보고, 어떤 식으로 흘러가는지 알아보도록 하자. 내가 구현할 로드밸런서는 모듈화된 단 하나의 로드밸런서고, 어떤 프로젝트에든 적용해볼수있는걸로 만들어보자.@Slf4j@Componentpublic class LoadBalancer { private final HealthCheckService healthCheckService; private int curren.. 2025. 1. 20.
Lv.13 Hash index & Sharding Hash index 사용만들었었던 비트리 인덱스를 먼저 삭제해준다. 안녕히가세요라그리고 비트리 때와 마찬가지로 해시인덱스를 손쉽게 만들어주자.해시인덱스는 정확히 일치하는 검색에서 굉 장 히 강력하지만 비트리와 큰 차이점인 범위 검색에는 사용할 수 없기에어떻게 보면 이번 과제에 가장 가장 가장 부합하는 인덱스가 아닐까?아무튼 만들었당 바로 실행해보자예?왜 비트리보다 살짝 느린것이지 꿈일거야.. 재시도(캐시 사용)해도 비트리보다 평균적으로 느리다(..)왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지? 왤까?왜지.. 2025. 1. 17.
Lv.13 닉네임 검색 개선 과제 LIKE & B+Tree index 해당 과제를 한 3가지 정도의 방법을 사용해보고 비교해볼것이다.일단 찾아본 방법은1. 비트리 인덱스2. 해시 인덱스3. 샤딩 full-text index는 사용하지 않기로 했다. 키워드 검색에는 괜찮은데 정확히 일치하는 검색에는 별로다 기본 like문부터 천천히 시작해보자!  기본 LIKE문 기반일단 백만건의 데이터에게 혹사당할 오늘의 실험체 api이다적절한 인덱스를 아직 만들지 않았기에 full table scan이 일어날 것으로 보인다심지어 stream()을 이용해 데이터를 변환중이라 상당히 서버에 가혹한 api이다 @SpringBootTestpublic class UserDataInsertTest { @Autowired private UserRepository userRepository;.. 2025. 1. 17.
Lv.9 Spring security 도입하기 spring security와 jwt를 통합해 인증 로직을 표준화하는 과제를 받았다.해당 과정을 정리해보도록 하자.  1. 기존 인증 구조 살펴보기 JwtFilter: Servlet filter를 이용해 jwt토큰을 검증하고 요청값에 사용자 정보를 설정하는 역할spring security와 독립적으로 동작한다. jwt검증과 관련된 로직을 직접 구현하고 있고 spring security의 securityContextHolder를 사용하지 않고 요청값에 데이터를 설정하고 있다. FilterConfig: FilterRegistrationBean으로 필터를 등록하고 url 패턴에 따라 요청을 처리하는 역할spring security는 자체 필터 체인을 관리하므로 별도의 filterconfig는 필요하지 않다. .. 2025. 1. 14.
Lv.6 DIPDIPDIPDIPDIPDIP Repository 의존성 역전!public class EntityFinder { public static T findByIdOrThrow(JpaRepository repository, Long id, ErrorCode errorCode) { return repository.findById(id) .orElseThrow(() -> new InvalidRequestException(errorCode)); }}public class EntityValidator { public static void isExistsById(JpaRepository repository, Long id, ErrorCode errorCode) { if(id ==.. 2025. 1. 4.
템플릿 메서드 -> 전략 패턴 public interface BoardStrategy { BoardResponseDto createPost(BoardRequestDto dto, U userInfo); BoardResponseDto updatePost(BoardRequestDto dto, U userInfo, Long id); void deletePost(U userInfo, Long id); CommentResponseDto createComment(Long boardId, CommentRequestDto dto, U userInfo); void deleteComment(Long boardId, Long commentId, U userInfo);}기존의 템플릿 메서드 패턴에서 전략 패턴으로 구조를 바꿔보았다.. 2025. 1. 3.