본문 바로가기

개발 이야기

(21)
[기타] 병행(Concurrency)과 병렬(Parallelism)의 차이에 대해서 흔히 병행(Concurrency)과 병렬(Parallel)에 대해서 이야기를 할 때 헷갈리는 경우가 많다. 심지어 단어 자체도 비슷한데 의미도 비슷하니 더 헷갈리는 것 같다. 병행과 병렬은 흔히 하나의 물리적인 공간(컴퓨터, 서버)에서 여러 가지 일을 동시간대에 함께 처리하기 위한 기법을 이야기할 때 사용한다. 일단 하나씩 의미를 정리해보자. 병행(Concurrency) 병행이란 소프트웨어적인 의미를 가지고 있다. 모든 소프트웨어 프로그램은 컴퓨터에서 동작하면서 작업을 수행할 때 결국은 CPU 연산 과정을 거치게 되는데, 만약 CPU를 하나의 프로세스가 점유하고 있다면 다른 프로세스들은 작업을 수행할 수 없다. 따라서 이런 물리적인 상황을 극복하기 위해서 소프트웨어적으로 작업을 번갈아가며 수행하게 함으로..
[기타] Retry 전략에 대해서(Exponential Backoff, Jitter) 최근 각광받는 MSA 구조, 분산 시스템 구조에서 서버간 네트워크 통신은 매우 중요하다. 특히 네트워크를 통한 API 호출은 언제 어떻게 실패할지 예측하기 어렵기 때문에 이를 감시할 수 있는 모니터링 기술도 매우 중요하게 평가받고 있다. Datadog 같은 기업의 클라우드 환경 솔루션도 이런 분산 시스템 모니터링과 실시간 오류, 성능 분석을 위한 사용자의 니즈를 기반으로 급속하게 성장하고 있는 중이다. Retry는 똑똑해야 한다. 이런 분산 시스템에서 서버와 서버간 API 호출 실패에 대한 재시도는 매우 중요한 행위이다. 1번의 네트워크 호출 실패로 서비스의 비지니스 로직을 모두 실패처리하거나 fallback 처리하는 것은 몇 번 다시 호출하는 것보다 큰 리소스 낭비가 될 수 있기 때문이다. 따라서 보통..
[기타] 개발 환경(Phase)이란 무엇일까? 개발 환경(Phase)란? 개발 환경(Phase)은 Application이 동작하는 환경을 의미한다. 따라서 대부분의 Framework는 각각의 개발 환경마다 설정 값을 다르게 셋팅할 수 있는 기능이 있다. 대표적으로 Spring Boot의 경우는 Profile 기능이다. 개발 환경(Phase)을 분리하는 이유? 제품을 개발할 때는 Application을 바로 운영 환경에 배포하지 않는다. 아마도 먼저 개발하고 있는 local에서 Application을 실행해보면서 디버깅이나 테스트를 진행하고, 실제 운영 환경과 비슷한 시스템이 갖춰진 Develop 환경이나 Beta, RC 환경에 순차적으로 배포하면서 테스트 과정을 거칠 것이다. 사실 개발 환경(Phase)은 회사나 팀에 따라 레벨이 조금씩 달라질 수 ..
[10분 Boot-up] Kotlin으로 스프링부트 Web Application 만들기 - (2) Profile 설정하기 Kotiln과 Spring Boot을 모르더라도 10분 동안 따라하면서 자연스럽게 Web Application을 만들어보는 것이 목적입니다. 각 챕터에서 나오는 중요한 내용은 별도로 [더 알아보기]에 보충해서 작성할 예정입니다. 시작하기 이 블로그를 참고하고 Kotlin으로 Spring Boot 웹 어플리케이션을 시작하는 분들은 아래 글을 먼저 읽고 오는 것을 추천한다. 1. [10분 Boot-up] 스프링부트 웹 어플리케이션 만들기 - (1) 개발 환경 설정하기 [10분 Boot-up] 스프링부트 Web Application 만들기 - (1) 개발 환경 설정하기(Gradle) 시작하며 요즘 Kotlin으로 Spring Boot 웹 어플리케이션 서버를 개발하고 있다. 작년까지 평범하게 Java 8 버전으..
[10분 Boot-up] Kotlin으로 스프링부트 Web Application 만들기 - (1) 개발 환경 설정하기(Gradle) Kotiln과 Spring Boot을 모르더라도 10분씩 따라하면서 자연스럽게 Web Application을 만들어보는 것이 목표입니다. 각 챕터에서 나오는 중요한 내용은 별도로 [더 알아보기]에 보충해서 작성할 예정입니다. 시작하기 요즘 Kotlin으로 Spring Boot 웹 어플리케이션 서버를 개발하고 있다. 작년까지 평범하게 Java 8 버전으로 Spring Boot 2.3 기반으로 서버를 개발했었는데 벌써 Spring Boot는 2.4버전이 나오고, 나는 Kotlin을 사용하고 있다. 세월도 빠르지만 기술의 발전 속도는 점점 더 빨라지고 새로운 기술의 등장은 더 많아지는 것 같다. 사실 Kotlin 자체가 등장한지는 꽤 됐지만, Android 개발을 넘어 Java 생태계의 Spring Boot ..
[Zsh] Powerlevel10k로 Zsh 멋지게 설정하기 보통 Zsh을 사용하는 많은 분들이 shell configuration 관리 용으로 Oh My Zsh을 추천한다. 특히 agnoster 테마는 개발자의 기본 터미널 테마로 엄청난 인기를 얻고 있기도 하다. 하지만 agnoster 테마는 개인적으로 매우 싫어하는 스타일의 테마인데 테마 적용 자체부터 귀찮을뿐 아니라 제대로 적용이 가능한 폰트도 매우 제한적이기 때문이다. 그래서 이것저것 알아본 결과 Powerlevel10k 테마를 알게됐다. 만약 Oh My Zsh이 깔려있다면 아래 명령어를 통해서 Powerlevel10k 테마를 바로 추가할 수 있다. git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh..
[Kotlin] apply, also, let, run, with 상황에 맞게 사용하기 Scope Functions Kotlin 표준 라이브러리는 몇 가지 객체의 Context 내에서 코드 블록{}을 실행하는 것이 유일한 목적인 몇 가지 함수가 포함되어 있다. 객체에서 이 람다 함수를 호출하면 해당 함수는 일시적인 Scope를 생성하고, 해당 Scope 안에서는 객체의 이름 없이도 접근이 가능하다. 이러한 함수를 Scope Function(범위 지정 함수)이라고 하며, let, run, with, apply, also가 있다. 기본적으로 이 5가지 함수들은 동일한 기능을 수행하기 때문에 어떤 상황에 어떤 Scope Function을 사용하는 것이 맞는지 매우 혼동스럽기 때문에 처음 Kotlin을 사용하는 사용자 입장에서는 난처한 상황을 겪게된다. 일단 아래 5가지 함수의 정의를 살펴보자. ..
[Kotlin] Delegate Pattern 이란? by 키워드 사용하기 Delegate Pattern 이란? Delegate Pattern을 알기 전에 Delegator와 Delegate 용어를 정리해보자. Delegator는 어떤 행위를 다른이에게 위임하는 위임자, Delegate는 어떤 행위를 위임받아 실제로 수행하는 대리자를 의미한다. 따라서 Delegate Pattern이란 어떤 기능을 자신이 수행하지 않고 다른 객체에 위임하여 해당 객체가 일을 수행하도록 구성한 디자인 패턴이다. Delegate Pattern이 필요한 이유는? Delegate Pattern의 필요성을 이해하기 위해서는 상속(Inheritance)과 구성(Composition)에 대한 내용을 함께 이해해야 한다. 흔하게 상속은 is-a 관계라고 말하는데(Hero class가 SuperMan class..
[번역] Vim 정복하기: 4주 계획 이 글은 Peter Jang님의 블로그 포스트 [How To Learn Vim: A Four Week Plan]을 번역한 글이다. Vim에 관심이 있지만 아직 서툴다면 도움이 되는 글이다. 물론 나는 아직도 적응중이다. Vim은 배우기 어렵다고 악명이 높은 Command Line Text Editor 입니다. 그렇다면 이미 다른 Text Editor나 IDE를 편하게 사용하고 있는 상황에서 당신은 왜 Vim을 배워야할까요? 장점은 다음과 같습니다. (1) 이미 Unix 기반 시스템에 설치되어 있기 때문에, 대부분의 서버 환경에서 바로 실행하여 파일을 수정할 수 있습니다. (2) 대부분의 text editor들과 IDE들과 비교하여 매우 가볍기 때문에, 하드웨어 파워가 부족한 환경에서도 빠르고 효과적으로 ..
[클린 아키텍처] 5가지 SOLID 설계원칙 좋은 소프트웨어란 깔끔한 코드(Clean Code)로 시작된다. 하지만 깔끔한 코드도 정작 시스템 아키텍처를 엉망으로 만들면 의미가 없어진다. 따라서 좋은 코드로 좋은 아키텍처를 만들기 위한 원칙이 필요하며, 객체지향 설계에서는 SOLID라고 불리는 원칙이 있다. 객체지향 설계의 5가지 핵심 원칙으로 불리우는 SOLID 원칙이란 (1) SRP(단일 책임 원칙), (2) OCP(개방-폐쇄 원칙)**, (3) LSP(리스코프 치환 원칙), (4) ISP(인터페이스 분리 원칙), (5) DIP(의존 역전 원칙)이다. SOLID는 이 5가지의 원칙들의 앞자를 따서 부르는 약자이다. SOLID 설계원칙의 목적은 무엇일까? 결국 좋은 코드로 좋은 아키텍처를 만들기 위해서 제시된 원칙이기 때문에, 변경에 유연하고, ..