본문 바로가기

👨‍💻 프로그래밍 120

Bash Commands 이상형 월드컵 Top 10 Bash Commands 이상형 월드컵 Top 10 Shell Commands가 필요할 때보통 우리가 컴퓨터를 사용한다고 하면 화려한 GUI에 익숙해져 있습니다. 파일과 프로그램은 아이콘으로 나타내고, 파일을 이동하기 위해서는 마우스로 드레그를 하고, 지우고 싶으면 휴지통에 넣고...이런 GUI 덕분에 컴퓨터는 대중화될 수 있었지만, GUI는 굉장히 자원이 많이 필요한 일입니다. 그래서 서버 같이 프로그래머가 다루는 컴퓨터의 경우는 GUI가 없고 CLI를 통해서만 접근해야 하는 경우가 많습니다.CLI를 쓰는 것의 또 다른 장점은 프로그래밍 적인 요소를 적용할 수 있다는 겁니다. 특정 조건에서는 이걸 하고, 이걸 반복하고 등... 이런 여러 문법들 중 가장 자주 쓰는 10개를 뽑아 봤습니다. 10위 - []if의 역할을 합니다 [ "test" = "test.. 2023. 6. 21.
DDD Aggregate (애그리게이트) 알아보기 DDD Aggregate (애그리게이트) 알아보기 DDD에서 유독 어렵다고 유명한 개념인 Aggregate에 대해서 알아보겠습니다!DDD 자체에 관한 글을 아래 2개 글을 참고해 주세요. DDD, 난해한 용어 없이 상식적으로 이해하기DDD가 뭘까?DDD (Domain Drived Design)은 우리가 컴퓨터 프로그램을 만들 때 도메인에 집중해서 만들자는 방법론입니다.도메인 (Domain)은 비즈니스 로직을 나타내는 단위입니다. 모든 프로그램을 만들jinkpark.tistory.com 핵사고날? 클린 아키텍처? DDD?🐜 취준생들의 단골멘트취준생들의 이력서에 단골로 등장하는 단어가 있습니다. 이름도 멋진 헥사고날 Architecture입니다.처음 헥사고날 Architecture류의 용어들 (헥사고날 Architecture, DDD, Clean Arch.. 2023. 6. 18.
DDD의 Bounded Context 알아보기 DDD의 Bounded Context 알아보기 DDD에서 유독 어렵다고 유명한 개념인 Bounded Context에 대해서 알아보겠습니다!DDD 자체에 관한 글을 아래 2개 글을 참고해 주세요. 핵사고날? 클린 아키텍처? DDD?🐜 취준생들의 단골멘트취준생들의 이력서에 단골로 등장하는 단어가 있습니다. 이름도 멋진 헥사고날 Architecture입니다.처음 헥사고날 Architecture류의 용어들 (헥사고날 Architecture, DDD, Clean Architejinkpark.tistory.com DDD, 난해한 용어 없이 상식적으로 이해하기DDD가 뭘까?DDD (Domain Drived Design)은 우리가 컴퓨터 프로그램을 만들 때 도메인에 집중해서 만들자는 방법론입니다.도메인 (Domain)은 비즈니스 로직을 나타내는 단위입니다. 모든.. 2023. 6. 17.
DIP (의존성 역전 원칙) 이해하기 DIP (의존성 역전 원칙) 이해하기 DIP (Dependency Inversion Principle) 이란?DIP (Dependency Inversion Principle)은, SOLID라고 불리는 객체지향적인 코드를 짜기 위해 지켜야 하는 5가지 원칙 중에 1개입니다. 개인적으로 느끼기에 OCP와 DIP가 현업을 하면서 가장 많이 듣는 말 같습니다. 이게 무엇이고 왜 중요할까요? 구현체에 의존하지 말고 interface에 의존해라!정확히는 상위 모듈 / 하위 모듈이지만 이해를 쉽게 하기 위해 interface와 그 구현체인 class 사이의 관계를 생각해도 됩니다. 보통 우리가 interface를 둔다면 여러 구현체가 있기 마련입니다. 예를 들어 EmailService라는 interface가 있다고 해 보겠습니다.interface Ema.. 2023. 6. 12.
DDD, 난해한 용어 없이 상식적으로 이해하기 DDD, 난해한 용어 없이 상식적으로 이해하기 DDD가 뭘까?DDD (Domain Drived Design)은 우리가 컴퓨터 프로그램을 만들 때 도메인에 집중해서 만들자는 방법론입니다.도메인 (Domain)은 비즈니스 로직을 나타내는 단위입니다. 모든 프로그램을 만들 때 공통으로 들어가는 부분이 있고, 이 프로그램을 만들기 위해서 만드는 부분이 있습니다.공통으로 들어가는 부분의 예: 웹 API, DB 연결, 특정 기술의 상세 구현 등도메인 부분의 예: 은행앱이라면 잔고/통장/이자 등의 객체, 지도앱이라면 장소/즐겨찾기/대중교통 등의 객체여기서 DDD는 도메인에 집중하자는 얘기입니다. 여기에는 2가지 의미가 있습니다.실제 코드에서 도메인을 풍부하게 하고 비즈니스 로직을 도메인에 넣자.코드에서 쓰는 도메인을 여러 이해 관계자와 용어를 명확히 하고, 코드.. 2023. 6. 8.
Spring에서 같은 type의 Bean 구분하는 방법 Spring에서 같은 type의 Bean 구분하는 방법 Spring의 가장 핵심적인 기능은 객체의 수명주기를 개발자가 관리하지 않고 Spring에서 관리해 주는 겁니다. 보통 이를 제어의 역전 (IoC)이라고 부르는데요. 객체의 수명주기를 개발자가 제어하던게 역전되서, Spring에서 관리해 준다는 의미입니다.Spring에서 관리되는 객체를 Bean이라고 부릅니다. 일반적으로 객체를 쓸 때와 같이, Spring의 Bean도 같은 타입의 Bean이 여러개 있을 수 있습니다. 스프링에서 이 Bean들을 어떻게 구분하고, 적절한 Bean을 어떻게 가져다 쓸 수 있는지 정리했습니다.@Qualifier@Configurationpublic class ObjectMapperConfig { @Bean public ObjectMapper mapper1() { .. 2023. 6. 6.
👜 Apple Wallet Pass, Spring Boot에서 개발하기 👜 Apple Wallet Pass, Spring Boot에서 개발하기 기본적인 구조모르는 분야의 개발을 시작할 때 가장 먼저 해야 할 일은 공식 문서를 보는 것이라고 생각합니다. 그래서 저도 애플의 공식 문서를 참고해 우선 Apple Wallet의 기본적인 구조를 이해해 보려고 했습니다.우선, .pkpass라는 파일을 아이폰, 맥북, 아이패드 등의 애플 기기에서 열면 Apple Wallet에 Pass가 추가됩니다. .pkpass는 폴더를 압축한 파일이라고 생각하면 되고, 그 폴더의 구조는 아래와 같습니다. 보시면, 핵심적인건 3가지 입니다.리소스 파일 (icon, thumbnail, logo 등 이미지)설정 파일 (pass.json)리소스 파일, 설정 파일의 번역본 (영어, 한국어 등) 즉, Apple Wallet Pass를 개발하는 방법은 위 3가지를 준비하고, 보안을 .. 2023. 6. 2.
React에서 바코드, QR 코드 개발하기 React에서 바코드, QR 코드 개발하기 바코드가 애초에 뭘까?보통 우리가 일상생활을 하면서 바코드가 뭐고 어떤 원리인지는 깊게 생각하지 않습니다. 바코드나 QR 코드는 언뜻 보면 굉장히 복잡해 보여서 어려울 거 같지만 사실 굉장히 간단한 기호입니다. 바코드와 QR코드는 그냥 일정한 규칙에 따라 넣은 데이터일 뿐입니다. 한글의 규칙을 모르는 사람에게 한글은 그냥 마법 같은 문제처럼 보이겠지만 사실 (꽤 복잡한) 규칙에 의해 정보가 적힌 겁니다. 바코드도 비슷합니다. 바코드 사이의 선의 간격이 정보를 (데이터를) 나타내고 있다고 보면 됩니다.여기서 같은 한국어인 하늘을 적어도 한글로 적으면 하늘이고, 알바벳으로 적으면 Hanol이듯, 바코드도 선의 간격과 선들로 정보를 나타내는 똑같은 원리를 사용한다고 해도 어떤 규격을 쓰느냐에 따라 정보가 달라.. 2023. 5. 29.
전략 패턴 (Strategy Pattern) 사용하기 전략 패턴 (Strategy Pattern) 사용하기 전략 패턴 (Strategy Pattern)이란?전략 패턴은 디자인 패턴 중 1개입니다. 디자인 패턴은 코딩을 하면서 일반적으로 나타나는 문제들을 해결해 주는 추상적인 해결책입니다. 보통 객체지향의 문제들을 해결합니다.그중에서도 전략 패턴 (Strategy Pattern)은 여러 알고리즘을 전략으로 구현하고, 런타임에 이 전략들을 바꾸게 하는 패턴입니다.  전략 패턴의 목적전략 패턴은 긴 if-else 문을 대체하는 게 목적입니다.예를 들어 어떤 값을 계산해야 하는데 상황에 따라 계산 방법이 다르다고 해 보겠습니다. 이 경우 보통 아래와 같이 여러 조건을 확인해 알고리즘을 적용합니다.if (isCondition1True) { // 첫 번째 조건의 알고리즘 구현} else if (isCondition.. 2023. 5. 28.
특정 거리 범위 내 위도/경도 계산하기 (의외로 어려움) 특정 거리 범위 내 위도/경도 계산하기 (의외로 어려움) 해야 하는 것현재 위치를 기준으로 특정 거리 내의 위도/경도 범위를 계산 Java의 Method Signature로 따지면 아래와 같습니다.public double[] getLatitudeRange(double latitude, int radiusInMeters) {}public double[] getLongitudeRange(double latitude, double longitude, int radiusInMeters) {}우선 위도 / 경도에 대해 알아보자우선, 위도 / 경도는 단순히 지구의 x / y 좌표가 아닙니다. 위도 / 경도는 각도입니다. 지구를 선으로 나누고, 그 선을 기준으로 몇 도 떨어져 있는지를 측정합니다.  위도는 적도에서 몇 도 떨어져 있느냐를 측정합니다.  적도는 지구의 자전축.. 2023. 5. 27.
CSS를 조금 더 우아하게 쓰기 위한 최소한의 SASS CSS를 조금 더 우아하게 쓰기 위한 최소한의 SASS SasS, 그게 우리 프로젝트에 도움이 됩니까? 사실, 간단한 프로젝트는 굳이 SaaS를 쓸 필요는 없다고 생각합니다. Bootstrap, Tailwind 같은 CSS Library를 쓰는게 오히려 디자인적으로도 개발적으로도 편리한거 같아요. 하지만! 조금만 디자인을 신경쓰기 시작해도 필연적으로 CSS를 사용해야 하고 CSS를 사용하는건 (개인적으로 느끼기에) 상당히 불편하고 암걸리는 경험입니다. 이런 CSS를 개선시켜 주는게 SasS입니다. 도움이 되는 유용한 Sass 기능 변수 Nesting Mixins 상속 (Inheritance) Partials Operators if-else Sass를 React에서 사용하기 위해서는? Sass는 브라우저가 이해할 수 없는 파일이기 때문에 보통의 CSS로 변환시.. 2023. 5. 26.
같은 색인데 왜 다르게 보일까? 컴퓨터가 색을 나타내는 방법 같은 색인데 왜 다르게 보일까? 컴퓨터가 색을 나타내는 방법 색깔이 다르게 보인다...모니터에 따라, 어떤 OS를 쓰고 있느냐에 따라 같은 색이 조금 다르게 보인다고 느끼지 않으세요? 저는 어릴 때 유독 네이버의 로고가 어떤 컴퓨터를 쓰느냐에 따라 다르게 보인 기억이 있습니다. 왜 같은 색인데 컴퓨터마다 색깔이 다르게 보일까요? 색 공간 (Color Space)모니터는 결국 사람의 눈이 볼 수 있는 색깔을 재현합니다. 하지만 문제는 현실 세상은 연속적인데, 컴퓨터는 이산적이라는 겁니다. 쉽게 말하면 우리 눈이 볼 수 있는 색 범위는 무한에 가까운데, 컴퓨터는 결국 한정된 색상을 선택해야 한다는 겁니다. 여기서 컴퓨터가 선택한 색 범위를 색 공간 (Color Space)라고 합니다.아래 그림이 색 공간을 나타내는 유명한 그림입니다. 형형 색색 있는 배경이 인간이 볼.. 2023. 5. 21.
🔥 Hot Ranking 알고리즘, Spring Batch로 구현하기 (feat. Strategy 패턴) 🔥 Hot Ranking 알고리즘, Spring Batch로 구현하기 (feat. Strategy 패턴) Hot Ranking 알고리즘이란?인기있는 것 (Hot한 것)에 순위(Ranking)을 매기는 알고리즘 실시간 검색어, 커뮤니티의 인기 게시글, 화제가 되고 있는 뉴스 등 무언가에 특정한 기준으로 순위를 매기고 싶을 때 쓰는 알고리즘을 Hot Ranking 알고리즘이라고 부릅니다. 보통은 공개되어 있지 않고, 다양한 데이터를 바탕으로 계속 개선합니다.책잇아웃(포트폴리오)을 만드는 도중, 커뮤니티 기능을 만들게 됐는데 게시글을 인기순으로 보여 주고 싶어 Hot Ranking 알고리즘을 고안해 봤습니다.나만의 Hot Ranking 알고리즘우선, 커뮤니티 부분의 DB 구조만 잠깐 보여 드리자면 아래같이 되어 있습니다.즉, 게시글을 평가할 때 게시글 자체, 게시글의 좋아요/싫어요, 댓글, 댓글의 좋아요 싫어요 .. 2023. 5. 18.
깃허브 코파일럿 (Github Copilot) 1달 사용 후기 깃허브 코파일럿 (Github Copilot) 1달 사용 후기 소개최근 끝없이 화제가 되고 있는 ChatGPT 보다 전에, Github Copilot이라는 IDE에서 코딩을 도와주는 프로그램이 있습니다. GitHub Copilot · Your AI pair programmerGitHub Copilot works alongside you directly in your editor, suggesting whole lines or entire functions for you.github.com ChatGPT는 직접 내가 물어봐야 하지만, Github Copilot은 프로젝트 내에서 내 코드를 학습하고 코드를 칠 때 아래와 같이 자동으로 제안해 줍니다. 여기서 Tab 한 번만 누르면 바로 제안된 코드를 사용할 수 있습니다.최대한 객관적으로, 현재 상황 기준프로그래머로써 이.. 2023. 5. 17.
React-chart-js에서 처음 로딩할 때 Tooltip 보이게 하기 React-chart-js에서 처음 로딩할 때 Tooltip 보이게 하기 해야 하는 것Chart.js라는 자바스크립트로 여러 그래프를 만들 때 자주 쓰는 라이브러리가 있습니다. Chart.jsSimple yet flexible JavaScript charting library for the modern webwww.chartjs.org 이걸 React에서 쉽게 사용할 수 있게 만든 게 바로 React Chart JS입니다. 아무튼, 이 Chat.js에는 다양한 그래프들이 있는데요. 그중에 Line Graph는 마우스를 Hover 하면 현재 값을 작게 보여주는 기능이 있습니다. 이걸 Tooltip이라고 합니다.Chart.js를 써서 개발하던 도중 처음 페이지를 진입했을 때 가장 높은 값에 Tooltip이 보인 상태로 로딩되면 좋을 거 같아 해당 기능이 있는지 찾아봤는데, 아쉽게.. 2023. 5. 5.
안 하느니 못 한 "확장성을 고려한 설계" 안 하느니 못 한 "확장성을 고려한 설계" 확정성을 고려한 설계, 왜 중요할까?이력서의 단골 멘트기도 하고, 기술과 관련된 대화를 할 때 단골처럼 나오는 말이 확장성을 고려한 설계입니다. 이렇게 자주 나오니 당연히 중요한 역량입니다. 확장성을 고려한 설계가 대체 무엇일까요?사실 굉장히 있어 보이는 말이긴 하지만 간단합니다. 새로운 기능이 추가돼야 할 때 빨리 추가될 수 있게 코드를 짜라는 말입니다. 소프트웨어는 정말 빨리 바뀝니다. 당장 지금 쓰고 있는 많은 기술들이 10년 전에는 없었습니다. 유튜브나 넷플릭스로 동영상을 스트리밍 하는 건 상상도 못 했고, 세세한 기술 스택으로만 봐도 당장 React가 2013년에 나왔으니 이제 겨우 10년이 됐습니다.이런 새로운 기능들과 요구사항이 미친듯이 쏟아지는 상황에서 작은 기능 추가에 몇 년이 걸린다면 .. 2023. 5. 4.
Spring Cloud Config로 Config 서버 구성하기 Spring Cloud Config로 Config 서버 구성하기 Spring Cloud Cloud란?Spring에서는 흔히 설정과 관련된 정보를 application.properties나 application.yml에서 관리합니다.설정에는 API Secret이나 암호키 같은 민감한 정보가 있을 수 있기 때문에 보통 환경변수나 jar 실행 시의 argument로 이런 값을 받게 해서 유출을 방지합니다.하지만 이런 방식은 같은 instance 여러개가 다른 시간에 배포되는 MSA 같은 환경에서는 관리가 너무 어려워 비현실적입니다. 이를 해결하기 위한게 Spring Cloud Config입니다.Spring Cloud Config를 쓰면...Backend(Git, Vault 등)에서 설정 파일들을 버전 관리 가능instance의 재시작 없이 주기적으로 새로운 설정으로 업데이.. 2023. 5. 2.
Kotlin의 꼬리재귀(tailrec) 알아보기 Kotlin의 꼬리재귀(tailrec) 알아보기 꼬리 재귀 함수란? (Tail Recursive Function)재귀 함수인데 마지막 동작이 재귀 호출인 재귀 함수 재귀 함수는 자기 자신을 호출하는 함수를 말합니다. 가장 유명한 예로 피보나치 수열을 만든 재귀 함수가 있습니다.fun fibonacci(n: Int): Long { return if (n 잘 보시면 이 함수 안에서 또 다시 함수를 호출합니다. (fibonaccci(n - 1))꼬리 재귀 함수는 재귀 함수의 일종입니다. 재귀 함수를 호출하는 모든 곳에서 재귀 함수 호출 외에 아무런 동작도 안 하면 꼬리 재귀 함수입니다.예를 들어 팩토리얼 (!)을 계산하는 재귀 함수를 보겠습니다.tailrec fun factorial(n: Int, acc: Long = 1): Long { retu.. 2023. 5. 1.
느린 검색 속도 최적화하기 (공공 API, 웹 크롤링의 병목 현상) 느린 검색 속도 최적화하기 (공공 API, 웹 크롤링의 병목 현상) 열심히 만들고 있는 책과 관련된 사이트에 책을 검색할 수 있는 기능을 넣었습니다. (booksitout.com에서 사용해 볼 수 있습니다)평소 책을 많이 읽는 편이라 도서관, 구독 서비스, 중고책 등을 한 번에 검색하면 편리하겠다 해서 넣었고, 좋은 아이디어라 생각했습니다.하지만 문제가 있었습니다. 느려도 너무 느리다는 것입니다. 아래는 Zipkin을 사용해서 검색 속도를 측정한 것인데, 최고 9초가 걸립니다.  검색 속도를 최적화 하기 위해 제가 헤매고 실수하며 내린 결정들과 그 근거들을 소개해 보겠습니다.Spring Webflux, Kotlin Coroutine으로 Refactoring가장 먼저 비동기적으로 요청하도록 개선했습니다.사용자가 거의 없으니 영향이 크지는 않겠지만, 전체를 받아오는데는 오래.. 2023. 4. 30.
통계를 처리하기 위한 Table을 만드는 설계는 바람직할까? 통계를 처리하기 위한 Table을 만드는 설계는 바람직할까? 통계용 Table을 만든 이유제가 만들고 있는 사이트 책잇아웃에는 1년간의 독서내역 통계를 보여주는 기능이 있습니다.통계는 사이트를 들어갈 때 마다 보이는데, 들어갈 때 마다 1년간의 모든 독서 활동을 SELECT 해서 계산해서 보여주면 너무 비효율적이라 생각해 보여주는 통계를 독서활동을 INSERT 할 때 마다 갱신해서 그 통계만 보여주면 좋을거라 생각해 통계용 Table을 만들었습니다.통계용 Talbe이 재앙이 된 이유우선, SELECT가 INSERT/UPDATE 보다 많은것 자체는 사실입니다. 하지만 INSERT/UPDATE가 일어 날 때 마다 코드 레벨에서 Transaction으로 통계 Table을 갱신해 줘야 하는건 상당한 부담입니다.1. 코드가 쓸데없이 복잡해집니다. 통계용 Table의 역할은.. 2023. 4. 28.
MSA (마이크로서비스)에서 환경에서 JWT 기반 보안 구축하기 MSA (마이크로서비스)에서 환경에서 JWT 기반 보안 구축하기 JWT는 가장 많이 사용되는 보안 방식 중에 하나입니다. 요청을 할 때 (보통 HTTP Authorization Header에) JWT Token을 보내면, 서버가 JWT Token을 파싱하고, 암호 키로 유효한 JWT Token인지 확인합니다. 서버가 1개일 때는 이 과정이 비교적 간단합니다. JWT Token을 검증하는 방법은 복잡한 수학적 알고리즘이 사용되지만 어차피 개발자는 라이브러리를 사용하니 이 과정에 거의 신경 쓰지 않습니다.하지만 만약 서버가 여러대인 마이크로서비스 환경이라면 어떨까요?MSA에서는 기능이 여러 서버로 나눠져 있어서 Client 입장에서는 요청 1개더라도 굉장히 많은 서버를 거칠 수 있습니다. 이 경우 JWT Token은 어떻게 처리해야 할까요? 2가지 접근 방식접근 방식은 .. 2023. 4. 22.