분류 전체보기 38

jpa N+1 해결방법

JPA에는 N+1 문제라는 것이 존재합니다.N+1문제란 DB에서 불러올 때 1개의 쿼리가 아니라 연관관계 객체를 불러오기 위한 N개의 쿼리가 발생하여 성능이 저하되는 문제입니다.JPA를 사용하여 엔티티간 연관관계를 맺으며 프로젝트를 진행하면 필연적으로 N+1 문제에 직면하게 됩니다. 해결 방법N+1 문제를 해결하는 방법에는 여러 가지가 있습니다:Fetch Join 사용:JPQL에서 JOIN FETCH를 사용하여 부모와 자식 엔티티를 한 번의 쿼리로 가져올 수 있습니다.@Query("SELECT p FROM Parent p JOIN FETCH p.children")List findAllWithChildren(); EntityGraph 사용:JPA 2.1부터 지원하는 기능으로, 엔티티 그래프를 사용하여 어떤..

카테고리 없음 2025.02.23

스프링빈을 통한 의존성 주입과 그냥 import 차이

모든 클래스를 의존성 주입 없이 임포트하여 사용할 수 있습니다. 일반 클래스를 빈으로 등록하지 않고도 필요한 곳에서 직접 인스턴스화하여 사용할 수 있습니다.   1. **임포트**: 클래스를 사용하기 위해 해당 패키지를 임포트할 수 있습니다. 예를 들어:    ```java   import com.pjt.insurance.model.SomeClass;   ``` 2. **직접 인스턴스화**: 클래스를 직접 생성하여 사용할 수 있습니다. 예:    ```java    SomeClass someClass = new SomeClass();    someClass.doSomething();    ``` 3. **의존성 주입 필요 없음**: 의존성 주입을 사용하지 않고도 클래스를 임포트하고 사용할 수 있으므로, ..

카테고리 없음 2024.12.30

카프카 와 sse 기능을 사용한 알림 기능 만들기 #1

사용배경 : 필자는 경매 시스템을 개발하는 과정에서 성능개선을 위해 필요한 사항을 찾아보던 도중 , 카프카를 사용하여 실시간으로 동일한 작물에 대한 희망 입찰 금액을 제시하는 상황이 동시에 많이 발생하는 경우, 서버의 지연이 발생할 가능성이 존재함을 인식하고, 이를 개선하고자  카프카를 사용하여 동시에 많은 요청을 대량으로 저장하고 비동기적으로 처리하기 유용한 카프카를 사용하였습니다. 비동기를 위한것이라면 , async 어노테이션을 사용해도 되지않냐 는 질문이 있을수 있다고 생각합니다..하지만 둘은 이러한 차이가 있습니다. 1. Kafka를 통한 비동기 처리개념: Kafka는 메시지 브로커로서, 생산자가 메시지를 Kafka에 전송하고 소비자가 이를 비동기적으로 소비합니다. 즉, 생산자는 메시지를 보내고,..

카테고리 없음 2024.12.01

세마포어와 뮤텍스 차이

뮤텍스(mutex)와 세마포어(semaphore)는 모두 동기화 메커니즘으로, 멀티스레드 환경에서 자원에 대한 접근을 제어하는 데 사용됩니다. 뮤텍스 (Mutex)정의: 뮤텍스는 "상호 배제(mutual exclusion)"의 약자로, 한 번에 하나의 스레드만 특정 자원에 접근할 수 있도록 보장합니다.스레드 수: 뮤텍스는 오직 하나의 스레드만 자원에 접근할 수 있도록 허용합니다. 즉, 뮤텍스를 잠그면 다른 스레드는 해당 자원에 접근할 수 없습니다.용도: 주로 공유 자원에 대한 독점적인 접근을 보장할 때 사용됩니다.  세마포어 (Semaphore)정의: 세마포어는 특정 자원에 접근할 수 있는 스레드의 수를 제한하는 카운터입니다.스레드 수: 세마포어는 한 개 이상의 스레드가 동시에 자원에 접근할 수 있도록 ..

카테고리 없음 2024.11.21

@redishash 사용예

Redis의 Hash 자료구조를 사용할 때 Spring Data Redis에서 제공하는 @RedisHash 어노테이션을 활용할 수 있습니다. 이 어노테이션을 사용하면 Redis의 Hash를 쉽게 매핑할 수 있습니다.1. 모델 클래스에 @RedisHash 추가아래와 같이 LoanApplication 클래스에 @RedisHash 어노테이션을 추가합니다.javapackage com.example.loanapp.model;import org.springframework.data.redis.core.RedisHash;import java.io.Serializable;@RedisHash("loan_application") // Redis의 Hash 이름public class LoanApplication implem..

카테고리 없음 2024.10.16

해시함수의 특징

해시 함수는 단방향 암호화 방식으로, 입력된 데이터를 고정된 길이의 해시값으로 변환합니다. 이 과정에서 중요한 점은 해시 함수의 특성상 원래의 입력값으로 역산하거나 복호화할 수 없다는 것입니다. 즉, 해시값을 통해 원래의 데이터를 알아내는 것이 불가능하다는 의미입니다.해시 함수의 특징단방향성: 해시 함수는 입력값을 해시값으로 변환하는 것은 가능하지만, 해시값을 다시 원래의 입력값으로 되돌리는 것은 불가능합니다.고정된 출력 길이: 입력값의 길이에 관계없이 항상 고정된 길이의 해시값을 생성합니다.충돌 저항성: 서로 다른 입력값이 동일한 해시값을 생성하는 경우(충돌)가 발생하기 어렵습니다. 하지만 이론적으로는 가능하므로, 강력한 해시 알고리즘을 사용하는 것이 중요합니다.이러한 특성 덕분에 해시 함수는 비밀번호..

카테고리 없음 2024.10.12

게이트웨이 필터 예시

Spring Cloud Gateway에서 인증 헤더를 처리하는 필터를 구현한 것입니다. 주요 기능은 다음과 같습니다:클래스 구조:AuthHeaderFilter는 AbstractGatewayFilterFactory를 상속받아 필터를 생성합니다.TokenService를 주입받아 인증 토큰을 검증하는 데 사용합니다.필터 적용:apply 메서드에서 요청의 Authorization 헤더를 검사합니다.헤더가 존재하고 "Bearer "로 시작하는 경우, 해당 토큰을 추출합니다.TokenService를 통해 토큰의 유효성을 검증합니다.토큰 검증:토큰이 유효하지 않으면 RuntimeException을 발생시키고, 검증에 실패한 경우 에러를 반환합니다.헤더가 없거나 형식이 맞지 않으면, 적절한 오류 메시지를 반환합니다.이..

카테고리 없음 2024.10.09

redis caching

@Configuration // 이 클래스가 Spring의 설정 클래스임을 나타냄@EnableCaching // 캐싱 기능을 활성화public class CacheConfig { @Bean // Spring 컨테이너에 등록될 Bean을 정의 public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { // Jackson2JsonRedisSerializer 사용 // Redis에 저장될 객체를 JSON 형식으로 직렬화하기 위한 직렬화기 생성 Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedis..

카테고리 없음 2024.09.11

스프링 cachealbe 어노테이션 사용

비스 단에서 @Cacheable 애너테이션을 사용하면 특정 메서드의 결과를 캐시할 수 있습니다. 이렇게 하면 같은 메서드가 호출될 때, 저장된 캐시 값을 재사용하여 데이터베이스에 대한 접근을 줄이고 성능을 향상시킬 수 있습니다.@Cacheable 사용 예시java import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Servicepublic class TradePostService { private final TradePostRepository tradePostRepository; public TradePostService(TradePostRepository trade..

카테고리 없음 2024.08.11