본문 바로가기

전체 글63

#044. 리팩터링: 객체 지향 프로그래밍의 캡슐화 적용하기 💊 개념 운영을 하면서 정책들과 구현방법은 복잡해진다. 객체 지향 프로그래밍의 네 가지 특징 중 캡슐화를 고려하며 구현하면 복잡성을 낮출 수 있다. 최근에 이미지 url를 포함해 조회하는 작업을 하면서 캡슐화를 다시 한 번 생각해보는 계기가 되어 기록해두려고 한다. 적용 이미지 파일은 대부분의 이미지는 글의 이미지, 유저의 썸네일 이미지 처럼 연관관계를 가진다. 따라서 연관관계를 가지는 대상을 조회할 때 이미지를 함께 불러오게 된다. 그리고 Response 에는 File을 규칙에 따라 url로 만들어 string 형태로 전달한다. 이 때 어디에서 File 클래스를 url로 변환하면 될까? 예를 들면 아래와 같이 student 테이블에 매핑된 Student 객체가 있고, thumbnail 이라는 필드에 이미지.. 2023. 7. 2.
#043. 쿼리개선: like 쿼리는 왜 인덱스를 타지않았을까? 🤔 5000ms -> 0.05 ms 개선하기 문제상황: 슬로우 쿼리가 발생한다는 알림을 받고 모니터링 로그를 열어보니 아래와 같은 쿼리였다. select * from student where email ilike 'abc@xyz.com%'; 이렇게 간단한(?) 쿼리가 인덱스를 타지 않아서 슬로우 쿼리를 발생시키고 있었다. [참고] 실행환경은 Postgres 14v 이고, 아래와 같은 쿼리를 사용하려고 한다. select emp_no from employee where first_name ilike 'Geo%' 사용하는 데이터는 mysql 의 샘플 데이터이다. employees 테이블에는 유저 정보 약 30만개의 데이터가 들어있어 index를 타는 지 확인하기에 적합하다고 생각했다. 실험을 위해 sample data를 준비하고 string 값인 fi.. 2023. 7. 1.
#042. 리팩터링: 멱등성 있는 API 만들기 (feat. 토글기능 구현하기) 개념 종종 토글링 하는 기능을 구현할 때가 있다. 글을 스팸 처리하거나 팔로우/언팔로우, 즐겨찾기 설정/해제를 할 때 기능을 켜거나 꺼야한다. 토글 기능을 구현하는 방법이 크게 두 가지가 있다. (1) 현재와 반대되도록 설정한다. (2) 설정하고자 하는 상태 값을 받아 그대로 되도록 설정한다. 두 가지 모두 개발, QA 환경에서는 비슷하게 정상 작동한다. 하지만 실제 사용 환경은 다양한 요소가 있다. 예를 들어 네트워크 이슈등으로 인해 팔로우 세팅을 2번 되었다고 가정해볼 수 있다. (1)번은 현재상태와 반대로 설정되기 때문에 팔로우 ON 을 했다가 -> 팔로우 OFF 가 되면서 결과적으로 팔로우 하지 않은 상태가 된다. 반면 (2)번은 팔로우 ON 을 두 번 요청하는 것이 되면서 결과적으로 팔로우 ON.. 2023. 6. 24.
#039. 리팩터링: 히든 필드로 기존 API에 기능 추가하기 개념 새로운 API 를 생성하지 않고 히든 필드를 이용해서 정보를 추가해 특정 기능을 하도록 작동시킬 수 있다. 운영 티켓을 치면서 API를 생성할 일이 많은데 비슷비슷한 API를 계속해 만들어내다보면 API 관리가 어려워진다. 지난 번 글 (one-size fits all)처럼 클라이언트의 요청에 따라 다른 스키마를 내려주도록 작업하는 방법도 있고, 비슷하게 특정 작업만을 위한 히든 필드를 입력하도록 해 기존의 API를 활용해서 기능을 추가할 수 있다. 히든 필드를 전달하는 방법은 크게 두 가지가 있다. 헤더 정보: API 요청이나 응답에 사용자 지정 헤더를 포함시켜 추가 정보를 전달할 수 있다. 예를 들어, 각 요청을 고유하게 식별하기 위해 "X-Request-ID" 같은 헤더를 포함할 수 있다. 쿼.. 2023. 6. 15.
#038. 인프라: 사이드 프로젝트 호스팅 서비스 이사 기록 온프레미스 환경- 사용한 이유: 프로젝트를 시작하면서 서버 비용을 걱정하니 아는 분이 서버를 사용해도 좋다고 하셔서 사용하게 되었다. 심지어 MySQL과 Redis까지 제공해주셔서 현재 프로젝트의 큰 틀을 걱정하지 않고 설정할 수 있었다. 글을 쓰다보니 한 번 더 고마운 마음이다. argoCD 배포 시스템이 되어있어서 도커로 말아서 배포했다. 이 때 actuator를 사용해 무중단 배포 설정을 했다. (글 링크) - 이사 이유: 아무래도 서버를 빌려서 하는 것이다보니 언젠가 여유가 생기면 이사를 가야지 하다가 어느날 마음을 먹고 이사를 하게 되었다. 조금 서두르면서 하다보니 엉성한 곳이 있었지만, 처음으로 MySQL 덤프를 뜨고 스키마들을 싹 옮기는 경험을 했었다. CloudRun + LB (GCP)- .. 2023. 6. 9.
#037. 리팩터링: one-size fits all API 만들기 개념 Restful API는 하나의 엔드포인트에 하나의 스키마를 내려주도록 한다. 그런데 해당 엔드 포인트를 쓰는 플랫폼이 많아지거나 요구사항이 늘어나면서 문제가 생긴다. 모두에게 맞는 엔드 포인트, 즉 모든 정보를 가진 엔드 포인트를 만들거나 (one-size fits all), 매번 비슷한 필드를 내려주면서 각 플랫폼, 디바이스, 수정된 요구사항에 따라 API 엔드포인트를 계속 만들어야하는 작업을 해야한다. 이러한 문제 의식에서부터 나온 것이 graphQL인데, 이를 도입하는 것은 큰 작업이고 새로운 기술을 도입하는 데에는 시간이 필요하다. 가능한 기존의 RESTful 한 엔드 포인트를 유지하면서 클라이언트가 서버에서 원하는 것을 다시 선택하도록 수정해보려고 한다. 적용 요구사항은 아래와 같다. 기존.. 2023. 6. 1.