프로젝트

api_request_history에 50만 개의 데이터를 넣어두고 SELECT * FROM api_request_history ORDER BY request_date DESC; 해당 쿼리를 날려보자. request_date에 인덱스가 걸려있는 상태다. 1.32초면 나쁘진 않군요! SELECT count(*) FROM api_request_history; 이번엔 count를 날려봅시다. 아? 무려 30초가 넘어서 연결이 끊겼네요 왜 count보다 전체 데이터 조회가 성능이 빠른 걸까? 물론 index가 걸려있다지만 이렇게 차이가 심한 정도인가? 일단 count를 통해 full scan을 때리기 때문에 속도가 느린 것이 문제다. 아 뭔가 QueryDSL 안 쓰고 해결해보려고 했는데, 대부분 count 성능..
관리자 페이지에서 사용자의 모든 기록을 볼 수 있는 탭을 하나 만들어두었다. 해당 탭에 들어가면 mounted가 되는 순간 서버로 모든 요청 기록을 조회하는 api를 호출하게 된다. 일단 50만 개의 더미 데이터를 넣어두고 전부 불러오도록 설정. jpa의 findAll을 써서 단순 리스트로 반환했지만, 50만 개의 데이터다 보니 8초라는 시간이 걸렸다. 물론 동일한 데이터를 계속 불러오기에 나중에 캐싱을 이용하면 좋겠지만, 현재는 화면에 표시를 하는 게 목적이므로 패스. 일단 느린 시간만큼 조금 로딩화면을 보여줘야한다는 생각이 들었다. isLoading: false, vue data에 로딩상태를 두고 요청 기록 불러오는중... 이렇게 둬서 로딩이 되는 순간 화면 색을 바뀌게 만들었다.(어떻게 보면 사용자..
이전에도 한번 테스트코드를 작성했지만 부족한 개념을 정리하기 위해 내용을 정리해보려고 합니다. 우선 이번에 하려는 부분은 repository만 단독으로 단위테스트를 진행하는 것입니다. DB같은 경우 local에 있는 MySQL을 이용하려고 합니다. 대충 순서를 알아보면 필요한 가짜 객체 생성 가짜 객체 DB에 저장. 메서드 실행 결과 검증 이 순서대로 진행이 됩니다. 검증 이후 데이터는 롤백이 돼서 DB에서 삭제되는 방향으로 진행됩니다. 여기서 사용하려는 어노테이션의 정보입니다. @DataJpaTest jpa환경에서 repository를 테스트하기 위해 spring에서 제공하는 어노테이션. 최소한의 스프링 컨텍스트를 제공한다. jpa entity 테스트를 위해 EntityManager와 TestEntit..
현재 restful api 서비스에서는 매일 토큰이 2개보다 적을 경우, 2개로 초기화를 진행해 준다. 여기에 매일 5개씩 선착순 토큰을 발행해서 가져가게 구성하려고 한다. public class Coupon { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private Integer remainingQuantity; @Column(nullable = false) private Integer totalQuantity; @Column(nullable = false) @CreatedDate private LocalDateTime createDate; 쿠폰 자체는 선착순으로 가져..
RESTFUL API 서비스를 제작하면서 가장 고민하고 있는 부분이다.chat gpt로 추천을 받기 위해서는 1번의 request가 필요.jmeter로 100번 요청 보냈더니 벌써 gpt가 toManyRequest를 뱉으며 뻗어버렸다. 너무 많은 요청을 받게 하면 안 되는데... 그래서 생각했던 방법들 Synchronize그래서 싱크로나이즈를 쓸까 생각을 했다. 그러나 Synchronize를 쓰면 임계영역에 하나의 스레드만 가능하다.(즉 100개의 요청이 들어오면 하나씩 처리해야 해서 너무 오래 걸린다) 응답 시간을 측정했을 때, RestTemplate 기준 하나의 처리에 3초가 걸렸다. 이게 100명의 유저한테 온다면 마지막 유저는 300초는 기다려야 한다.(이게 말인가?)결국 탈락 WebClientG..
프로젝트하다가 매일 api 경로를 고민한 지 벌써 10만 번째.... 그냥 프롬프트 하나 만들어서 추천서비스 간단하게 만들면 좋지 않을까?라는 생각이 들었다. 제작 이유 1. chat gpt한테 직접 물어보자니 다 설명하기 귀찮기도 하고 얘가 또 말이 얼마나 많던지 2. 간단한 토이 프로젝트로 사용하기 위해 그래서 만들어보았습니다. 기능 1. 회원가입 2. 소셜로그인 3. chat gpt에게 추천받기 프로젝트는 Vue3와 SpringBoot 3.2.4를 이용했습니다. 주 기능은 3번입니다. 프롬프트 사용자에게 model, method, resource, content를 받아서 추천 3개의 restful api를 뽑아내는 것이 목표. 사실 따지고 들어가면 관리자인지 유저인지, 토큰을 사용하는지 등 세세하게..
여태 프로젝트 진행하면서 동시성 문제에 대해 생각하지 않았다. 사실 그럴 힘이 없었다. 근데 자바에서는 멀티 스레드를 지원하는데 문제는 여기서 발생한다. 멀티 스레드 -> 즉 하나의 프로세스에서 여러 개의 스레드가 동시에 작업을 진행한다. 씈크럼 프로젝트에서 스크럼의 참여 인원을 +1 시키는 메서드가 존재한다. public void plusCurrentMember(){ if(this.maxMember 최대 멤버 : 20명, 현재 멤버 : 19명 만약에 두 유저가 해당 스크럼 정보를 통해 참여를 진행한다면? 둘 다 현재 참여가 가능하다고 판단해서 Update Query를 날리게 되고, 결국 데이터 정합성에 문제가 발생한다. 나는 여태 이런 경우를 생각하지 않고 진행했었는데 이제는 멀티 스레드에 대해 생각할..
프로젝트를 진행하면서 람다는 시큐리티에서 사용해봤지만 Stream은 전혀 사용하지 않고 있었다.(잘 모르기도 했고 for문이 더 편했어서) 이번에 stream을 사용해보고자 코드를 리팩토링하고 시간을 측정했는데 생각 외의 결과가 나왔다. 아래는 스크럼을 조회하는 서비스이고 데이터는 2000개, 스레드 20개, 루프카운트 10으로 조회를 시작했다. // 스크럼 팀 조회 @Override public ScrumRoomListResponseDTO findScrums(Long teamId) { User user = securityContext.getUser(); Team team = teamRepository.findById(teamId) .orElseThrow(() -> new TeamNotFoundExcep..
indeep
'프로젝트' 카테고리의 글 목록 (4 Page)