반응형

Dev 9

Sync/Async와 Blocking/NonBlocking 성능 비교

개요Common 모듈을 구현하면서 FileProcess에 대한 정의와 어떻게 I/O처리 과정에서 Sync/Async와 Blocking/NonBlocking이 등장하게 되었는지 배경을 소개한다.기존 프로젝트에서 파일 업로드 및 파싱을 하여 변환하는 프로세스가 존재했다. 처음 구현한 방식은 MultiPartFile을 받고, LocalStorage에 파일을 쓰고, 쓴 파일을 다시 읽어 파싱한 후 파싱 결과를 DB에 저장하도록 되어있었다.동기화 문제기존 방식은 MultiPartFile → Local Save → Local Load → Parsing순서로 하나의 thread에서 요청이 들어온 순서대로 처리를 진행하였다.만약 여러 사람이 동시에 요청을 보낸다면?즉 thread 여러 개가 동시에 요청을 보낼 때 공유..

Dev 2024.05.31

Multi-Thread 동시성 제어 방법

시작하기 앞서 ‘본 문서는 동시성과 관련된 용어들을 정리해 보고, 프로젝트를 진행하면서 발생했던 동시성 문제를 다양한 동시성 처리 기법들을 사용하여 해결하여 결과 비교 분석’을 위해 작성되었습니다..동시성 관련 용어병렬처리(Parallel Computing)병렬처리는 간단히 말해서 여러 명령을 같은 순간에 처리하는 것입니다. 일반적으로 하나의 CPU 코어는 한 번에 하나의 명령을 처리할 수 있습니다. 만약 하나의 프로그램에서 다중 코어를 이용해 여러 명령을 한 번에 처리한다면 병렬 처리라고 할 수 있습니다. 반드시 CPU 코어를 사용해서 병렬처리를 할 수 있는 것은 아니고, 수천 개의 코어로 이루어진 GPU를 활용하여 병렬처리를 하는 방법도 있습니다.멀티쓰레딩(Multithreading)OS가 제공하는 ..

Dev 2024.05.03

Spring Boot 3.0.X에 Kotlin JDSL 적용하기

Line에서 JPA의 Criteria API를 이용한 동적 쿼리 생성을 조금더 직관적으로 사용하기 위해 Kotlin JDSL을 개발하고 오픈소스로 전환하였습니다. Kotlin JDSL 여기를 보면 자세한 코드를 확인할 수 있습니다. GitHub - line/kotlin-jdsl: Kotlin DSL for JPA Criteria API without generated metamodel and reflection. Kotlin DSL for JPA Criteria API without generated metamodel and reflection. - GitHub - line/kotlin-jdsl: Kotlin DSL for JPA Criteria API without generated metamodel ..

Dev 2023.04.19

그리드 분할을 이용한 Weighted A* 성능 최적화

지난 포스팅에서 A*, Weighted A*에 대해 설명하고 왜 경로찾는 알고리즘에서 Weighted A*가 조금더 성능이 좋은지 알아보았습니다. 사실 A*부터 weighted A* 까지 오게된 이유는 개발중인 프로젝트에서 장애물을 피하면서 특정 경유지를 필수로 지나 목적지 까지 NxN크기의 그리드에서 배관을 자동으로 설계 할수 있도록 경로를 구해야하는 이슈가 있었습니다. 일반적인 A*알고리즘을 이용하면 dijkstra 보다 큰 그리드에 대해 출발지와 목적지 사이의 경로를 빠르게 구할수 있습니다. 하지만 이 또한 그리드 크기가 커지거나 경유지가 많아질 경우 불필요한 확장을 많이 하여 탐색 속도가 저하됩니다. 기존의 A*알고리즘의 성능을 향상시키기 위해 weighted A*알고리즘을 도입하였고 휴리스틱 함..

Dev 2023.04.01

A Star Algorithm(A*, Weighted A*)

A Star 알고리즘은 기본으로 Djikstra 알고리즘을 확장한 개념으로 다음 노드로 이동하는 과정에서 가중치가 가장 작은 노드를 우선으로 탐색하는 개념은 동일하다. 우선순위 큐에서 Top을 뽑을 때 djikstra는 시작부터 현재 노드까지 누적비용(g)가 가장 작은 노드를 우선으로 뽑는다. 하지만 A*는 현재까지 누적 비용(g)와 현재 부터 목적지 까지의 휴리스틱 비용(h)를 합쳐 가장 작은것을 우선으로 뽑는다. 이해를 돕자면 djikstra는 현재에 충실하는 반면, A*는 미래까지도 확인하여 탐색하는 노드 확장을 기하 급수적으로 줄일 수 있다. 아래 그림은 (Djikstra, A*, Weighted A*)를 사용했을때 탐색 범위이다. G 값 계산 A*의 g값을 계산하는 방법은 다양하며, 확장 방향에..

Dev 2023.04.01

IntelliJ 한글 깨짐 원인 & 해결

인텔리제이에서 한글 깨짐이 발생하였습니다. 검색을 해보면 다양한 해결 방법이 나오는데요. 저는 전부 해봤는데 안되더라구요... 셋팅 -> 에디터 -> 파일 인코딩 수정도 해보고, Edit Custom VM Option 도 해보고 다 해봤는데 결과는 실패 ㅠㅠ 원인 한참 원인을 찾다가 문득 생각난게 혹시 JDK 버전 문제인가...?? 저는 JDK 버전을 JDK11, JDK18 두개를 쓰고 있는데 프로젝트 셋팅할 때 높은 버전이 좋겠지 하고 JDK18을 사용하였습니다. https://bugs.eclipse.org/bugs/show_bug.cgi?id=579383 579383 – [18] encoding proeblem: utf-8 output of Java 18 not shown correctly in Co..

Dev 2023.03.11

OOME(Out Of Memory Error) 발생 및 해결

프로젝트를 배포하고 실제 테스트 도중에 갑자기 서버가 멈추는 서비스 장애가 발생하였다. 로깅을 처리해 놓지 않아 에러를 발견하는데 어려움이 있었고 서버를 foreground로 실행하여 어떤 에러가 발생하는지 확인해 보았다. 에러는 다음과 같았다.( OutOfMemoryError: Java heap space 띠용...????) 순간 뇌정지가 왔지만 마침 학교에서 운영체제를 배우고 있어 수업때 배운 여러가지 내용이 머릿속을 스쳐지나갔다. (메모리 초과??, Heap??, 동적할당??, Page fault??, JVM?? 등등....) 처음에는 단순히 힙 사이즈가 작아서 그런가?그럼 JVM의 Max_Heap_Size를 늘려주면 되겠네 라고 생각했었다. 이전에 java는 jvm 위에서 컴파일 되고 실행된다는 ..

Dev 2022.11.30

XML vs JSON vs YAML

안녕하세요! 프로그램을 개발하다 보면 .xml, .yml, .json 과 같은 파일들을 많이 발견할 수 있습니다. 그래서 오늘은 XML과 YAML(yml), Json이 각각 사용되는 곳을 알아보고 마지막으로 각각의 사용 방법에 대해 알아보도록 하겠습니다. 1. XML XML은 데이터를 저장하고 전달할 목적으로 만들어졌으며, 저장되는 데이터의 구조를 기술하기 위한 언어입니다. XML은 EXtensible Markup Language의 약자로, 수많은 응용 분야에서 데이터를 저장하고 전달하는 중요한 역할을 맡고 있습니다. 우리는 기본적으로 Markup Language로 HTML을 떠올릴수 있습니다. XML의 구조는 HTML과 매우 유사하지만 큰 차이점이 존재합니다. 예를 들면 HTML에서는 미리 약속된 태그..

Dev 2022.02.07

API 설계

안녕하세요! 백앤드 개발을 할때 API설계는 가장 먼저 나와야 하는 필수 요소라고 할 수 있습니다. 오늘은 처음 API를 설계 하면서 발생 했던 문제점과 해결, 그리고 아쉬운점에 대해 정리해보는 시간을 가져보도록 하겠습니다. 1. API란 API란 (Application Programming Interface)약자로 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 말합니다. 2. REST API vs SOAP API (1) REST API(Representational State Transfer) REST(Representational State Transfer)는 네트워크를 통해서 컴퓨터들끼리 통신할 수 있게 해주는 아키텍처 스타일입..

Dev 2022.02.07
1
반응형