Spring
-
AssertJ 오픈소스 컨트리뷰트 하기Spring 2024. 8. 5. 02:37
서론여러 프로젝트를 진행하면서 테스트코드의 중요성에 대해서 느낄 수 있었다. 소형테스트와 중형테스트 그리고 대형테스트를 엄격하게 분리하여 코드를 작성해보며, 각 단계들의 테스트들이 단계에 맞는 역할을 하도록 만들었다. 이를 통해, 각 단계의 테스트코드들의 가독성을 높일 수 있었고 더하여 소형테스트와 Embedded DB를 분리함으로써 성능또한 높일 수 있었다. Spring에서는 일반적으로 AssertJ를 이용하여 테스트코드를 작성한다. AssertJ는 테스트코드 작성을 도와주는 Java Libary이다. Spring 개발자로서 본인도 AssertJ를 밥먹듯이 사용하여 테스트코드를 작성하고 있다. AssertJ를 사용해보며 문득, AssertJ가 어떻게 만들어졌는지에 대해 궁금하여 AssertJ 오픈소스..
-
지연로딩 , 즉시로딩 JPA 최적화Spring 2024. 7. 1. 17:17
서론프로젝트를 진행하며 RDB를 이용해서 많은 테이블들을 JOIN하는 상황이 생겼다. 이전에 JPA의 Annotation(One-to-Many, Many-to-One)을 사용해서 다중관계를 처리한적이 있기 때문에 이를 적용하면 된다고 생각하였다. 하지만, 이를 적용해나가는 과정에서 여러 문제들에 직면하게 되었다. 여러 종류들의 JOIN들을 분석하고 프로젝트에서 최적의 JOIN을 하는 법을 알아보려고 한다.현재 프로젝트에 적용된 EntityLab Entity@Data@Entity@Table(name = "labs")public class LabEntity { @Id @Column(name = "lab_id") private String id;// private enum school;/..
-
Spring - gRPC 적용 성능 최적화Spring 2024. 5. 1. 17:50
서론 Spring MSA 서버를 제작하며 서버 간 통신을 RestTemplate을 기반으로 하였다.RestTemplate은 단순하게 HTTP 기반으로 통신을 하여 데이터를 주고 받는다. RestTemplate은 가장 일반적으로 서버 간에 통신에서 사용되는 방법이라고 생각한다. Jmeter를 이용하여 부하테스트를 하였을 경우, TPS가 32.0/sec 정도로 생각보다 많이 낮게 나왔다. 하나의 서비스에서 TPS가 낮게 나오는 데에는 많은 이유가 있겠지만, 서버간 통신을 진행할때 유독 낮게 나와서 RestTemplate을 기반으로한 HTTP 통신의 근본적인 문제로 인해서 낮게 나오지 않을까 생각하였다. 서버간 통신기법에는 다양한 방법이 있지만, 빠른 직렬화를 바탕으로 데이터를 빠르게 전달할 수 있는 gRP..
-
Kafka를 이용한 채팅서버 개발Spring 2024. 3. 15. 23:34
서론 Spring Boot를 이용하여 채팅서버를 개발해보았다. 기본적으로 채팅같은 경우에, 실시간성이 중요하고 지속적으로 통신을 진행해야 하기 때문에 socket 통신을 기반으로 제작하였다. 만약 채팅방이 하나만 있는 경우에는 하나의 소켓풀만 관리를 하여, 유저가 채팅을 날리면 해당 소켓풀에 존재하는 모든 인원들에게 메세지를 보내주면 된다. 만약 채팅방이 여러개라면 ? 여러개의 소켓풀을 개발자가 직접관리하고, 새롭게 들어온 소켓에 대해서 기존의 소켓풀에 할당하거나 새로운 소켓풀을 일일히 만들어야 한다는 단점이 존재한다. 이러한 단점을 극복하기 위해서 STOMP 프로토콜을 사용하였다. 해당 프로토콜의 동작원리를 위와 같다. Publisher가 특정 토픽에 메세지를 보내면, 해당 토픽을 구독하고 있는 ..
-
서버 성능개선 - sql batchupdateSpring 2024. 1. 11. 18:42
요즘 대용량 데이터를 어떻게 처리하면 성능이 증가할까에 대해 공부를 하고 있다. Spring boot에서 H2에 10000개의 데이터를 넣는다고 가정을 해보자. Method 1) @GetMapping("/api/test1/createusermany1") public void createusermany1() { StopWatch stopWatch = new StopWatch(); stopWatch.start(); for (int i =0 ; i 그럼 단순하게 이런 query 문이 만들어 질것이다. 이 방법은 하나의 데이터가 들어오면 그 데이터를 매번 H2 서버에 insertion 시켜준다. 그렇다면 for 루프 만큼 서버와 통신이 만들어진다는 것이다. ..