제품의 탄생
·
독서
프로덕트를 통해 만들어내고자 하는 미래의 세계관 최근 회사를 떠나기로 결정한 가장 큰 이유는 '제품 개발자'로서의 경험을 얻고자 함이었습니다. 지금까지 모든 것의 가치는 기술에 의해 결정된다고 생각하며 개발자로서 공부해 왔지만, 제품을 만드는 조직에서 1년 7개월을 경험한 후 느낀 것은, 단순히 기술에 의미를 부여한다면 오랫동안 가장 좋아하는 일을 할 수 없을 것이라는 생각이 들었습니다. 기능을 만들고 빠르게 티켓을 치는 것에 목적을 두기 시작했을 때부터 개발을 공부하며 느꼈던 즐거움이 점점 사라지는 것을 느꼈습니다. 어릴 적부터 빨리 질려하던 저가 지금까지도 잘하고 싶고 더 배우고 싶은 개발자라는 길이 단순히 "지식에 대한 갈증만 해결하려고 한다면 개발자라고 할 수 있을까?"라는 고민을 가지게 되었습니..
GeoIP를 활용한 Nginx 국가별 접근 차단: 당신의 웹사이트를 지키는 글로벌 관문 🌍 🗝️
·
메모
새벽에 일어나(백수라도 일찍 일어나는 부지런함!) 서버 상태를 확인하기 위해서 로그를 살펴보던 중 해외에서 지속적으로 공격이 들어오는 것을 확인했다. 대부분의 페이로드는 숨겨진 파일을 찾거나, 관리자 페이지에 접근하기 위한 일반적인 CMS 관리자 페이지, 또는 개발자가 실수로 배포에 포함될 수 있는 메타데이터 파일 등을 주로 탐색하는 것으로 파악된다. 대부분의 공격 요청을 추적해보면 해외 호스팅 서비스를 경유하는 경우가 많아 현재 서비스는 해외 대상으로 진행 중인 것이 없어 국내 IP만 요청을 받도록 설정하려고 한다. 현재 내부 서비스는 reverse-proxy로 연결되어 있기 때문에 NGINX 단에서 특정 국가에서 발급된 IP는 요청을 차단하는 형태가 가장 일반적인 방식일 것 같아 npx_http_ge..
N+1 발생을 쉽게 파악할 수 없을까?
·
메모
들어가며... 진지한 글씨체로 글을 시작해 보자. 얼마 전 나는 "서버 성능 병목은 어디서 발생할까?" 라는 글을 작성한 적이 있다. 그리고 1차 부하 테스트에서 엄청난 성능을 검증한 바가 있는데, 이때까지 나는 단순히 "데이터베이스 리전이 해외고, 서버 자원이 부족해서 그런가 보다." 하고 넘어갔다. 그리고 앱을 사용하면서도 초반 로딩 속도가 조금 느린 것이 단순히 서버 자원이 부족하구나 생각했는데, 오늘 개발하면서 쿼리 로그를 보던 중 N+1이 발생하는 것을 발견했다. 무엇이 문제였는가? Arggregation root가 포함하는 데이터는 풍부한 것이 좋겠지?! 처음 개발을 하면서 코드 컨벤션을 정할 때, 몇 가지 정한 규칙이 있었다. 도메인 객체는 서비스 외부로 퍼지지 않는다. 서비스는 서비스끼리 ..
동시성 이슈 없는 조회수⏳ 기능 개발 고민
·
프로젝트/개발
조회수는 많은 서비스에서 이용되며 사용자의 콘텐츠 선택에 많은 도움을 주는 요소 중 하나이다. 하지만 단순한 기능이라도 복잡한 요구사항이 추가된다면 재미난 기능을 만들 수 있다. 조회 시 증가 구현 가장 간단하게 구현하는 방법은 게시글 상세 조회 시 대상 데이터에 조회수를 의미하는 컬럼 데이터를 1 증가하는 것이다. 예를 JPA를 사용한다면 다음과 같이 구현할 수 있다. final Post post = repository.findById(1L); post.increaseViewCount(); 문제 트랜잭션이 종료되면 변경 감지에 의해 변경 내용이 DB에 반영되는 구조로 흔히 구현할 수 있다. 하지만 조회수가 서비스에 중요한 요소라 누락이 되면 안 되는 경우, 이 구현은 예상하지 못한 동작을 할 수 있다..
서버 성능 병목은 어디서 발생할까?
·
메모
주말 동안 갑자기 서버 튜닝을 해보고 싶었다. 현재 상태 테스트를 진행하기 전 운영 환경에서 테스트를 할 수 없으니 개발 환경을 구성했다. 개발 환경은 단일 서버로 온전히 인스턴스 한 대가 허용할 수 있는 트래픽 양을 테스트할 예정이다. 그리고 외부 요인을 추가하기 위해서 저사양 외부 RDB를 사용할 예정이다. 더미 데이터 생성 부하가 발생한다면 대부분은 DB에서 데이터를 이것저것 조회/수업을 하는 경우에 발생할 테니 넉넉하게 데이터를 생성해 둔다. 현재 사용하고 있는 데이터베이스는 PostgreSQL로 더미 데이터 생성에 적합한 함수를 제공한다. A, B, C 각각 100,000개, 200,000개, 10,000개 데이터를 생성했고, 연관 관계는 A 12초로 성능이 개선된 것을 알 수 있다. 하지만 일..
AWS에 MySQL을 설치하려다 포기한 당신을 위해
·
메모
클라우드 유목민이 되어 무료로 제공하는 모든 크레딧을 다 써버려 결국 ec2에 be, fe, db까지 다 올리려고 했다면 잘 찾아오셨습니다 :> 설치 처음부터 설치를 하려고 하니 MySQL 패키지를 찾지 못해서 실패하는 경우가 있을 것이다. 이땐 위 명령어로 해결될 것이다. sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm sudo dnf update sudo dnf install mysql-community-server sudo systemctl status mysqld.service 설정 root 계정 비밀번호 먼저 AWS inbound rule에서 mysql에 접근하기 위한 포트를 열어주자. 이 ..