프로젝트/RESTAPI 추천 서비스

@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { log.info("jwt 필터 동작"); System.out.println(request.getRequestURI()); // 헤더에서 액세스 토큰 추출 Cookie[] cookies = request.getCookies(); // 쿠키 자체가 없으면 401 에러 발생 if (cookies == null) { log.error("쿠키 없음."); sendErrorResponse(response, HttpStatus...
(스프링부트 3.2.4로 진행됩니다) 웹소켓이라는 기술을 평소에 사용해보고 싶기도 했어서 이번 프로젝트에 한번 적용해보려고 한다. 내가 원하는 느낌은 자소설닷컴의 느낌과 비슷하다. 요런 느낌으로 로그인하면 하나의 채팅방을 통해 모두가 자유롭게 대화할 수 있는 장소를 하나 마련해보려고 한다. (학습하면서 진행하는 부분이라 다음 내용이 언제 올라갈지 모르겠습니다.) 우선 웹소켓을 사용하냐 socket.io를 사용하냐의 문제가 있었다. 그전에 간단하게 네트워크에서 어떻게 실시간 통신을 해왔는지 살펴보자. 1. Polling 일정한 주기(시간)를 가지고 서버와 응답을 주고받는 방식 웹 자체가 영구 연결이 불가능하기에 매번 주고 받아야함.(서버 부하 문제 발생) 주기가 길면 실시간성이 매우 떨어진다. 2. Lon..
관리자가 유저들의 요청 기록을 조회하는 API를 날리는데 쿼리가 이상하다. 현재 유저는 4명이 있고, 요청기록은 100만 개의 데이터가 존재. Hibernate: select arh1_0.id, arh1_0.member_id, arh1_0.method_type, arh1_0.request_content, arh1_0.request_date, arh1_0.request_status, arh1_0.response_content from api_request_history arh1_0 order by arh1_0.request_date desc limit ?, ? Hibernate: select m1_0.id, m1_0.create_date, m1_0.email, m1_0.login_last_date, m1_..
백엔드에서 유효성 검사를 위해 @Valid를 사용해서 진행 중이었는데 api 요청을 보내니 아래와 같은 에러가 발생했다. Request processing failed: jakarta.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'jakarta.validation.constraints.NotBlank' validating type 'com.park.restapi.domain.api.entity.MethodType'. Check configuration for 'methodType' at org.springframework.web.servlet.FrameworkServlet.processReq..
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; 쿠폰 자체는 선착순으로 가져..
indeep
'프로젝트/RESTAPI 추천 서비스' 카테고리의 글 목록 (4 Page)