전체 글
-
Spring Garbage collection 튜닝ETC 2024. 3. 30. 23:35
서론 회사에서 다양한 객체를 최적화를 해보며, 객체들을 효과적으로 다루는 법에 대해 관심이 많아졌다. 하이퍼커넥트의 https://hyperconnect.github.io/2023/05/30/Python-Performance-Tips.html 해당 글을 상당히 인상깊게 읽고, Garbage Collection 튜닝이 객체메모리를 효과적으로 다루는 방법중 하나라는 것을 알게 되었다. 실제로, 인스타그램에서는 Python으로 서버를 구축하는데 GC 시간을 단축시키고 성능을 올리기 위해서 GC를 아예 하지 않는 다고 한다. 그래서 Spring에서는 어떻게 하면 GC를 효과적으로 튜닝할 수 있을까 궁금해서 해당 내용에 대해서 테스트를 진행해봤다. 본론 Spring 에서 Heap size를 조절하면서 GC를 튜..
-
Kafka를 이용한 채팅서버 개발Spring 2024. 3. 15. 23:34
서론 Spring Boot를 이용하여 채팅서버를 개발해보았다. 기본적으로 채팅같은 경우에, 실시간성이 중요하고 지속적으로 통신을 진행해야 하기 때문에 socket 통신을 기반으로 제작하였다. 만약 채팅방이 하나만 있는 경우에는 하나의 소켓풀만 관리를 하여, 유저가 채팅을 날리면 해당 소켓풀에 존재하는 모든 인원들에게 메세지를 보내주면 된다. 만약 채팅방이 여러개라면 ? 여러개의 소켓풀을 개발자가 직접관리하고, 새롭게 들어온 소켓에 대해서 기존의 소켓풀에 할당하거나 새로운 소켓풀을 일일히 만들어야 한다는 단점이 존재한다. 이러한 단점을 극복하기 위해서 STOMP 프로토콜을 사용하였다. 해당 프로토콜의 동작원리를 위와 같다. Publisher가 특정 토픽에 메세지를 보내면, 해당 토픽을 구독하고 있는 ..
-
SQL Query 최적화 (Spring JPA, Go gorm)스터디 2024. 3. 15. 23:34
일반적으로 서버와 DB에서 Query를 만들때 성능적으로 가장 신경써야할 부분은 조회이다 왜 ? 가장 많이 사용될 뿐더러, 일반적으로 가장 많은 데이터들을 scan하고 fetch하기 때문이다 그렇다면 ? Query 성능 최적화를 하기 위해서는 select 쿼리를 신경쓰는것이 중요하다.특히 OneToMany, ManyToMany, ManyToOne 과 같은 연관관계가 존재하는 Table일 경우에 최적화의 중요성은 강조된다. SpringSpring JPA에서는 '지연로딩'과 '즉시로딩' 이라는 방법이 존재한다. @Data static class OrderDto { private Long orderId; private String name; private Loc..
-
AWS S3에 대용량 파일 업로딩 최적화Server 2024. 3. 12. 14:09
Stream Uploading 일반적으로 S3에 객체를 업로드 할 경우에 다음와 같은 스트림 방식을 사용한다 서버에서는 경로를 통해서 파일을 읽고, 전체 파일을 AWS S3에 전달한다 하지만 파일 사이즈가 커지면 커질수록 S3에 전달하느 속도에 이에 비례해서 증가하기 때문에 대용량 파일을 올리기에 적합하지 않다 실제 테스트를 해봤을때 1GB 크기의 파일을 S3에 등록하는데 약 14분 정도가 소요되었다. GB단위를 넘어선 경우에는 매우 큰 시간이 걸릴것으로 예측할 수 있다. 만약 시스템에서 빠르게 대용량 파일을 올려야 하는 경우에는 성능최적화가 필수적이다. 이를 해결하기 위해 AWS MultiPart 업로딩 방식을 사용할 수 있다. AWS Multipart Uploading 해당 방식은 서버에서 멀티쓰레딩..
-
Spring JPA스터디 2024. 1. 24. 18:55
Spring에서는 JPA를 사용해서 데이터베이스 query를 쉽게 처리할 수 있다. 그렇다면 JPA란 무엇일까? JPA를 알기전에 ORM에 대해서 알고 갈 필요가 있다. 웹 서비스는 데이터를 처리할 때 대부분 데이터베이스를 사용한다.그런데 데이터베이스를 사용하려면 SQL 쿼리(query)라는 구조화된 질의를 작성하고 실행하는 등의 복잡한 과정이필요하다. 이때 ORM(object relational mapping)을 이용하면 자바 문법만으로도 데이터베이스를 다룰 수 있다. 즉, ORM을 이용하면 개발자가 쿼리를 직접 작성하지 않아도 데이터베이스의 데이터를 처리할 수 있다. JPA란 ? 스프링부트는 JPA(Java Persistence API)를 사용하여 데이터베이스를 처리한다. JPA는 자바 진영..
-
서버 성능개선 - 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 루프 만큼 서버와 통신이 만들어진다는 것이다. ..
-
Spring - Annotation 정리스터디 2023. 12. 1. 21:16
Spring에는 다양한 Annotation들이 존재한다. Annotation들을 통해서 개발자들은 개발속도를 향상시킬 수 있는 것은 분명하다고 생각한다. 하지만, Spring을 처음 써보는 입장에서 Annotations을 정리를 해야 추후에 개발을 할 때도 수월할 것 같아서 기본적으로 많이 사용되는 Annotations들을 정리하려고 한다. package com.example.restfulwebservice.bean;import com.fasterxml.jackson.annotation.JsonIgnore;import io.swagger.v3.oas.annotations.media.Schema;import jakarta.persistence.*;import jakarta.validation.const..
-
Spring - 기본 개념스터디 2023. 12. 1. 18:15
Node나 Go 로 서버를 구현하고 API를 만드는것은 많이 해보았지만 한국의 개발자들이 가장 많이 사용하는 JAVA기반의 Spring을 사용해본적은 없다. 이번에 Spring을 공부하고 프로젝트를 만드려는 이유는 다음과 같다. 1. 많은 개발자들이 사용하고 있다.2. 라이브러리가 뛰어나서 다양한 기능들을 쉽고 빠르게 사용할 수 있다.3. 정보가 많아서 학습 곡선이 높다 사실 성능적으로 비교를 해보면 Rust, Go 등이 더 우수하기 때문에 Spring을 왜 사용해야 되는가에 대한 의구심이 들었다. 하지만 위와 같은 이유로 Spring을 사용해보려고 하고, 조금씩 하면서 느낀건 유지 보수가 되게 편할 것 같다라는 생각이 들었다. 현재 진행중은 RESTFUL Server의 파일 구조는 다음와 같다. JAV..