TIL 13

[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

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]비즈니스 로직은 무엇인가요?

🍎 현업에서 일하기 전 서버 개발을 공부할 때 주변에서 들려왔지만 정의가 되지 않아 멀게만 느껴졌던 비즈니스 로직에 대해 정의합니다. 🍏 비즈니스 로직이란비즈니스 로직이란 개발하고 있는 서비스(애플리케이션) 내부에서만 사용되는 로직을 의미합니다. - 클라이언트 레벨에서 애플리케이션이 실행되는 동안 발생하는 이벤트를 기록하는 로깅 프로세스는 애플리케이션의 특정 요구사항을 처리하는 로직이 아닙니다. 이는 애플리케이션이 정상적으로 동작하기 위해 필요한 기본적이고 기술적인 기능을 처리하는 General 한 로직입니다. - 비즈니스 로직은 특정 도메인의 애플리케이션이 특정 비즈니스 요구 사항을 처리하는 로직으로 애플리케이션의 기능과 관련된 규칙 그리고 절차를 정의합니다.- 예를 들면 온라인 쇼핑몰의 주문 처리..

TIL 2024.09.05

Redis Container vs Embedded Redis 어떤 것을 선택해야 할까요?

🍎 Test Package에서 Redis 환경 구축 중 어떤 Redis 환경을 선택해야 할지 고민이 생겨 글을 포스팅합니다. 📚 Redis Container vs Embedded Redis 두 환경은 Redis를 사용하지만 다른 점이 존재합니다. 각각의 장단점을 알아보고 어떤 조건에서 어떤 환경을 선택해야 하는지 알아봅시다. 🍎 Redis Container의 장단점 - Container Redis는 독립된 Redis 서버를 Container 형태로 실행합니다. 주로 Docker를 사용합니다. ✅ 장점 - 외부 Redis 서버와 동일한 기능과 구성 옵션을 제공합니다. 테슽 환경에서 실제 운영 환경과 동일한 Redis 서버를 사용할 수 있습니다. - 복잡한 환경이나 다른 시스템과의 통합 테스트를 보다 유연하..

TIL 2023.06.07

[Python] Multi Processing과 [Java] Multi Processing 차이

🍎 Python Crawling Application을 개발하면서 I/O Bound 작업 처리는 Thread를 사용해 처리하는 것이 유리하고 CPU Bound 작업 처리 시엔 자식 프로세스를 여럿 생성해 작업을 처리하는 것이 유리하다고 배웠습니다. 그런데 Java 진영에선 Multi Processing을 어떻게 처리할까요? ❓ 어디서부터 비롯된 궁금증인가요? • Python 진영에선 Multi Processing을 자식 프로세스를 생성해 CPU Bound 작업을 맡아하는 반면 Java 진영에선 여러개의 JVM Instance를 추가적으로 생성해 처리하지 않습니다. 어떤 방식으로 Java 진영에서 Multi Processing을 처리할까요? 🍎 Java는 Thread를 통해서 Multi Processing..

TIL 2023.04.24

노출되면 안되는 데이터는 어떤 방식으로 처리할 수 있을까요?

🍎 주소 값을 기반으로 외부 API와 통신해 좌표를 얻어 올 수 있었습니다. 여기서 고민할 부분이 생겼습니다. 외부 API 요청에 대한 응답 시 계정에 부여된 ClientId, ClientKey를 어떤 방식으로 관리하는지입니다. 🍎 노출을 관리해야 하는 이유는 외부에 ClientId, ClientKey가 노출되면 불특정 사용자가 API를 사용하게 될 것이고 이는 많은 문제를 유발할 수 있기 때문입니다. ❓ 외부에 노출되면 안 되는 데이터는 어떤 방식으로 관리해야 안전할까요? 🍏 찾아본 결과 크게 세 가지 방법이 존재합니다. 1. Hard Coding : 필드에 노출되는 값을 정의하고 사용합니다. 2. 환경 변수에 등록해 사용 : Spring 환경에서 @Value를 통해 값을 주입해 사용합니다. 3. 외부..

TIL 2023.04.16

[Python] Thread 설계 의도를 파악한 성능 개선. 7초에서 3초로

💻 Crawling Application Code에서 I/O Bound 작업 처리 시, threading Module과 concurrent.futures Module를 사용했습니다. - 두 Module의 장단점을 알지 못한 채 사용해 이번 포스팅에서 깊게 다뤄보겠습니다. 🍎threading Module과 concurrent.futures Module을 사용하는 이유는 해당 포스팅에서 확인할 수 있습니다. 🍎 thread.Thread와 concurrent.futures.ThreadPoolExecutor의 특징을 알아봅시다. 🍏thread.Thread의 특징 - Process안에 존재해 작업 처리 시 사용됩니다. Thread를 사용하는 두 가지 이유는 아래와 같습니다. 1️⃣ Target Method를 실행..

TIL 2023.04.11

파이썬 성능을 높이고 싶을 때 알아야 할 것

❓ 파이썬 환경에서 Multi Thread, Multi Processing의 차이점 그리고 성능을 높이고 싶다면? 파이썬에서 멀티 스레드와 멀티 프로세스는 동시에 여러 작업을 수행하는 방식이지만, 그 구현 방식에 차이가 있습니다. • 멀티 스레드는 한 프로세스 내에서 여러 개의 스레드가 동시에 실행되는 방식입니다. 각 스레드는 공유된 메모리에 접근하여 작업을 수행합니다. 이로 인해 스레드 간의 통신이 빠르고 간단하며, 메모리를 공유하기 때문에 메모리 사용량이 적습니다. • 하지만, 공유 메모리에 대한 동시성 제어가 필요하며, 이를 관리하는데 복잡한 코드가 필요할 수 있습니다. 또한, Global Interpreter Lock 제약 조건이 있어 하나의 스레드만 파이썬 인터프리터 내에서 실행될 수 있습니다...

TIL 2023.04.06

Hard, Soft Delete and etc..

🍎 프로젝트 관련 수영장 정보 삭제 시 오늘 알게 된 Soft Delete를 사용했습니다. 이유는 잠재적인 미래 사용을 생각했기 때문입니다. 잠재적인 미래 사용으론 운영되고 있지 않은 수영장을 사용자가 고르게 되면 다른 체육 활동 시설, 운영되고 있는 수영 시설을 제공하기 위함입니다. 좌표계산 부분을 어느 계층에 두어야할 지 고민하고 있습니다. 나중에 리팩토링이 필요한 부분이고 일단 infra에 정의해 진행합니다. 🍏 예외는 정말 예외인 곳에서 사용해야 합니다. 이유는 예외를 생성할 때 스택 추적 전체를 캡처하기 때문에 비용이 많이 발생하기 때문입니다. 🍏 Query Parameter vs Path Variable의 차이 위 두 방식은 어디에 어떤 데이터(명사)를 요청하는 것인지 명확하게 정의하기 위해 ..

TIL 2023.04.03