소개 N+1 문제는 데이터베이스 쿼리 성능 최적화에서 자주 등장하는 이슈 중 하나이다. 이 문제는 어떤 상황에서 발생하며, 어떻게 해결할 수 있는지에 대한 이해가 중요하다. 본문 1. QueryDSL이란? - 정적 타입(컴파일 시 타입에 대한 정보를 결정)을 이용해서 SQL과 같은 쿼리를 생성할 수 있게 해 주는 프레임워크 2. QueryDSL을 사용하는 이유 - JPA를 사용하다 보면 N+1 문제가 발생한다. - 이러한 문제가 발생시, 기본 기능으로 해결되지 않는 경우에는 네이티브 쿼리를 사용하게 된다. - 그런데 Native Query는 문자열을 이어 붙이기 때문에 오타가 발생하기 쉽고 가독성이 떨어지는 단점이 있다. - QueryDSL을 사용하면 자동 완성과 같은 IDE의 기능을 사용할 수 있고, ..
소개 N+1 문제는 데이터베이스 쿼리 성능 최적화에서 자주 등장하는 이슈 중 하나이다. 이 문제는 어떤 상황에서 발생하며, 어떻게 해결할 수 있는지에 대한 이해가 중요하다. 본문 1. N+1 문제란? - N+1 문제는 데이터베이스 조회 시 연관된 엔터티를 추가로 조회해야 할 때 발생하는 성능 이슈이다. - 예를 들어, 한 개의 부모 엔터티를 조회한 후에 N개의 연관 관계의 자식 엔터티를 각각 추가적인 쿼리로 조회하는 문제이다. 2. N+1 문제의 영향 - N+1 문제는 불필요한 추가 쿼리로 인해 성능 저하를 일으킬 뿐 아니라, 대량의 데이터를 처리할 때 불필요한 데이터베이스 부하를 초래함 - 이는 애플리케이션의 응답 시간을 길게 만들 수 있다. 3. JPQL에서의 N+1 문제 - JPQL에서 N+1 문제..
기본적인 로그인의 동작 과정은 다음과 같이 진행된다. 이번 포스팅에서는 Spring Security를 활용한 세션 기반 로그인 구현에 대해 다루고자 한다. 이를 스프링의 Dispatcher Servlet과 같이 묶어서 동작 과정을 이해하는데 노력을 했다. 1. Spring Security 의존성 추가 org.springframework.boot spring-boot-starter-security 2. SecurityConfig 클래스 추가 1) @Configuration : 이 어노테이션을 클래스에 붙이면 해당 클래스를 설정 클래스로 지정할 수 있다. package com.example.pampam.config; import com.example.pampam.config.filter.JwtFilter; ..
Http 프로토콜의 특징 Connectionless (비연결 지향) - Connectionless는 통신이 연결을 설정하고 유지하지 않는 특성을 나타낸다 - Connectionless는 패킷 기반의 빠른 데이터 전송을 지원한다. Stateless (상태 없음) - Stateless는 서버가 클라이언트의 상태를 유지하지 않는 특성을 나타낸다 - 각 요청은 서로 독립적으로 처리되며, 이전 요청과의 관련성이 없다 - HTTP는 기본적으로 Stateless 프로토콜이다 - 각 HTTP 요청은 서로 독립적이며, 서버는 클라이언트의 상태를 기억하지 않는다 - Stateless는 서버의 부하 분산과 확장성을 높인다 Stateless의 개념은 주로 RESTful API에서나 토큰 기반의 인증에서 많이 사용된다 JWT의..
세션 로그인 동작 방식 1. 로그인 - 사용자가 아이디와 비밀번호를 입력하여 로그인을 시도한다. 2. 서버에서 세션 생성 - 서버는 로그인 정보를 검증하고, 유효한 경우 해당 사용자를 위한 세션을 생성한다. 3. 세션 ID 생성 및 전송 - 세션은 서버 측에서 생성되며, 고유한 세션 ID가 생성된다. - 이 세션 ID는 일반적으로 쿠키를 통해 클라이언트에게 전송된다. 4. 클라이언트에서 세션 ID 저장 - 클라이언트는 받은 세션 ID를 쿠키나 다른 저장 방식을 사용하여 저장한다. 5. 인증 및 권한 부여 이후의 클라이언트의 요청에서는 세션 ID를 이용하여 사용자를 인증하고, 해당 사용자에게 권한을 부여한다. 6. 세션 유지 및 만료 - 세션은 일정 시간 동안 유지되며, 사용자의 비활동 시간이 일정 기간 ..
@OneToMany, @ManyToOne - JPA에서 엔티티 간의 양방향 관계를 매핑할 때 사용되는 어노테이션 1. @OneToMany - 일(One) 쪽 엔티티에서 다(Many) 쪽 엔티티로의 관계를 정의 - 하나의 일(One) 엔티티가 여러 개의 다(Many) 엔티티와 관계를 맺고 있을 때 사용 - mappedBy: 양방향 매핑 시, 연관 관계의 주인이 되는 엔티티의 필드를 지정한다. 2. @ManyToOne - 다(Many) 쪽 엔티티에서 일(One) 쪽 엔티티로의 관계를 정의 - 여러 개의 다(Many) 엔티티가 하나의 일(One) 엔티티와 관계를 맺고 있을 때 사용 - optional: 연관 엔티티가 항상 있어야 하는지 여부를 지정, 기본값은 true이며, false로 설정하면 NOT NULL..