Spring

·Spring
[이전 편]- 1편 : [Spring Boot] Spring 대용량 데이터 페이징 처리하기 1탄(Spring Data JPA + PostgreSQL)이전편을 보고 오시면 N+1 문제 이외에 Page 객체를 사용함으로 발생한 테이블 풀스캔 문제와 인덱스 생성, 쿼리실행 계획 등 성능최적화 부분에서 알 수 있는 부분들이 있으니 안 보신분들은 보고 오시면 2편을 이해하시는데 도움이됩니다. 저는 PostgreSQL DB에 데이터 5천만건을 삽입하고 이를 최적화하는 작업을 했으며 1탄과 이어집니다. N+1 문제 해결하기 해당 코드는 postId를 가져와서 postId를 기반으로 Hashtag 엔티티, Image 엔티티를 불러오는 로직이 존재합니다.  이 문제의 원인은 postHashtagRepository.fin..
·Spring
대규모 Insert 방식 선택 및 구현먼저 Spring Data JPA + PostgreSQL을 사용하여 데이터 5천만건 페이징을 구현하기 위해서는 더미 데이터를 Insert 해야했습니다. 각종 자료를 리서치해보니 JPA로 데이터를 밀어 넣는 것보다 JDBC를 사용하는 것이 훨씬 성능이 좋다는 것을 알게 됐습니다. 순수 JDBC Insert 시 장단점장점:최적화 시 삽입속도가 가장 빠름단점:SQL을 직접 관리해야한다.직렬화/재시도 로직 직접구현Spring Batch(JPA)장점:추상화된 API를 제공Chuck 처리, Skip 로직 내장스케줄링 가능단점:ORM 오버헤드 때문에 삽입 속도가 느림 저는 성능최적화가 가장 큰 목적이라 JDBC를 선택했습니다. reWriteBatchedInserts=true을 적..
·Spring
Gradle 의존성 implementation과 runtimeOnly 의 차이점Implementation은 코드에서 실제로 해당 라이브러리를 참조하고 싶을 때 사용한다. 예를들면 Redis 라이브러리인 Redisson 라이브러리를 사용한다고 했을 때 아래처럼 사용한다.redissonClient.getLock() 직접 의존성을 부여해서 getLock()이라는 메서드를 사용하기 때문에 이것은 Implementation로 종속해주어야 한다.jar파일로 묶일 때 당연히 같이 따라오고, 다른 모듈에서는 사용이 불가능하다. 다른 모듈에서 사용 불가능하다는 이야기는 내가 LikeService 내부에서 RedissonClinet를 사용하고 있는데 PostService에서 LikeService를 참조하여 redisson..
·Spring
RestTemplate란?RestTemplate는 자바에서 API 호출을 위해 사용되는 Http Client 입니다. 사용하기 간단하고 스프링5 이하 버전부터 많이 사용됐습니다. 동작방식은 멀티 스레드, 블로킹 방식을 사용하는데요. 스레드 풀에서 미리 스레드를 만들어 두었다가 사용자의 요청이 들어오면 각 스레드를 할당해주는 방식으로 사용됩니다. 블로킹 방식이기 때문에 하나의 스레드가 응답을 받을 때까지 해당 스레드는 사용할 수 없습니다. 만약에 동시 사용자가 많아지면 그만큼 스레드도 많이 필요하겠지요.만약에 스레드가 부족해지면 Que에 요청을 대기시키고, 스레드의 작업이 끝나면 새롭게 요청을 할당 받습니다. 다만 Que에 요청대기가 시작되는 순간부터 서비스는 급격하게 느려지기 시작합니다.WebClient..
·Spring/JPA
DataIntegrityViolationException란?DataIntegrityViolationException은 데이터 무결성 제약 조건을 위반했을 때 발생하는 에러다.나는 JPA에서 Board 엔티티와 Comment 엔티티를 다음과 같이 매핑했다. import jakarta.persistence.*;import lombok.Getter;import lombok.NoArgsConstructor;import lombok.Setter;import java.util.ArrayList;import java.util.List;@Entity@Getter@Setter@NoArgsConstructorpublic class Board { @Id @GeneratedValue(strategy = Generatio..
·Spring/JPA
문제발생스프링부트와 JPA로 게시판을 구현하고 있었는데 Repositroty에서 예외가 발생했다. 보통 Repository에서 예외가 발생하면 Controller까지 Exception이 전달되어 내가 원하는 상태 메시지를 ResponseEntity로 반환해야한다.  @PostMapping("/edit/{boardId}") public ResponseEntity boardEditUpdate(@PathVariable("boardId") Long boardId, @RequestBody BoarRequestDTO bDTO, Ht..
·Spring
서문Spring MVC를 넘어서 리액트와 스프링 풀스택 개발을 시도해보고 싶어졌습니다. 이를 위해서 Restful API를 설계해야하는데 혼자서 MVC 개발하던 패턴과는 아예 다른 방법으로 응답을 제공하더라구요.. 바로 ResponseEntity를 사용해서 stateCode, body 등을 반환했는데 이를 공부하면서 블로그에 정리하려고 합니다. 잘 몰라서 공부하며 정리한 것이라 만약에 틀린 부분이 있다면 댓글 부탁드립니다.. ㅜㅜResponseEntity는 무엇이고, 왜 사용하는걸까?Spring에서는 @ResponseBody로 DTO를 반환하면 알아서 Json으로 변환해 주기도 하고, 혼자 스프링 MVC로 개발할 때는 협업이 아닌  개인 개발이기 때문에 상태코드를 세밀하게 반환하지 않았어요. 적당한 예..
Rest-Assured가 무엇인가?RestAssured는 REST API를 테스트하기 위한 Java DSL(Domain-specific language)이에요.get, post, put, delete, patch 등 여러 요청과 응답을 검증하는데 사용해요.  OpenAI Thread 생성 예제open ai api에서 gpt를 사용하려면 각 대화창 즉 스레드가 필요해요.참고 - https://platform.openai.com/docs/assistants/overviewopen ai의 api key가 발급되었다는 가정하에 예제를 풀어볼게요.  1. 의존성 설정스프링부트 3.2.x version 기준testImplementation 'io.rest-assured:rest-assured:5.4.0' 2. 테스..
gymlet
'Spring' 카테고리의 글 목록