분류 전체보기 34

[Kotlin] List가 MutableList를 사용하는 이유

🍎 Kotlin List 사용 중 내부 코드에서 List가 MutableList를 사용하는 것을 발견해 어떤 이유로 MutableList를 사용하는지 정리합니다.+ 또한 이에 적용된 설계 Practice를 정리하고 어떤 방식으로 설계에 녹여낼 수 있을지 정리합니다.🍏 List 생성 내부 Code✓ Immutable(불변)인 List를 호출하는 것을 기대했지만 MutableList를 호출하는 모습을 볼 수 있습니다. 🍏 MutableList 생성 내부 Code✓ List 함수 바로 아래 위치해 있는 MutableList 함수는 ArrayList를 내부 변수로 선언한 후 반복을 통해 Element를 집어 넣습니다. ❓ 왜 List는 MutableList를 호출하는 것일까요??✓ List 또한 Mutab..

TIL 2025.03.30

원자성 보장 코드에서? DB에서?

🍎 마주한 문제에서 데이터의 원자성을 어느 곳에서 관리하면 좋을지 고민하게 되어 정리합니다.🍏 문제 상황✓ 공공데이터 API에서 여러 건의 원시 데이터를 조회한 후, 이를 내부 비즈니스에 활용할 수 있도록 정제하여 저장해야 했다. 이 과정에서 데이터를 여러 개의 테이블에 나누어 저장해야 하는 상황이 발생 ✓ 처음에는 Bulk Insert를 사용하여 성능을 최적화하는 방안을 고려했지만, 하나의 테이블이 아닌 여러 개의 테이블에 데이터를 삽입해야 하기 때문에 Bulk Insert를 적용할 수 없었다. ✓ 결국 데이터를 한 건씩 개별적으로 저장하는 방식이 필요했는데 중간에 데이터 삽입이 실패할 경우 어떻게 처리할 것인가라는 고민이 생겼다. ✓ 데이터 정제 및 저장 로직이 일부만 실행되고 중단될 경우, 데이..

Dev 2025.03.18

Nginx Basic

🍎 Nginx에 관한 기본과 사용 방법을 정리합니다.❓ Nginx는 어떤 도구인가요?-> 공식 문서 출처에 의하면 NGINX(엔진 X)는 HTTP 웹 서버, 리버스 프락시, 콘텐츠 캐시, 로드 밸런서, TCP/UDP 프락시 서버 및 메일 프락시 서버입니다. ❓ 왜 사용하나요?- 어떤 불편함을 해결하기 위해 Nginx라는 도구가 탄생했는지 찾아본다면 사용 이유를 알 수 있습니다.- Nginx 이전 시중엔 Apache HTTP Server(Web Server)를 사용했고 Apache HTTP Server가 가진 몇 가지 한계를 극복하기 위해 Ningx가 등장했습니다. - 초기 웹 서버들은 클라이언트 요청이 증가할 때마다 성능이 급격히 떨어지는 문제가 있었고 특히 Apache의 프로세스 기반 아키텍처가 대량..

TIL 2025.03.06

원시 데이터가 DB에 존재하는 모습

🍎 원시 데이터(이하 Raw Data)를 내부 DB에 저장할 때 어떤 모습으로 담겨야 하는지 생각한 부분을 정리합니다.- 가공되기 전 데이터인 Raw Data는 비즈니스에 사용되기 전까지 한 번 이상의 가공을 거쳐야 하는 데이터입니다.- Raw Data가 중요한 이유는 가공되지 않기 때문에 중요하다고 생각합니다. 가공된 후 다양한 모습으로 비즈니스 데이터가 될 수 있으며 혹시나 가공 처리 과정에 오류가 있어 오염이 될 경우, 근원 데이터로 오류 추적, 개선을 할 수 있기 때문입니다. ❓ 어떻게 Raw Data를 저장해야 할까?- Raw Data의 모습은 규정할 수 없이 다양한 형태로 존재합니다. 외부 API에서 제공하는 데이터가 Raw Data가 될 수 있고 운영되는 서비스의 사용자 활동 이력도 Raw..

TIL 2025.03.05

[Tip] @Scheduled 와 Cron 어떤 것을 선택해야할까?

🍎 시스템 내부에서 반복적인 작업을 처리해 줄 도구를 고를 때 어떤 부분을 고려하면 좋을 지 정리합니다.🍏 의사 결정이 필요하게 된 이유- 공공데이터를 3분에 한 번 API 호출하여 갱신된 Raw Data를 가져와야 하는 요구 사항 존재- 반복 요청을 OpenAPI Server에 전달해야하는데 어떤 도구를 사용해야할지 고민 🍏 다룰 수 있는 도구 중 Schedule 기능을 제공해주는 도구- Spring Scheduler (@Scheduled)@Serviceclass TestService { @Scheduled(cron = "0 */3 * * * *") // 매 3분마다 실행 (초, 분, 시, 일, 월, 요일) fun executeTask() { println("TestServic..

Dev 2025.03.04

[Dev] 프로세스 메모리 할당과 JVM

🍎 저수준에서 힙영역 메모리 할당에 관하여 알아보고 운영체제의 상을 차용한 JVM 에선 어떤 차이가 있는지 알아보는 글입니다.(저수준의 언어 == C언어)🍏 프로세스 주소 공간과 구성 요소의 역할- 프로세스의 주소 공간은 위 이미지와 같이 구성되며, 코드 영역은 낮은 주소부터 시작하고, 스택 영역은 높은 주소부터 하향식으로 동적으로 확장됩니다. Code Area(코드 영역)프로세스의 주소 공간의 코드 영역에는 프로그래머가 작성한 코드, 더 정확하게는 컴파일한 후 생성된 실행 가능한 명령어가 저장됩니다. 스레드가 공유하는 영역이며 프로그램이 실행되는 동안은 코드를 수정할 방법이 없으므로 스레드 안전 문제가 발생하지 않습니다.Data Area(데이터 영역)데이터 영역은 전역 변수가 저장되는 곳입니다..

Dev 2024.11.12

[Dev] 서버 클라이언트 사이 버전을 관리하는 방법

🍎 상황 설명- 서비스 리뉴얼의 기반이 아직 완전히 준비되지 않은 상황 (예: 사용자 DB 설계, 인증 시스템)에서 요구사항 할당- 현재 제공 중인 서비스를 유지하면서도 사용자에게 새로운 기능을 제공해야 하므로, 레거시 시스템을 기반으로 API를 개발.- 서비스의 기반이 완성된 이후, 개발팀 내부 의견 조율을 거쳐 기존 기능을 개선하고 리팩터링 하기로 결정.- 결과적으로, 레거시 버전과 개선된 버전을 어떻게 관리할 것인가에 대한 문제를 인식하게 됨.🤔 버전관리를 문제로 인식한 이유- 한 번 정해지고 서비스에 반영이 된다면 되돌리기 매우 어렵기 때문입니다.- 리소스로 버전을 관리한다고 가정해 보겠습니다.- 리소스로 버전을 관리하고자 정했으니 클라이언트에서 서버에 요청을 보낼 때 반드시 두 개의 En..

Dev 2024.10.16

Enum을 사용할 때 생각해봐야할 점

🍎 Enum을 "잘" 사용하는 나름의 방법을 예를 통해 정리한 글입니다.🍏 Enum에 관한 정의- Wiki에서 정의한 열거형(Enumeration) 타입은 멤버라 불리는 명명된 값의 집합을 이루는 자료형입니다. 열거자 이름들은 일반적으로 해당 언어의 상수 역할을 하는 식별자입니다. - 위의 내용을 풀어 설명하면, 열거형은 여러 이름이 있는 값들을 하나의 그룹으로 묶은 자료형을 뜻하고 여기서 각각의 값은 ‘멤버’라고 하며, Enum Class는 이러한 멤버들을 정의하는 클래스입니다.e.g) 일주일을 나타낼 때, '월, 화, 수, 목, 금, 토, 일'과 같이 이름을 붙인 값들을 열거형으로 정의할 수 있습니다.📝 생각해 볼 것✓ 어떤 값을 Enum으로 사용해야 할까? 1. 동일한 위상의 값Enum의 멤..

Dev 2024.09.26

Spring @Value를 통해 환경 변수를 주입받을 때 주의할 점

🍎 Spring에서 제공하는 @Value 사용 시 주의해야 할 점을 정리합니다.📝 Kotlin - Spring 환경에서 @Value를 사용할 때 마주한 문제1. @Value로 주입받을 변수를 선언하는 방법- @Value를 주입받기 위해선 app.name 이 application.yml 파일에 정의되어 있다는 가정 하에 아래 두 방식을 사용해 정의될 수 있습니다.// case 01@Value("\${app.name}")val appName: String = "A"// case 02@Value("\${app.name}")lateinit var appName: String// application.yml fileapp: name: abc- case 01의 경우, var를 사용할 때 lateinit을 사용..

Dev 2024.09.16

DB CRUD 작업의 비용 분석

🍎 애플리케이션 개발에서 흔히 당연시되는 영속 계층(RDB)의 CRUD 작업에 대해 더 깊이 이해하고 싶어, 그 비용과 효율성에 대해 정리한 글입니다.❗️ CRUD 작업의 효율성을 논하기 전에, ‘Create’와 ‘Read’가 각각 ‘Insert’와 ‘Select’와 어떻게 다른지 정리해 보겠습니다. 단어가 갖고 있는 의미를 명확하게 정의해 혼란을 없애기 위함입니다.‘Create’와 ‘Read’는 데이터 조작의 추상적인 개념을 나타냅니다.‘Insert’와 ‘Select’는 추상적인 개념을 SQL 명령어로 구체화한 것입니다.- 이 후 글의 진행에선 구체화한 명령어인 SQL의 ‘Insert‘와 ‘Select‘를 사용하겠습니다.(참고로 Update와 Delete 역시 마찬가지입니다. 쓰인 단어의 모양이 동일..

Dev 2024.09.15