본문 바로가기

전체 글

(69)
MariaDB 모든 날짜 생성하기 - 삽질중인 개발자 - WITH RECURSIVE 구문을 사용하여 모든 날짜 데이터를 생성하는 방법 - MariaDB에서 더미용 모든 날짜를 생성하는 방법에 대해서 포스팅한다. WITH RECURSIVE 구문을 사용하여 데이터를 생성하는 건데 MariaDB 10.2.1 부터 WITH RECURSIVE 구문을 사용 할 수 있다 더미 데이터를 생성하는 SQL은 아래와 같은 형태이다. WITH RECURSIVE DT_TABLE AS ( SELECT ${시작일} dt, 1 lv FROM dual UNION all SELECT DATE_ADD('2020-09-12 00:00:00', INTERVAL DT_TABLE.lv ${시간/일 단위}) dt, DT_TABLE.lv+1 AS lv FROM DT_TABLE WHERE DT_TABL..
JPA N+1 문제 해결 방법 및 실무 적용 팁 - 삽질중인 개발자 - JPA N+1 문제 및 해결 방법 - JPA를 사용하다 보면 의도하지 않았지만 여러 번의 select 문이 순식간에 여러 개가 나가는 현상을 본 적이 있을 것이다. 이러한 현상을 N+1문제라고 부른다. 해당 포스트에서는 N+1 문제가 왜 발생하게 되는지와 해결 방법 및 실무에서 어떤 식으로 적용을 해야 하는지에 대하여 설명을 할 것이다. N+1 문제란? 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상 현상 재현 DB 구조는 유저(USER)는 한개의 팀(TEAM)에만 속할 수 있고 팀(TEAM) 하나는 여러 명의 유저(USER)가 가입할 수 있다. 테스트 데이터로는 4개의 팀당 유저 4명씩 총 20명의 유저를 추가했..
Spring Security - AnonymousAuthenticationFilter란 - AnonymousAuthenticationFilter 란 - 스프링 시큐리티에서 AnonymousAuthenticationFilter는 익명 사용자의 요청에 대해 처리해주는 필터로 인증을 하지 않은 요청인 경우 인증 객체를 익명 권한이 들어가 있는 객체를 만들어 SecurityContextHolder에 넣어 주는 역할을 한다. 기본적으로 스프링 시큐리티 필터에 포함이 되어 있는 필터이며 만들어지는 객체는 아래와 같은 값을 가지고 있다. pricial : anonymousUser authorities : ROLE_ANONYMOUS // 기본 생성자 public AnonymousAuthenticationFilter(String key) { this(key, "anonymousUser", Authority..
Spring Security - RememberMeAuthenticationFilter 란 - RememberMeAuthenticationFilter 란 - 스프링 시큐리티에서는 RememberMe라는 기능을 지원해준다. 이 RememberMe라는 기능은 세션이 만료된 뒤에도 서버에서 클라이언트의 인증 값을 기억하고 있어 주는 기능이다. 보통 cookie에 Remember Me 기능을 해줄 수 있는 특정한 쿠키 키-값을 세팅해서 구현을 한다. 이 복잡한 과정을 시큐리티에서는 간단한 설정으로 제공을 해주며 해당 기능을 사용하기 위해서는 해당 기능을 아래와 같은 형태로 활성화시켜야 한다. @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin(); http.rememberMe(); } 위와 같이 ..
Spring Security - LogoutFilter 란 - LogoutFilter 란- LogoutFilter란 로그아웃에 대한 처리를 담당하는 필터로 사용자가 로그아웃 요청을 했을 경우에만 적용되는 필터이다. LogoutFilter는 세션 무효화, 인증 토큰 삭제, SecurityContext에서 해당 토큰 삭제, 쿠키 삭제 및 로그인 페이지로 리다이렉트를 시켜주는 기능이 있다. LogoutFilter의 필터 기능이 구현된 코드를 보면 아래와 같다. private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { if (this.requiresLogout(request, res..
Spring Security - UsernamePasswordAuthenticationFilter 란 - UsernamePasswordAuthenticationFilter 란- UsernamePasswordAuthenticationFilter란 Form based Authentication 방식으로 인증을 진행할 때 아이디, 패스워드 데이터를 파싱하여 인증 요청을 위임하는 필터이다. 쉽게 설명하자면 유저가 로그인 창에서 Login을 시도할 때 보내지는 요청에서 아이디(username)와 패스워드(password) 데이터를 가져온 후 인증을 위한 토큰을 생성 후 인증을 다른 쪽에 위임하는 역할을 하는 필터이다. Spring Boot 기반의 HttpSecurity를 설정하는 코드에서 http.formLogin(); 을 사용하면 시큐리티에서는 기본적으로 UsernamePasswordAuthenticationF..
PRG 패턴 (Post-Redirect-Get) - 삽질중인 개발자 최근 발생한 이슈 중 중복 결제에 대한 이슈가 있어서 원인을 찾아보는 중에 브라우저에서 새로고침이나 뒤로 가기를 했을 경우 이전에 보내진 POST 요청이 다시 보내져 중복 결제가 일어나는 버그가 있다는 것을 발견했다. 이러한 새로고침 버그에 대해서 회피할 수 있는 방법을 찾아보는 중 PRG 패턴에 대해서 알게 되어 정리 차원에서 포스팅을 한다. PRG 패턴 (Post-Redirect-Get) 웹 개발 패턴 중 자주 쓰이는 패턴으로 HTTP POST 요청에 대한 응답이 또 다른 URL로의 GET 요청을 위한 리다이렉트(응답 코드가 3XX) 여야 한다는 것을 의미한다. 즉, 쉽게 설명하면 POST 방식으로 온 요청에 대해서 GET 방식의 웹페이지로 리다이렉트 시키는 패턴을 말한다. PRG 패턴을 사용하지 않..
@Transactional Rollback이 안되는 이유, @Transactional 사용시 주의 사항 - 삽질중인 개발자 개발을 하다 보니 예외(Exception)에 대해서 아무 생각 없이 사용하다가 심각한 버그를 발견하게 되어서 글을 정리한다. 아마 초보 개발자들이 가장 많이 하는 실수 중 하나 아닐까 싶다. 아래의 코드는 문자열을 넘겨주면 해당 문자열의 길이를 반환해주는 함수이다. public int getLength(String str) throws Exception{ if(str == null){ throw new Exception(); } return str.length(); } 그냥 봤을 때는 null일 때 유효성 검사도 되어 있고 유효성 검사에서 걸리면 Exception까지 던져주는 문제없어 보이는 코드처럼 보인다. 만약 위에 있는 함수를 사용해서 스프링에서 제공하는 @Transactional 어노테이션을 사용..