최근 코드 리팩토링을 하면서 '아, 이래서 클린 코드가 중요하구나?'를 온몸으로 깨닫게 되었습니다. 🤯똑같은 기능을 하는데도 코드가 중복되어 있고, 변수명은 알아볼 수 없고, 함수 하나가 세 가지 일을 하고 있던 걸 보고…
회사에 동료 신입 개발자 분들을 위해 정리하다가 블로그에도 정리해보면 좋을 것 같아 작성하게 되었습니다. JVM(Java Virtual Machine)에서 가비지 컬렉션(GC)은 메모리를 자동으로 관리해 주는 중요한 기능입니다.
매일 같이 Insight를 얻기 위해 재미있는 주제로 이메일 보내주는 플랫폼이 있는데 흥미로운 주제가 있어서 정리해보았습니다. 우리는 컴퓨터를 사용할 때 여러 프로그램을 동시에 실행하는데, 이 과정에서 운영체제가 어떤 프로세스에 CPU를 먼저 할당할 것인지를 결정하는
웹 개발을 하면서 URI, URL, URN이라는 용어를 자주 접하게 됩니다. 처음에는 모두 비슷해 보이지만, 각 개념의 차이를 명확히 이해하면 인터넷 상의 자원(Resource)을 효율적으로 다루는 데 도움이 됩니다 🚀 📌 URI(Uniform R
객체의 불변성(immutability)을 유지하면서 안전하게 데이터를 관리하는 방법에 대해 다시 한번 상기시키는 마음으로, 방어적 복사(Defensive Copy)라는 개념을 다시금 정리해볼 필요성을 느꼈습니다.
자바를 사용하다 보면 프로그램 실행 중 예외(Exception)가 발생할 수 있습니다.
해시 자료 구조(Hash Data Structure)를 사용할 때 피할 수 없는 문제 중 하나가 해시 충돌(Hash Collision)입니다. 팀원들과 오전에 같이 커피 마시면서 해시 충돌 관련해서 이야기 했는데 내가 정말 아는걸까..?
앞서 데드락 블로그를 작성하는 과정에서 낙관적 락(Optimistic Locking)이라는 개념도 같이 정리해보면 좋을것 같아 작성해보았습니다.낙관적 락은 성능을 최적화하면서도 데이터 무결성을 유지하는 데 탁월한 도구입니다.
멀티스레드 프로그래밍을 하다 보면 자주 접하게 되는 문제가 바로 교착 상태(Deadlock)입니다. 최근 애플리케션에서 Deadlock이 발생하면서 장애가 발생하였고 스레드 간 자원 공유를 관리하다가 교착 상태를 예방하는 방법에 대해 다시 고민하게 되었는데요. 이번 글
최근 프로젝트 글로벌 프로젝트에서 각 리전의 사용자들에게 더 빠르고 안정적인 정적 콘텐츠 전달 방법을 고민하다가, AWS CloudFront를 다시 살펴보게 되었습니다 (채택 👍). CloudFront는 AWS의 콘텐츠 전송 네트워크(Content Delivery N
오늘의 이야기! 최근 Redis를 활용하여 사용자의 사용중인 용량 저장 관련을 설계하면서 "Redis는 왜 싱글 스레드로 동작할까?"라는 궁금증이 생겼습니다.
오늘은 웹 애플리케이션 개발을 하면서 문득 생각이 들었습니다."내가 만든 서비스는 안전한가?"이 질문을 시작으로 보안 관련 내용을 찾아보다가 CSRF(Cross-Site Request Forgery)라는 용어를 다시 한번 떠올리게 되었습니다.
오늘은 코드 리뷰를 하다가 팀원과 설계에 대해 이야기를 나누던 중, "응집도(Cohesion)"와 "결합도(Coupling)"라는 용어가 나왔습니다. 사실 소프트웨어 설계에서 자주 언급되지만, 그 의미를 정확히 알고 있는 사람은 의외로 적습니다.
사이드 프로젝트를 진행하면서 OpenAI의 ChatGPT를 사용해보려고 했는데, 유료라서 뭔가 아깝다고 생각이 들었습니다. 그래서 대신 Facebook에서 만든 LLAMA3를 써보기로 했습니다. LLAMA3는 오픈 소스 프로젝트라서 무료로 사용할 수 있고, 다양한 파인
운영 배포를 했는데 갑자기 메모리 누수가 발생해서 “심장이 멎는 줄 알았던” 경험이 있으신가요? 저요, 저! 마치 롤러코스터를 타는 기분이었죠. 배포 버튼을 누른 순간부터 모든 게 느려지더니, 서버는 거의 휘청거리고 있었습니다. 그래서 즉시 롤백을 해야 했습니다.
동료 직원 중 한 분이 백기선님의 Finalize Attack YouTube 영상을 추천해 주셔서 보게 되었는데, 매우 흥미로운 내용을 다루고 있어 포스팅하게 되었습니다. 백기선님은 송금 관련 Finalize Attack을 재미있게 설명해 주셨는데, 저는 해당 내용을
최근에 이런 글을 한 번 써보면 어떨까 하는 생각이 들어 정리해봤습니다. 보안과 관련해서 대칭키 암호화와 비대칭키 암호화는 워낙 기본적인 개념이지만, 실제로 어떤 차이가 있는지 헷갈릴 때가 있더라고요.
벌써 개발자 5년 차! 풀타임으로 일하면서도 공부하고, 블로그를 쓰고, 사이드 프로젝트까지 하느라 바쁜 나날을 보내고 있습니다. 🚀 오늘은 개발 주제가 아닌 다른 주제를 가져와봤어요.
개발하면서 AWS VPC 설정을 하다 보면 "NAT Gateway를 설정해야 한다"는 말을 한 번쯤 들어봤을 거예요. 근데 대체 NAT(Network Address Translation, 네트워크 주소 변환)가 뭘까요??
얼마 전 팀원과 보안 관련 이야기를 나누다가 CSRF(Cross-Site Request Forgery, 크로스 사이트 요청 위조) 공격에 대한 흥미로운 사례를 들었습니다.
요즘 개발을 하다 보면, '내가 지금 제대로 성장하고 있는 걸까?' 하는 고민이 자주 듭니다. 새로운 기능을 구현하거나, 복잡한 문제를 해결하고 나면 뿌듯함을 느끼지만, 한편으로는 끊임없이 변화하는 기술 흐름 속에서 내가 뒤처지고 있는 건 아닐까 하는 불안감이 생기기도
최근 Google CASA 인증을 받으면서 JWT를 해명(?)해야할 일이 많았습니다. 그러다 보니 '이거 한 번 제대로 정리해야겠다'라고 생각했습니다.
개발을 하다 보면 "이 서버 하나라도 다운되면 서비스가 멈출까?" 하는 고민을 할 때가 있습니다. 이런 경우 바로 단일 장애 지점(Single Point of Failure, SPOF) 문제가 있을 가능성이 큽니다.
전략 패턴(Strategy Pattern)은 객체의 행동(알고리즘)을 쉽게 변경할 수 있도록 만들어주는 디자인 패턴입니다. 쉽게 말해, 어떤 동작(전략)이 필요할 때 직접 코드를 수정하지 않고, 전략을 교체하는 방식으로 변경할 수 있도록 하는 패턴입니다.
소프트웨어를 개발하면서 코드가 변경될 때마다 자동으로 빌드, 테스트, 배포하는 과정을 생각해본 적 있나요? 바로 CI/CD(Continuous Integration / Continuous Deployment)입니다!
개발을 하다 보면 이런 고민이 들 때가 있습니다."조회 요청이 너무 많아서 DB가 버벅거리는 걸 해결할 방법이 없을까?""명령과 조회가 같은 데이터베이스를 공유하다 보니 성능이 저하되네…"
🤔 분산 환경에서 왜 잠금이 필요할까? 여러 개의 서버가 동시에 같은 자원(데이터)을 변경하려고 하면 어떤 일이 벌어질까요? 예를 들어, 쇼핑몰에서 한정 수량의 상품을 판매하는 상황을 가정해보겠습니다.
개발을 하다 보면 가끔 이런 생각이 들 수도 있습니다. "이 객체, 어디서 왔지?""지금 내가 다루고 있는 클래스에 어떤 메서드가 있는 거야?""사용자가 입력한 클래스 이름을 동적으로 불러와 실행하고 싶은데 가능할까?"
멀티스레드 환경에서 개발을 하다 보면, "분명히 공유 변수를 바꿨는데 왜 다른 스레드는 바뀐 걸 모르지?" 같은 문제를 자주 만나게 됩니다. 사실 이는 CPU 캐시 때문입니다. 여러 스레드가 동시에 메모리에 접근하면서 원자성과 가시성 문제가 발생하게 됩니다.
지금까지 CloudFront에 대해서는 자주 이야기했지만, 정작 CDN(Content Delivery Network) 그 자체에 대해서는 제대로 포스팅한 적이 없었던 것 같아요. 그래서 오늘은 이 CDN에 대해서 자세히 알아보려고 합니다! 😉CDN은
개발자라면 누구나 한 번쯤 파일을 읽고, DB 연결을 하고, 자원을 다뤄본 경험이 있을 겁니다. 그럴 때마다 꼭 따라오는 이야기가 있죠."자원 해제를 잊지 말자!"
최근 AWS에서 VPC, NAT Gateway 등을 설정하다 보니 문득 이런 궁금증이 생겼습니다. "네트워크에서 데이터를 전송할 때 어떤 방식으로 교환할까?" 라는 질문이죠. 그렇게 찾게 된 것이 바로 회선 교환(Circuit Switching) 과 패킷 교환
얼마 전 회식자리에서 개발자분들과 이야기하다가 “CPU 쓰로틀링” 이야기가 나왔습니다. 평소 같았으면 그냥 넘겼을 주제지만, 자꾸 꼬리에 꼬리를 무는 질문들이 떠오르기 시작했죠.“CPU 쓰로틀링이 뭐였더라…?”“내가 알고 있는 디바운싱이나 쓰로틀링이랑 같은거 였나…?”
최근 사이드 프로젝트에서 키워드 기반으로 유사한 콘텐츠를 자동으로 추천하는 기능을 구현하고 싶었는데 단순 문자열 매칭이 아닌, 의미 기반의 유사도 검색이 하고싶었습니다.
최근 프로젝트에서 대용량 로그 데이터를 분석하는 시스템을 구성하게 되었습니다. 이 과정에서 가장 먼저 고민하게 된 건 바로 데이터베이스 선택이었습니다. 기존에는 PostgreSQL을 기반으로 트랜잭션 처리 위주의 시스템을 구성해왔지만, 이번에는 로그 기반 통계와 대시보
요즘 사이드 프로젝트를 하다 보면 "서버리스(Serverless)"라는 단어, 정말 많이 보이죠.저는 프로젝트를 진행하면서 여러 번 AWS Lambda를 통해 사용해봤습니다. 익숙한 개념이긴 한데, 문득 이런 생각이 들었습니다.“이 서버리스, 대체 왜 생긴 걸까
개발을 하다 보면, 아주 사소한 코드 하나가 전체 성능을 좌우하는 순간이 있습니다.최근에 제가 딱 그런 경험을 했습니다.배열을 순회하면서 단순히 값을 하나 더하는 코드였는데...
저번에도 싱글톤 관련해서 글을 올렸는데 아쉽고 조금 이해하기 힘든 부분들이 있어서 새로운 글을 작성해봅니다!디자인 패턴은 코드의 품질과 유지보수성을 높이는 데 큰 도움을 주는 도구입니다.
오늘도 기본적인 주제로 블로그를 써보려고 합니다. 웹 개발자라면 하루에도 수십 번 만나는 게 바로 HTTP입니다. 그런데 정작 이 HTTP가 어떤 원리로 작동하는지, 통신 과정은 어떻게 흐르고, 왜 다양한 메서드들이 생겨났는지는 잘 모르고 넘어가는 경우가 많죠...
요즘 팀원들과 코드 리뷰를 하다 보면, 단순히 레이어를 나눴다는 이유로 안심하고 넘어가는 경우가 꽤 많습니다. 그런데 정말 제대로 나눈 걸까요?
요즘 쿼리 튜닝하다 보면 한 번쯤 이렇게 외치게 됩니다:"아니 이거 왜 이렇게 느리지? 쿼리는 간단한데?"그래서 오늘은 'NOT IN' 쿼리의 숨겨진 함정과 똑똑한 대안들을 정리해보려 해요.
요즘 서버리스 구조로 빠르게 배포하고 검증하는 일이 많아졌죠. 하지만... 개발자라면 한 번쯤 이런 아찔한 경험이 있을 겁니다:"DEV에서 테스트한 코드가 운영에 그대로 반영되었어요... 🫠
개발하다 보면 IDE가 빨간 줄로 경고해주죠?"이건 반드시 처리하세요!" 라고 외치는 것 같은 그 느낌... 바로 Checked Exception입니다.