본문 바로가기

Web27

Query DSL을 통한 커서기반 페이징 [먼저 페이징에 대한 개념이 부족하시다면 아래의 글을 참고해주면 감사하겠습니다] [Paging] 페이지네이션을 알고 사용하자 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 페이징(Paging, Pagination)이란? 프로젝트를 진행하면서 “베스트 상품 페이징”처리가 bestsu.tistory.com 위의 포스팅은 페이징에 대한 이론을 설명하고 있고 이제 작성 하는 글은 페이징을 실전에 사용하는 방법에 대해 쭉 정리한다 1. query dsl 설정 처음 query dsl을 사용해보면서.. 기본부터 테스트를 진행해야겠다고 하면서 아래 블로그 글을 따라하고 있었다 일단 query dsl 설정 파일을 생성해 주었다. package com... 2024. 3. 7.
[Spring Security] jwt RefreshToken 구현하기 프로젝트를 수행하던 중 access token만으로는 사용자에게 편리한 로그인을 제공하기가 어려움을 느끼게 되었다 가장 크게 느낀 이유론 access token 특성상 지속시간이 짧기 때문에 만료되면 짧은 주기로 이용자가 다시 로그인해야 하는 불편함이 생기는 것이다. 이를 해결하기 위해 refreshToken을 구현해야겠다고 생각하게 되었고 그 과정을 정리해 보았다. refreshToken 전체로직 처음에는 아래와 같은 전체로직으로 구현을 생각하게 되었다 나는 사실 구현하다보니 여러가지 방법이 있는 것을 알게 되었고 굳이 refreshToken을 취약하게 외부에 드러낼 필요가 없다고 생각이 들어서 아래와 같은 로직으로 구현하게 되었다 즉, 만료된 accessToken을 받았을 때 해당 accessToke.. 2024. 1. 29.
[Spring Security] 스프링 시큐리티 에러 메시지 국제화 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. [문제 상황] 팀원이 작업하시면서 이런 문제가 발생했다고 하셨다! 그래서 직접 확인해 보니 로컬에서는 비밀번호를 잘 못 입력했을 때 “자격 증명에 실패하였습니다.” 였고 서버에서는 위와 같이 “Bad credentials”로 응답이 왔다.. 왜 그럴까 생각을 해보았는데에.. 계속 보니 로컬에서 오는 응답과 서버에서 오는 응답 이 둘의 의미가 같은 것 같았다. 그래서 어림짐작으로 로컬은 한국이고 서버는 영어로 되어있나..? 싶었는데 역시 맞았다 → 근거는? 위 블로그를 보면서 “이는 Spring Security 자체에 국제화 메시지 처리가 되어 있기 때문” 이라는 말을 보았고 해당 파일을 직.. 2023. 12. 14.
[Spring Security] jwt 401 응답 + jwt 예외 핸들러 만들기 일단 security 예외는 사용자가 만든 spring 핸들러에 걸리지 않는다 이유는 security가 spring이 실행되기 전보다 먼저 실행되기 때문이다.. 사용자가 만든 핸들러는 spring에 걸려있고 security가 그것보다 더 전에 실행하기 때문에 걸리지 않는다 위 그림처럼 Filter가 Request의 가장 앞단에 위치해있고 HnadlerInterceptor가 controller단에 존재한다 이래서 이 게시글을 작성하기 전까진 jwtFilter에서 발생하는 요런 에러들이 GlobalHandler에 잡히지 않았다 (사실 Spring의 GlobalHandler에 잡히는 줄 알았고 코드 문제로 동작이 안 하는 줄 알았다..._) 그래서 겸사겸사 위와 같은 문제들까지 다 해결하기위해 해당 게시글을 .. 2023. 11. 29.
[Spring Security] @AuthenticationPrincipal에 null값 들어오는 문제 해결 방법 https://devjem.tistory.com/70 이 글 보고 참고했다 이 문제가 발생한 경우는 “회원 정보 수정” 기능에 User를 @AuthenticationPrincipal로 가져와야 하는건데 자꾸 나의 User가 null으로 받아와지지 않았다 ㅠㅠ 글을 쭉 읽으면서 security 코드를 천천히 비교하며 보는데 ! 내 경우의 문제는 CustomUserDetailsService의 loadByUserName 함수가 email으로 되어 있어서 그런 것이라고 처음에 접근했다 근데 사실 유저의 바뀌지 않는 값은 email이 맞으니 해당 함수는 문제가 없었다. 그래서 loadUserByUserName의 내부 findByEmail 메소드를 findByName 메소드로 변경했다 근데 findByName으로 .. 2023. 11. 16.
[Paging] 페이지네이션을 알고 사용하자 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 페이징(Paging, Pagination)이란? 프로젝트를 진행하면서 “베스트 상품 페이징”처리가 필요하게 되었고 페이징 처리를 해본적 없는 나는..! 페이징에 대해 먼저 알아보는 것이 먼저였다! 먼저, 페이징이 필요한 이유는 십만개의 데이터가 존재할 때 이 데이터를 한 화면에 한 번에 보여줄 수 없기 때문에 일정 기준으로 끊어서 데이터를 표시하기 위해 필요하다. 만약 서버에 한 요청이 십만개의 데이터를 요청하는 것이고, 이와 같은 요청이 여러 사용자들에 의해 발생한다면? 서버에선 OOM이 발생하는 문제가 생길 수도 있다. 이와 같은 문제들을 해결하기 위해 페이징이 필요하다. 우리가 가장 .. 2023. 10. 2.
[MySQL] 부분 문자열 가져오기 - LEFT, MID, RIGHT 함수 (1) LEFT(문자, 가져올 갯수) => 문자 왼쪽을 기준으로 일정 갯수를 가져오는 함수 SELECT LEFT('123456789', 3); -- 결과: 123 (2) MID(문자, 시작 위치, 가져올 갯수) = SUBSTR, SUBSTRING 함수의 동의어 => 문자의 지정한 시작 위치를 기준으로 일정 갯수를 가져오는 함수 SELECT MID('123456789', 2, 4); -- SELECT SUBSTR('123456789', 2, 4); -- SELECT SUBSTRING('123456789', 2, 4); -- 결과: 2345 (3) RIGHT(문자, 가져올 갯수) => 문자 오른쪽을 기준으로 일정 갯수를 가져오는 함수 SELECT RIGHT('123456789', 3); -- 결과: 789 .. 2023. 5. 9.
[MySQL] NULL값 치환 - IFNULL, IF, NULLIF, CASE, COALSECE 함수 (1) IFNULL(컬럼명, 치환값) => 컬럼명이 null인 경우 치환값으로 치환하여 반환 ex) CHECK 컬럼이 null인 경우 N으로 치환하여 출력 SELECT IFNULL(CHECK, 'N') FROM TABLE; (2) IF() + IS NULL => IF(컬럼명 IS NULL, 'TRUE 값', 'FALSE 값') SELECT IF(CHECK IS NULL, 'N', 'Y') FROM TABLE; (3) NULLIF(값1, 값2) => (값1 == 값2)인 경우 NULL을 반환, FALSE인 경우 값1을 반환 SELECT NULLIF(1,1) -- null SELECT NULLIF(1,2) -- 1 (4) CASE => 해당 컬럼 값을 조건식을 통해 True, False를 판단하여 조건에 맞.. 2023. 5. 4.
[MySQL] LIKE, CONCAT, ROUND 함수 LIKE : 특정 문자 포함 검색 - 특정 문자로 시작하는 문자열 검색 SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '특정 문자열%'; - 특정 문자로 끝나는 문자열 검색 SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '%특정 문자열'; - 특정 문자를 포함하는 문자열 검색 SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '%특정 문자열%' - 복수개의 특정 문자열을 포함하는 문자열 검색 1 SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '%특정 문자열%' OR [필드명] LIKE '%특정 문자열2%' - 복수개의 특정 문자열을 포함하는 문자열 검색 2 SELECT [필드명] FROM [테이.. 2023. 4. 30.