본문 바로가기

분류 전체보기63

#050. 코프링: direnv로 로컬 환경변수 주입하기 direnv란? Direnv는 현재 디렉터리를 기반으로 환경 변수를 정의하고 로드할 수 있는 셸 확장 및 환경 변수 관리 툴이다. 보다 쉽게 프로젝트별로 환경 변수를 설정할 수 있다. .envrc 파일을 만들어서 환경변수를 정의하고 디렉터리로 이동하면 .envrc 파일에 정의된 변수가 자동으로 셸 환경으로 로드된다. direnv 사용 장점: - 프로젝트별 환경: 각 프로젝트마다 고유한 환경 변수를 가질 수 있어서 충돌 없이 프로젝트 간에 쉽게 전환할 수 있다. - 보안: API 키와 같은 민감한 정보를 github에 올리지 않고 .envrc 파일에 저장할 수 있어 데이터를 보호할 수 있다. - 자동화: Direnv는 스크립팅을 지원해 환경마다 그에 맞는 DB 마이그레이션이나 개발 서버 시작과 같은 작업을.. 2023. 7. 18.
#049. 코프링: 코틀린으로 커뮤니티 신고기능 구현하기 개념 커뮤니티 기능이 있는 앱을 출시하기 위해서는 신고기능이 필요하다. 이번 글에서는 커뮤니티 신고 기능 API를 만들면서 백엔드 API를 어떤 방식으로 작업하는 지 정리해보려고 한다. 생성된 신고의 상태를 바꾸는 API를 보려고 하고 사용한 스택은 springboot, graphql, mysql 이다. 구현 (1) API 작성(스키마) w. 프런트 graphql을 사용하고 있다. schema-first로 작업하고 있어서 스키마를 먼저 작업한다. 신고글 id와 바꾸려고 하는 상태를 입력받고(ChangeReportStatusInput), 변경된 상태를 반영한 신고를 되돌려준다. 스키마를 정하기 위해서는 정책적인 이야기도 필요하다. 이 작업은 프런트와 함께 확인하며 진행한다. // schema.graphql.. 2023. 7. 17.
#048. 스프링: 스프링 빈 이해하기(DI, IOC, 등록과 주입) 최태현님의 스프링 기초 강의를 듣다가 너무 좋은 내용이 나와 강의 내용을 정리했다. 스프링 컨테이너를 사용하는 이유(DI 와 IOC) spring의 IOC: 주입 가능한 컴포넌트(Bean)를 스프링 컨테이너에서 관리하는 것 spring의 DI: 아래와 같이 service 레이어에서 직접 repository 클래스를 인스턴스로 만들어 사용하는 것이 아니라 이미 만들어진 인스턴스를 주입받아 사용하는 방식.(IoC를 하기 위한 한 가지 패턴). (1) spring bean을 사용하지 않는 service 와 repository를 이용해 구현 (메모리를 사용하는 DB와 연결) 사용하는 곳에서 객체를 직접 instanciate 해서 사용한다. // Controller @RestController public cla.. 2023. 7. 13.
#047. 코프링: ktlint 적용하기 & pre-commit 룰 만들기 기본 설정들설정을 하면 자동으로 check 하거나 formatting 할 수 있다. 기본으로 설정되는 규칙 중 몇가지를 보면 아래와 같다. https://pinterest.github.io/ktlint/0.50.0/rules/standard/Standard rules - KtlintStandard rules Annotation formatting Multiple annotations should be on a separate line than the annotated declaration; annotations with parameters should each be on separate lines; annotations should be followed by a space Rule-id: annotati.. 2023. 7. 9.
#046. 실행계획 EXPLAIN 까막눈 벗어나기 🦅 쿼리가 효율적으로 작동하고 있는 지 알기 위해서 쿼리의 실행 계획을 읽어야 한다. 아래는 백엔드 수준에서 실행 계획(explain)을 읽는 팁을 Real MySQL 책(링크)의 10장 실행계획을 읽고 정리하고 및 실행해 본 기록이다. MySQL에서는 tradition format으로 뽑아볼 수 있지만 회사에서 사용하는 Postgres는 tree/json/html 형식을 지원한다. 따라서 MySQL은 tradion 형태로 하되 tree 형태로도 데이터를 확인하려고 한다. 1. 들여쓰기 = 쿼리 실행 순서, id tradition: 참고) id: select 쿼리가 몇 번 일어났는가. (select 쿼리 단위) 실행 순서와는 상관이 없다. id가 같은 테이블이 여러개라면 그 테이블들이 모두 조인되었다는 의미.. 2023. 7. 2.
#045. 리팩터링: NULL + Boolean 대신 ENUM 타입 사용하기 문제 최근 한 API 작업에서 요청 받는 필드를 nullable한 boolean 타입으로 설정했다. 표시가 있으면(true) 표시된 모든 데이터를 가져오고, 표시가 되어 있지 않으면(false) 표시되지 않은 데이터만 가져온다. 그리고 아무 값도 주어지지 않으면(null) 모든 값을 다 조회하도록 하였다. 이 구현은 null 관점에서 아래 두 가지 원칙을 고려해봤을 때 개선할 부분이 있다. (1) 함수로 받는 값에는 nullable을 최대한 피한다: nullable을 허용하는 매서드는 프로그램 전체에 null 을 퍼뜨리는 역할을 한다. 매서드 파라미터에 null을 허용해 지나치게 유연한 메서드를 만들지 말고 최대한 명시적인 메서드/함수를 만들어야 한다. (2) boolean을 사용할 때 null은 배제하.. 2023. 7. 2.