본문 바로가기

분류 전체보기 237

Logback 간단하게 알아보기 Logback 간단하게 알아보기 Logback이 뭐 하는 걸까? Logback은 Java에서 가장 많이 사용되는 Logging 라이브러리입니다. Logback Home Logback Project Logback is intended as a successor to the popular log4j project, picking up where log4j 1.x leaves off. Logback's architecture is quite generic so as to apply under different circumstances. At present time, logback is divided into three mod logback.qos.ch Logback의 간단한 구조 Logback은 크게 3가지로 구성되어 있습니다. Logger.. 2023. 10. 1.
Redis, RabbitMQ, Kafka를 각각 Message Queue로 사용할 때의 장단점 Redis, RabbitMQ, Kafka를 각각 Message Queue로 사용할 때의 장단점 Message Queue를 신중히 선택해야 하는 이유MSA 환경에서 비동기로 무언가를 처리하거나, Transaction을 처리하기 위해 많이 쓰이는 방식이 바로 Message Queue를 사용하는 방법입니다. Message Queue, 그거 아무거나 대충 쓰면 되지 왜 신중히 선택해야 할까요?모든 SW 기술들이 그렇지만, 결국 장단점이 있기 때문입니다. 속도-비용-정합성 사이의 아찔한 줄타기를 이어간 결과, 크게 3가지 선택지가 주어지게 됐는데요. 이 3가지를 비교해 보고 어떤걸 선택해야 할지 알아보겠습니다.Redis의 장단점아무튼 빠름. 근데 잃어도 알빠? Redis하면 보통 Cache를 떠올리시겠지만, Message Queue의 기능도 지원하기 때문에 Message Queue로도 사용할 수 있습니다... 2023. 9. 30.
🔒 분산 Architecture에서 Redlock으로 Lock 걸기 🔒 분산 Architecture에서 Redlock으로 Lock 걸기 분산 Architecture에서 Lock 걸기의 어려움Monolithic Architecture에서도 성능을 고려하면 Lock 걸기가 복잡했습니다. 여러 Transaction Level을 고려하고, 재시도 매커니즘을 고안하고, Deadlock 상황에서 어떻게 해야할지 고려하고..근데 여기에 더해 MSA 같은 분산 Architecture에서 Lock을 걸어야 한다면 어떨까요? 성능을 더욱 고려해야 하고, Transaction 거는 것도 훨씬 복잡하고, Deadlock은 밥 먹듯이 있지 않을까요?Redis Instance가 1개일 경우만약 Redis 1개를 공유하면 Lock을 구현하는건 비교적 간단합니다.Lock 별로 고유한 Key를 정의한 후, setNX를 사용해서 있을 경우 set하고, 없을 경우 get.. 2023. 9. 28.
망분리 (Network Segregation), 왜 필요할까? 망분리 (Network Segregation), 왜 필요할까? 망분리는 말 그대로, 망(네트워크)를 분리한다는 것입니다.보통 우리가 개인적으로 쓰는 컴퓨터는 아무 제한 없이 인터넷을 접속할 수 있습니다. 그렇기 때문에 바이러스에 감염될 수도 있고, 여러 공격의 대상이 될 수도 있습니다.하지만 보안적으로 매우 중요한 곳에 이런 컴퓨터로 접근한다면 어떨까요? 나도 모르게 감염된 바이러스가 옮겨지거나, 내 컴퓨터를 통해 공격을 할 수 있을 지도 모릅니다. 그래서 망분리라는 개념이 나왔습니다.망분리라고 인터넷이 안 되는건 아니다망분리라고 무조건 인터넷이 안 되는건 아닙니다. 망분리의 핵심은 중요한 곳을 접속할 때 보안을 위해 불필요한 네트워크 접근을 차단하는 것이기 때문에, 꼭 필요할 경우 특정 사이트를 허용할 수는 있습니다.망분리를 적용하는 여러가지 방법보안이 어느정도 .. 2023. 9. 27.
MSA 환경에서 Circuit Breaker를 쓰는 이유, 그럼에도 발생하는 문제 Bulkhead로 해결하기 MSA 환경에서 Circuit Breaker를 쓰는 이유, 그럼에도 발생하는 문제 Bulkhead로 해결하기 Circuit Breaker가 뭘까?Circuit Breaker는 회로 차단기입니다. 말 그대로 내리면 정전이 되는 그 회로 차단기를 의미하는 건 아니고, 일종의 비유입니다. MSA 환경에서는 개별 Application의 복잡도는 내려가지만, 인프라 레벨에서의 복잡도는 늘어납니다. Client에게는 1개의 요청으로 보여도, 그 안에는 여러 MS 끼리 네트워크를 통해 요청을 주고 받습니다. 당연히 이 과정에서 실패 확률이 올라갑니다. 만약, 전기를 내리는 회로 차단기처럼 이런 오류를 방지하는 패턴이 없다면 한 MS의 오류가 다른 MS에게 번지기 때문에 이를 예방하기 위해 Circuit Breaker 패턴을 쓰게 됩니다.Circuit Breaker의 작동 방법Circuit Breaker는 지속적으로 상태를 .. 2023. 9. 24.
🥳 토스 NEXT 2023 합격 후기 (서버 전형, 신입) 🥳 토스 NEXT 2023 합격 후기 (서버 전형, 신입) 🐜 배경 단순히 수학을 좋아해서 수학과에 입학했지만, 점점 현실을 보게 되면서 내가 어떤 직업을 가져야 할까에 대한 고민이 깊어졌습니다. 후보는 여러개 있었지만 컴퓨터 과학이 적성에 잘 맞아서 다른건 접고 프로그래머가 되기로 결심했습니다.대학교에서 컴퓨터 과학 수업을 3개 정도 듣고, 휴학을 하고 국비지원학원을 다녔습니다. 국비지원학원에서 배운 내용은 오래된 기술들이고 깊이도 없어 도움이 되지 않는다는 분이 많지만, 저는 국비지원학원을 들으며 제가 학문으로서의 컴퓨터 과학이 아닌 프로그래머라는 직업도 적성에 맞다고 알게 돼서 좋았습니다.그 후 국비지원학원을 수료하고 1년간의 독학을 한 뒤 최종적으로 정말 꿈꾸던 회사인 토스에 합격하게 됐습니다. 토스는 제가 지원한 많은 회사 중 1곳이 아닌 꼭 가고 싶.. 2023. 9. 23.
Redux 아키텍처, 사용할 수 있을 정도로만 알아보기 Redux 아키텍처, 사용할 수 있을 정도로만 알아보기 서버 개발자로써 프론트엔드를 자세히 깊게 배울 생각은 없었지만, 프론트엔드 작업을 하면서 자연스럽게 불편함과 필요함을 느껴 하나하나 배우다 보니 Redux까지 쓰게 됐습니다. 처음에는 굳이 Redux까지 도입해야 할까 싶었지만, 여러 Component에 걸쳐 Props를 전달하고, 상태를 관리하다 버그를 만나서 디버깅을 하다 보니, 자연스럽게 상태관리 Library를 쓰지 않으면 코딩이 너무 고통스러워서 Redux를 배우게 됐습니다. Redux, 뭐고 왜 필요할까? 웹 애플리케이션에서는 다양한 상태가 필요합니다. 점점 애플리케이션이 복잡해 지면서 자연스럽게 관리해야 할 상태가 늘어나고, Component들을 분리하면서 상태들을 Props를 통해 전달해야 하는 경우도 많아집니다. 이럴때 상태 관리 Libr.. 2023. 8. 13.
🍎 취미 iOS 앱 개발 후기 🍎 취미 iOS 앱 개발 후기 최근 너무 웹 개발만 한거 같아 Refresh 겸, 또 평소 iOS 앱을 만들고 싶었기에 취미로 iOS 앱을 만들어 보기로 했습니다. 간단히 공부해 보니 iOS는 Objective-C + UIKit 에서 Swift + SwiftUI로 넘어가고 있는 상태였습니다. 취업을 위해서라면 다 공부해야 하겠지만, 취미로 하는거니 당연히 Swift + SwiftUI 조합을 사용했고, iOS 버전도 가장 최신인 iOS 15를 기준으로 하고, 나머지 솔루션도 애플에서 기본 제공하거나 가장 편한 걸 사용했습니다. (Persistence에 CoreData + CloudKit, CI/CD에 XCode Cloud 등) Apple 제품을 쓰면서 느꼈던 장단점이 개발에서도 나타난다 개발이 아니라 Apple 제품의 장단점이 뭘까요?.. 2023. 8. 3.
트랜잭션 격리수준 (Transaction Isolation)에 따른 데이터 불일치 현상 트랜잭션 격리수준 (Transaction Isolation)에 따른 데이터 불일치 현상 Trasnaction 격리수준을 왜 다르게 해야 할까?성능 때문에 Transaction은 여러개의 작업을 하나의 작업으로 묶는 역할을 합니다. 흔히 ACID라고 줄여 부르는 특징을 가지고 있습니다.애플리케이션이 복잡해 지면 Transaction이 길어지고, 자연스럽게 같은 데이터를 여러 Transaction이 써야 할 일이 생기게 됩니다. 직관적으로는 Transaction이 데이터를 사용중이면 다른 Transaction은 사용할 수 없도록 Lock을 걸면 되지만 그렇게 하면 데이터가 필요한 다른 모든 Transaction이 그 시간동안 대기해야 합니다. 그래서 한 Transaction이 데이터를 사용중일때, 다른 Transaction이 어떻게 처리할지에 관한 전략을 격리수준 (Isolation Level.. 2023. 7. 18.
LG ThinkQ, HomeBridge로 Homekit에서 사용하기 LG ThinkQ, HomeBridge로 Homekit에서 사용하기 하려는 것스마트홈에서 가장 중요한 건 1개의 앱으로 다 하는 겁니다. 많은 분들이 스마트홈 (IoT)를 사용하지만 전등은 이 앱으로 하고, 커튼은 저 앱으로 하고 하는 식으로 여러 개의 앱을 사용하는 경우를 봤는데 이렇게 하면 너무 불편합니다. 그래서 보통 1개의 앱으로 통합해서 관리하는 게 좋습니다. 한국에서 그 후보는 크게 3가지가 있습니다.애플의 Homekit구글삼성의 SmartThings저는 이 중에서도 애플의 Homekit을 선택했습니다. 저는 애플 기기들을 많이 쓰고 있는데 Homekit을 사용하면 iPhone, iPad를 비롯한 각종 기기에서 상태바에서 바로 접근할 수 있을 뿐만 아니라 음성 인식으로도 쉽게 제어할 수 있기 때문입니다.  하지만 문제는... 애플의 Homekit을 지원하는 기.. 2023. 7. 17.
Git 파일의 Life Cycle 이해하기 Git 파일의 Life Cycle 이해하기 Git을 사용한지는 오래됐지만, Git을 엄밀히 공부하고 사용한 것은 아니였습니다. 그러던 와중 Git에 대한 이해 부족으로 협업 과정에서 문제를 몇 번 겪게 된 뒤로 Git을 이해하고 사용해야 겠다고 결심해 첫 단계로 Git으로 관리되는 파일들의 Life Cycle를 공부했습니다. Untracked -> Tracked Git으로 한 번도 관리되지 않은 상태의 파일은 Untracked 상태에 놓여 있습니다. 1번이라도 add, commit을 하면 Tracked 상태가 됩니다. git add를 하면 생기는 일 .git 내부에는 2가지의 영역이 있습니다. Staging Area와 Repository 입니다. git add를 하면 파일이 Staging Area로 이동됩니다. 여러개의 파일 혹은 파일의 일부분을.. 2023. 6. 29.
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.
특정 거리 범위 내 위도/경도 계산하기 (의외로 어려움) 특정 거리 범위 내 위도/경도 계산하기 (의외로 어려움) 해야 하는 것현재 위치를 기준으로 특정 거리 내의 위도/경도 범위를 계산 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.
🔥 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.
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.
느린 검색 속도 최적화하기 (공공 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.
동적 계획법(Dynamic Programming) 알아보기 동적 계획법(Dynamic Programming) 알아보기 똑같은 계산을 계속 반복해야 하는 알고리즘에서 계산 값을 저장해 둬서 반복하지 않게 하는 방법 동적 계획법이라는 이름은 아마 정적으로 계획없이 똑같은 계산을 반복하는게 아니라 동적(적극적)으로 계획해서 계산을 줄이는 방법이라 그렇지 않을까 개인적으로 추측해 봅니다. 동적 계획법을 쓰던 안 쓰던, 정확성은 Brute-Force와 차이가 없습니다. 하지만, 훨씬 더 효율적입니다. 예시 : 피보나치 수열 구하기 피보나치 수열은 1, 1 부터 시작해서 그 전 2개의 항을 더한게 n번째 항인 수열입니다. 이 정의를 그대로 코드로 구현하면 아래와 같습니다. fun fibo(n: Int): Int { if (n 2023. 4. 15.
반응형