반응형

Programming/Spring Boot 101

Querydsl Paging 페이징 처리, Custom PageRequest 사용하는 이유

'Querydsl Paging 페이징 처리' 프로젝트에서 Get요청을 통해 여러 건의 데이터를 가져올 때, 페이징(Paging) 처리가 필요한 경우가 많습니다. Spring Boot에서는 Pageable, PageRequest를 사용하여 페이징 처리를 하는데요. 페이징은 Pageable, PageRequest를 활용한 큰 틀 안에서 조금씩 다른 방법으로 사용될 수 있는데, 여기서는 Custom PageRequest를 사용한 페이징 처리에 대한 예시를 볼 수 있으며, 왜 Custom PageRequest를 만들어서 사용하는지에 대해서도 알 수 있습니다. *** (해당 포스팅은 JPA, Querydsl을 사용할 수 있는 환경이 세팅된 상태에서 작업했으며, Querydsl 환경 설정은 바로 아래 글을 참조하시..

DB 트래픽 분산을 위한 DataSource Read, Write 분기 처리

'Spring Data JPA, Master - Slave 구조에 따른 Read, Write 분기 처리' DataSource Read, Write 분기 처리는 많아지는 데이터베이스 요청에 따라 데이터베이스의 부하를 줄이기 위한 DB 이중화 구성 Master - Slave에서 많이 사용됩니다. (Master - Slave 구조를 사용하는 가장 큰 이유는 Master에서는 쓰기, 수정, 삭제 요청을 처리하고 Slave에서는 읽기 요청만 처리하여 병목을 줄여주기 위함입니다.) *** 해당 포스팅은 MySQL Replication 및 Master -Slave 구조에 중점을 둔 것이 아니라 이 구조에서 Transaction ReadOnly 여부에 따라 DataSource를 나눠서 Connection을 가져오는 방..

SELECT FOR UPDATE / JPA를 사용한 비관적 잠금

'동시성(Concurrency)' 웹 서비스에서는 다수의 사용자들이 데이터베이스에 동시에 접근하는 경우가 빈번하게 발생합니다. 때문에 데이터의 일관성에 대한 처리가 필요한데요. 이를 '동시성(Concurrency) 문제'라고 합니다. 동시성 문제란, 공통된 자원에 동시에 들어온 여러 개의 요청이 모두 읽고 쓰는 작업(Read -> Write)을 하려고 하는 경우에 발생할 수 있는 문제를 말합니다. *** 동시성 문제는 '완전한 해결'이 아닌 '적절한 해결(제어)'에 더 적합합니다. '동시성'과 '일관성'은 하나가 증가하면 다른 하나는 감소하는 트레이드오프의 관계이기 때문에 해당되는 로직의 특성에 따라서 적절하게 균형을 설정하는 것이 중요합니다. '비관적 락(Pessimistic Lock)' 자원에 대한 ..

Spring Cache 캐시 추상화 기본적인 사용법 @Cacheable @CachePut @CacheEvict

'Spring Boot 프로젝트 Cache 캐시 추상화 기본적인 사용법' 먼저 캐시(Cache)란, 캐시란 서버의 부담을 줄이고, 성능을 높이기 위해 사용되는 기술입니다. 예를 들어서 어떤 요청을 처리하는데 DB에서 조회하는 시간이 오래 걸리거나 계산이 복잡한 경우에 적용하여 요청 결과를 저장해 두고 가져옴으로써 빠르게 처리할 수 있는 기술입니다. 아래에서 살펴볼 Spring 프로젝트의 캐싱 사용법에서는 메서드에 캐싱을 적용함으로써 캐시에 보관된 정보로 메서드 실행 횟수를 줄여 주는 것을 볼 수 있습니다. 즉, 대상 메서드가 실행될 때마다 추상화되어 적용된 캐싱이 해당 메서드가 같은 인자로 이미 실행되었는지 확인하는 동작을 합니다. 해당 메서드가 실행되어 저장된 데이터가 존재한다면 실제 메서드를 실행하지..

Spring Boot 예외 처리 @ControllerAdvice, @ExceptionHandler

'스프링 부트 @ControllerAdvice, @ExceptionHandler를 이용한 예외 처리' 프로그래밍에서 예외처리는 아주 중요한 부분입니다. 예외가 발생할 수 있는 부분에서 예외를 잡아서 세밀하게 처리해준다면 클라이언트 측면에서와 서버 측면에서 모두 더 안정적인 프로그램이 될 수 있습니다. 일반적으로 예외를 처리해야 하는 상황에서 각각의 예외들을 메서드 단에서 try-catch 또는 throw로 처리하게 되면 코드가 복잡해질 수밖에 없습니다. 이러한 문제를 개선하기 위해 Spring Boot에서는 @ExceptionHandler, @ControllerAdvice(+ @RestControllerAdvice)를 사용합니다. @RestController @RequiredArgsConstructor ..

스프링 프레임워크 Reactive Stack, Servlet Stack 개념

'스프링 프레임워크(Spring Framework) Reactive Stack과 Servlet Stack' WebClient를 사용하기 위해서 공부하던 중 WebFlux의 개념과 더불어 함께 공부하게 된 부분입니다. 전체적인 Reactive Programming과 함께 공부하며 개념을 잡아가면 더 좋겠지만 당장에 큰 흐름만 파악하기 위해서 정리한 내용이라 틀리거나 부족한 부분이 있을 수 있습니다. 잘못된 부분은 댓글 남겨주시면 다시 공부하여 수정하겠습니다. 미리 감사드립니다. Spring Framework5는 Servlet Stack, Reactive Stack이라는 두 가지 웹 스택을 제공합니다. 하나는 대부분의 Java 엔터프라이즈 애플리케이션이 사용하는 차단 I/O가 있는 고전적인 'Servlet ..

RestTemplate Logging 요청과 응답 로그 남기기

'RestTemplate 요청과 응답 로그 남기기 (Logging)' 먼저 RestTemplate에 대한 간략한 설명, RestTemplate은 스프링 3.0부터 제공하는 HTTP 통신에 유용하게 쓸 수 있는 템플릿입니다. HTTP 서버와의 통신을 단순화하고 RESTful 원칙을 지킵니다. 'org.springframework.http.client' 패키지에 있으며, HttpClient는 HTTP를 사용하여 통신하는 범용 라이브러리이고, RestTemplate은 HttpClient를 추상화(HttpEntity의 JSON, XML 등 변환)해서 사용하기 쉽게 제공해줍니다. @Bean public RestTemplate restTemplate() { HttpComponentsClientHttpRequestF..

Spring Boot Google OTP 2단계 보안인증 (Authenticator) 개념과 간단한 코드

'Spring Boot 2단계 보안인증 Google OTP, Authenticator' 2FA (Two-factory authentication) 2단계 보안인증이란, 이메일, 문자 메시지 또는 Google Authenticator 앱으로 전송된 6자리 코드를 입력하도록 요청하는 아이디, 비밀번호 로그인 다음의 2번째 인증 단계로 이때 발급된 코드는 30초 또는 60초 후에 만료됩니다. 만약 타인에게 계정의 아이디와 비밀번호가 노출된 경우 2단계 인증이 설정되어 있다면 2단계 인증에서는 계정의 주인에게 전송된 2FA 코드를 확인하기 위해 계정의 주인이 등록한 모바일 장치가 필요하기 때문에 계정을 보다 안전하게 보호할 수 있습니다. 해당 포스팅에서는 Spring Boot 프로젝트에서 2FA 중 Google..

Querydsl DTO 조회하는 방법(Projection, @QueryProjection)

Projection 연산이란, - 한 Relation의 Attribute들의 부분 집합을 구성하는 연산자입니다. - 결과로 생성되는 Relation은 스키마에 명시된 Attribute들만 가집니다. - 결과 Relation은 기본 키가 아닌 Attribute에 대해서만 중복된 tuple들이 존재할 수 있습니다. => 쉽게 Projection이란, '테이블에서 원하는 컬럼만 뽑아서 조회하는 것'이라고 할 수 있습니다. * Relation 데이터를 원자 값으로 갖는 이차원 테이블 * Column = Attribute (프로젝션 대상이 하나일 때는 그 대상의 타입으로 반환되지만, 프로젝션 대상이 둘 이상일 때는 Tuple 또는 DTO로 변환할 수 있습니다.) Querydsl DTO로 조회하는 방법(Projec..

Querydsl 개념 및 Gradle 환경설정 (gradle-7.x.x)

- Querydsl 개념 및 Gradle 환경설정 QUser user = QUser.user; List result = queryFactory .select(user) .from(user) .where(user.name.eq("Jan")) .fetch(); // SELECT * FROM user WHERE user.name = 'Jan' 'Querydsl 이란?' Querydsl은 HQL(Hibernate Query Language) 쿼리를 타입에 맞게 안전하게 생성 및 관리할 수 있게 해주는 프레임워크입니다. 쉽게 자바 코드를 기반으로 SQL 쿼리를 작성해준다고도 이야기할 수 있습니다. Querydsl을 사용하는 이유는 무엇일까요? SQL은 문자이기 때문에 type-check가 불가능하고, 실행해보기 ..

반응형