본문 바로가기

Develop/Spring40

벌크 연산으로 인한 데이터 값 불일치 문제 해결하기 📌 벌크 연산이란? 데이터베이스에서 대량의 데이터를 한 번에 처리하는 기술을 말한다. 📌 장점 - 성능 향상 : 대량의 데이터를 한 번에 처리하는 기술이기에, 데이터베이스와의 통신 횟수가 감소한다. - 코드 간결성 : 복잡한 반복문과 데이터 조작 코드를 줄일 수 있다. - 트랜잭션 최적화 : 트랜잭션 내에서 데이터 조작을 최적화할 수 있다. (데이터 일관성, DB 락 관리 측면에서 유리) - 쿼리 최적화 : DB 내부적으로 쿼리를 최적화하는 기회를 제공한다. (효율적인 리소스 사용 가능) 📌 단점 - 메모리 사용 : 대량의 데이터를 메모리에 로드하고 처리하기 때문에, 메모리 사용량이 증가할 수 있다. - 데이터 일관성 : 잘못된 벌크 연산을 구현하거나 트랜잭션 처리가 제대로 되지 않으면, 데이터 불일치 .. 2023. 8. 29.
[Spring Data JPA] N+1 문제를 해결하기 위한 방법(JPQL의 fetch join, @EntityGraph, ...) 먼저, N+1 문제란 무엇일까? ORM(Object-Relational Mapping) 기술을 사용하는 경우에 발생할 수 있는 문제로,연관 관계가 있는 데이터를 조회할 때, N번의 쿼리가 추가적으로 발생하는 것을 말합니다.더보기ORM 기술에는 익히 들어본 Spring Data JPA, Hibernate 등이 있습니다    표현 방식의 측면에서 N+1 문제와 1+N 문제의 상황으로 나눌 수 있습니다.(둘은 같은 개념이고 나가는 쿼리 수도 동일합니다)  다음 예시를 통해 살펴봅시다.  N+1 문제 (일대다 관계) : 하나의 부서에는 여러 명의 직원이 존재하고, 모든 부서를 조회하는 상황 한 번의 쿼리로 모든 부서를 조회이후, 각 부서별로 N번의 쿼리를 추가로 실행하여 각 부서의 직원 정보를 조회→ 부서 조회.. 2023. 6. 26.
서버에서 내려주는 에러 메시지를 직접 정의해야만 하는 이유 1차원적으로 개발자가 에러 메시지를 마음대로 컨트롤할 수 없음이 제일 큰 문제이다. 이유를 좀 더 상세하게 풀어보자. 스프링 프레임워크에서 기본으로 제공되는 형식화된 StatusCode, ErrorMessage로 응답을 내려주기 때문에, 소통하는 상대 서버나 클라이언트가 이해할 수 없다. 또, 상호 간에 정해놓은 에러 메시지에 대한 규칙이 깨질 수 있다. 에러 메시지를 서버에서 커스텀하게 정의해주지 않게 되면, 스프링 프레임워크에 종속적인 에러 메시지를 가져다 쓰게 되는 것이고 자연스레 개발자는 스프링 프레임워크에 의존적이게 되는 것이다. 어느 날 갑자기 스프링 프레임워크가 특정 에러에 대한 업데이트를 한다면, 갑자기 클라이언트에서 예상치 못한 장애가 발생할 수 있게 된다. 또 다른 이유로는 의도치 않게.. 2023. 4. 22.
트랜잭션 적용 순서 ✔ 클래스 레벨과 메서드 레벨의 트랜잭션 적용 순서 클래스 레벨과 메서드 레벨에 @Transactional 애너테이션을 추가할 때 트랜잭션은 다음과 같이 적용된다. 클래스 레벨에만 @Transactional이 적용된 경우 클래스 레벨의 @Transactional 애너테이션이 메서드에 일괄 적용 클래스 레벨과 메서드 레벨에 함께 적용된 경우 메서드 레벨의 @Transactional 애너테이션이 적용 만약 메서드 레벨에 @Transactional 애너테이션이 적용되지 않았을 경우, 클래스 레벨의 @Transactional 애너테이션이 적용 더보기 ✔ 조회 메서드에 @Transactional(readOnly = true) 로 설정하는 이유 findeMember()와 같은 조회 메서드에 @Transactiona.. 2023. 1. 25.
@Value 애너테이션으로 값을 불러올 때, 항상 null 값이 오는 경우 app-key와 app-secret을 application.properties 파일에 key, value 형태로 담아둔 후, 콘솔창에서 확인하기 위해 다음과 같은 시도를 했다. 1. new로 객체 생성 후, 값 가져오기 로직은 위와 같고, 실행 결과는 다음과 같았다. 모두 null 값으로 불러진 것을 확인했다. 테스트 코드로 값을 불러온 결과에서는 application.properties에서의 값들을 정상적으로 받아오는 걸 확인했고, 그렇다면 @Value 애너테이션이나 기타 파일의 코드는 문제가 없다는 걸 알 수 있었다. 2. 필드 변수를 static으로 선언해서 값 가져오기 이번에는 객체를 생성하지 않고, 필드 변수 그대로 받아와서 값을 출력해보았다. 결과는 다음과 같았다. 동일하게 두 변수 모두 nu.. 2023. 1. 10.
application.properties 파일에 민감한 정보 담기 증권사 데이터가 필요해서 한국투자증권의 Open API를 사용해야 하는 상황이 생겼다. 이 과정에서 appkey와 appsecret라는 민감한 정보를 프로젝트 소스 코드 상에서 감추어야 했다. 우선, 민감한 정보를 담을 application-api-key.properties 라는 파일을 만들어 주었다. 파일명은 application-[name].properties로 설정한다. 생성한 파일 안에 민감한 정보를 key, value 형태로 담아준다. 예시로 *****로 넣어주었으니, 본인의 상황에 맞는 key, value 값을 추가하면 된다. 그 후에, 기존에 있던 application.properties 파일에 해당 문구를 추가한다. 민감한 정보가 담긴 파일 이름이 application-api-key.pro.. 2023. 1. 10.
ddl-auto 옵션 ddl-auto 옵션 종류 💡create : 기존 테이블 삭제 후 다시 생성 (DROP + CREATE) 💡create-drop : 종료 시점에 DROP (기능은 create와 동일) 💡update : 변경된 부분만 반영 💡validate : Entity와 Table이 정상적으로 매핑되었는지 확인 💡none : 사용하지 않음 주의 사항 운영 단계에서는 create, create-drop, update를 사용하면 안된다. 개발 초기 단계에서는 create, update를 사용한다. 테스트 단계에서는 update, validate를 사용한다. 스테이징과 운영 단계에서는 validate 또는 none을 사용한다. 운영 단계에서 create를 사용하면 안되는 이유는 기존의 DB 테이블을 삭제하고 다시 생성시키기.. 2022. 12. 23.
Spring WebFlux WebFlux란 Reactor의 타입인 Flux가 Web에서 사용되는 것으로, 리액티브한 웹 애플리케이션을 구현하기 위한 기술 자체를 상징하고 있다. Spring WebFlux란 Spring 5부터 지원하는 리액티브 웹 애플리케이션을 위한 웹 프레임워크로, Spring WebFlux 프레임워크를 사용해서 리액티브한 웹 애플리케이션을 구현할 수 있다. Spring WebFlux에서 꼭 Reactor만 사용할 수 있는 것은 아니다. Reactor 이외의 리액티브 라이브러리인 ReactiveAdapter와 ReactiveAdapterRegistry를 통해 사용이 가능하다. - https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/spring.. 2022. 12. 1.
Spring WebFlux - Reactor (Project Reactor) Reactor (=Project Reactor) Reactive Streams 표준 사양을 구현한 구현체 중 하나 Reactive한 애플리케이션으로 동작하는 데 핵심적인 역할을 담당하는 라이브러리 - https://projectreactor.io/ Reactor 특징 Non-Blocking 통신 지원 Publisher 타입으로 Mono[0|1], Flux[N] 두 가지 타입을 제공 MSA(Microservice Architecture)에 적합 Backpressure - https://projectreactor.io/docs/core/release/reference/#reactive.backpressure Reactor 구성 요소 Reactor Sequence의 시작점 Flux 데이터를 emit하는 Pub.. 2022. 11. 30.