Spring

· Spring/JPA
🎯 N+1 을 해결하기 위한 fetchJoinfetchJoin() 은 일대다 연관관계에서 N + 1 문제를 해결하기 위해 한번의 쿼리로 두개의 테이블을 Join 해 데이터를 가져오는 방법 입니다. 아래 코드에서는 Home 과 HomeImage 가 1:N 연관관계 매핑이 되어 있어 이를 해결하기 위해 fetchJoin 을 사용했습니다.  ✅ HomeEntity@Entity@Getter@Builder@Setter@AllArgsConstructor@NoArgsConstructorpublic class Home extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "home_i..
· Spring/JPA
🎯 Tuple 이란 무엇일까 ?Tuple 은 QueryDSL 에서 여러 엔티티나 값들을 한 번에 조회하고 그 결과를 하나의 객체로 묶어서 반환할 때 사용되는 자료형 입니다. 이를 통해 여러 컬림이나 객체를 하나의 결과를 처리할 수 있습니다. 특히 Tuple 은 SQL 쿼리에서 여러개의 값을 조회할 때 유용하게 쓰입니다. 또한 Tuple 은 단순한 데이터 타입 뿐만 아니라, 엔티티 객체와 값 객체 등 다양한 타입을 포함할 수 있습니다. 그리고 Tuple 은 여러 컬럼을 조회한 결과를 각각의 값으로 나누지 않고, 하나의 객체로 묶어서 반환하기 때문에 여러 개의 값을 처리 할 때 유용합니다. 🎯 루트 애그리거트(Aggregate Root) 로 설계된 도메인먼저 User(사용자) 도메인과 Home(집 게시글..
🎯 STOMP 란 무엇일까?STOMP 에 대해 설명하기 전에 웹 소켓 통신에 대해 간단히 설명드리겠습니다. 웹 소켓은 클라이언트와 서버 간의 양방향 통신을 가능하게 하는 프로토콜 입니다. HTTP 와 달리 연결을 유지한 채 데이터를 주고 받을 수 있기 때문에 실시간 채팅, 주식, 게임 등에 많이 사용됩니다. HTTP 와 다른 TCP 프로토콜이지만 HTTP 에서 동작이 가능하게 디자인 되었고 80, 443 포트 를 사용해 방화벽 규칙을 재사용할 수 있도록 설계 되었습니다. 그러면 웹소켓을 사용할 때는 기본적으로 바이너리 데이터 또는 텍스트 데이터를 주고 받을 수 있지만, 메시지의 목적지를 정하거나 규칙을 정하는 기능이 부족합니다. 그래서 STOMP(Simplse Text Oriented Messaging..
🎯 Spring Batch 에서 QueryDSL 를 사용하는게 좋을까?Spring Batch 에서는 데이터를 읽을때(reader) 다양한 ItemReader 를 제공합니다. (ex JdbcCursorItemReader, JdbcPagingItemReader 등등..) 그렇다면 QueryDSL 을 이용한 ItemReader 도 지원하지 않을까해서 찾아봤지만,, 아쉽게도 지원하지 않습니다. 그래서 지금껏 Spring Batch 를 이용해 DB 에서 JPA 를 이용해 데이터를 조회할때 JpaPagingItemReader 를 사용해 쿼리를 직접 작성해줬습니다. 하지만, 직접 쿼리를 작성하는 만큼 타입 안정성, 자동완성, 컴파일 단계 문법체크 등의 이점을 가질 수 없었습니다. 간단한 쿼리라면 괜찮은데 보통 성능..
🎯 SimpleAsyncTaskExecutor vs ThreadPoolTaskExecutor@Async 애노테이션은 Spring 에서 제공하는 비동기(Asynchronous) 작업을 실행할 때 사용하는 어노테이션 입니다. 즉, 메서드를 별도의 스레드에서 실행하도록 만들어서 메인 스레드가 해당 작업을 기다리지 않고 바로 다음 작업을 실행할 수 있도록 합니다. 💡 비동기 작업이란?현재 실행 중인 메서드의 흐름(메인 스레드)과 별개로 실행되는 작업예: 이메일 전송, 파일 업로드, 데이터 처리 등 이러한 @Async 애노테이션을 활용한 비동기 처리는 스레드 풀을 사용해야 훨씬 효율적으로 자원을 관리할 수 있습니다. 하지만 @Async 를 사용할때 아무 설정도 하지 않으면 Spring 은 기본적으로 Simpl..
🎯 Resolver Exception일반적으로 Spring 에서는 다음과 같은 흐름으로 컨트롤러에게 요청이 전달됩니다. WAS -> Dispatcher Servlet -> intercepter -> handler -> service layer 위와 같이 동작하는 과정 중에 service layer 에서 예외가 발생한다면 다시 거꾸로 거슬러 올라가 WAS 까지 돌아와서 발생한 에러를 응답합니다. 이때, 발생하는 예외에 대한 특정 규격이나 구분되는 에러 코드가 없다면 클라이언트측에서 어떤 이유때문에 에러가 발생하는지 파악하기 힘들겁니다. 이러한 이유 때문에 Spring 에서는 ExceptionResolver 를 제공해 예외 발생시 WAS 까지 돌아가지 않고 예외에 대한 결과를 정상적으로 응답한것처럼 클라이..
🎯 현재 JobParameter 사용방법현재 배치 프로젝트에서 JobParameter 로 LocalDate 로 형변환 방법입니다. 먼저 String 으로 날짜 정보를 받아온 뒤, set 에서 직접 LocalDate 로 변환해주고 있습니다. (JobParameter 에서는 LocalDate 타입을 직접 받을 수 없습니다.) ✅ DateParameter@Slf4j@Getter@NoArgsConstructorpublic class DateParameter { private LocalDate requestDate; @Value("#{jobParameters[requestDate]}") @DateTimeFormat(pattern = "yyyy.MM.dd") public void setReq..
🎯 Cache 란 무엇일까?Cache (캐시) 데이터는 이미 한번 처리한 데이터를 임시 저장소에 저장하는 데이터 입니다. 이 데이터들은 다른 요청이 들어 왔을때 이미 임시저장소에 저장되어 있던 정보를 응답해 돌려주기 때문에 속도측면에서 매우 유리합니다. 그렇다면 내부적으로 어떻게 동작할까? 일반적으로 캐시는 메모리(RAM) 을 사용하기 때문에 데이터베이스 보다 훨씬 빠르게 데이터를 응답 할 수 있습니다. 하지만 RAM 은 기본적으로 용량이 적기 때문에 데이터를 모두 캐시에 저장해버리면 용량이 부족한 상황을 마주할 수 있습니다. 그렇기 때문에 우리는 어떤 종류의 데이터를 캐시에 저장할지 판단할 수 있어야하고, 이러한 판단을 하기 위한 척도인 지침 전략을 숙지할 필요가 있습니다. 🎯 캐싱 전략 패턴 종류..
· Spring/JPA
🎯 벌크 연산(Bulk Operation)이란?JPA 에서 벌크 연산은 대량의 데이터에 대해 한번에 변경(삽입, 수정, 삭제)을 수행하는 방법 입니다. 일반적으로 벌크 연산은 많은 양의 데이터를 한 번에 처리해야 할 때 사용합니다. JPA 에서는 JPQL 또는 Criteria API 를 사용해 벌크 연산을 수행하며, 벌크 연산은 성능을 크게 향상 시킬 수 있습니다. 하지만 벌크 연산은 영속성 컨텍스트 (Persistence Context) 를 무시하고 직접 DB 에 접근해 쿼리를 실행하기 때문에 주의할점이 있습니다. 벌크 연산에 특징에 대해 정리하면 다음과 같습니다.✅  영송석 컨텍스트 무시 : 벌크 연산은 영속성 컨텍스트에 있는 엔티티가 아닌 DB 에 직접 수행되므로, 벌크 연산 후에 영속성 컨텍스트..
🎯 정산 정보 CSV 파일 다운로드 API요구사항을 다시 한번 살펴보면 다음과 같습니다. 정산 결과 파일 생성 및 다운로드정산 결과 파일 생성: 정산 결과를 CSV 또는 Excel 파일로 생성하는 기능을 구현합니다. 파일에는 가게별 매출, 수수료, 최종 정산 금액 등이 포함되어야 합니다.파일 저장소 관리: 생성된 파일을 AWS S3 또는 로컬 파일 시스템에 저장하는 기능을 구현합니다.파일 다운로드 API: 저장된 정산 결과 파일을 다운로드할 수 있는 REST API를 제공합니다. 가게별로 파일을 조회하고 다운로드할 수 있어야 합니다. 요구사항에 맞춰 만들어야 하는 REST API 는 두개입니다. - 가게별 일매출 정산 정보를 CSV 로 다운받는 API- 가게별 월매출 정산 정보를 CSV 로 다운받는 A..
신민석
'Spring' 카테고리의 글 목록