https://www.worlditshow.co.kr/main/main.php IT전시회 World IT Show국내 최대 규모 IT전시회 4월 코엑스 개최www.worlditshow.co.kr누군가가 올려준 내용 하나로 여기에 다녀오기로 결정. AI가 만드는 일상의 혁신이라는데 최대 규모이고 카카오, 엘지, 삼성, SK등 대기업과 다양한 스타트업, 중소, 중견이 모이길래 이건 가봐야겠다 싶어서 출동했습니다. 이게 줄인데... 심지어 사전 등록자 명찰 교환 줄이었습니다. 교환 기계가 10개가 넘어서 빠르게 빠지긴 했는데 그래도 여기서 5분~10분은 기다렸었던 명찰 GET3층이 대기업이 많았고, 1층은 스타트업 AI 위주였습니다. 먼저 1층부터 다녀왔습니다. 아이앤나처음에 보면서 기억에 남았던 기업.AI ..
리프레시 토큰 재발급 API를 만들면서 문제가 발생했다. API의 요구사항은 다음과 같다. accessToken, refreshToken 2개의 쿠키를 필수로 전달. jwt 필터 건너뜀. 스프링 시큐리티 건너뜀. 즉 2개의 쿠키를 전달해 준다면 일치하는 리프레시를 찾아서 살아있다면 재발급을 진행해 주는 형식이다. 컨트롤러 @PostMapping("refresh-token") public ResponseEntity
오랜만에 QueryDSL을 통해 쿼리를 작성하려고 하는데 RefreshToken Entity에서 큐클래스가 임포트 불가능한 문제가 발생했다. 다른 Entity에서는 사진처럼 잘 import가 되고 있는데 RefreshToken만 import하면 빨간줄 떴다가 바로 삭제가 돼서 QClass가 없나 싶어서 확인해봤다. 분명 QClass는 다 만들어져 있는데?.. 여기서 아차 싶은 부분이 생겼다 대부분 보통 QClass는 build/generated 폴더에 만드는 걸로 알고 있는데 내 코드는 src/main에 생성하도록 지정이 되어 있던 것. 근데 여태까지 문제 없이 사용했는데? 이 방법이 진짜 문제가 없는 건지 궁금해지기 시작했다. 일단 김영한님도 그렇고 호돌맨님의 인프런 댓글도 확인해본 결과 전부 buil..
@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 성능..