레시피 상세 응답은 재료·번역·대체재·소스 등 여러 관계를 하나의 화면 형태로 조합해야 했습니다.
locale별 번역 fallback이 필요하고 유스케이스마다 필요한 컬럼과 JOIN이 달라, 테이블 중심 추상화만으로는 실제 조회 의도를 검토하기 어려웠습니다.
ORM 대신 pgx와 sqlc를 사용해 유스케이스별 SQL을 명시하고, 생성된 타입으로 애플리케이션 코드의 타입 안전성을 유지했습니다. ORM이 항상 나쁘다는 뜻이 아니라, 이 서비스에서는 조회 형태를 SQL에서 직접 확인할 수 있다는 점을 중시했습니다.
- 레시피 상세·번역·대체재 조회를 유스케이스별 SQL로 분리했습니다.
- sqlc 생성 코드로 쿼리 결과 타입을 고정했습니다.
- locale fallback과 조건부 관계 조회를 SQL에 명시했습니다.
Go API에서 레시피·재료·번역·대체재 조회를 구현했고 필요한 데이터 관계를 쿼리 단위로 확인할 수 있게 했습니다. ORM과의 속도 비교나 N+1 개선 수치는 측정하지 않았습니다.
기술 선택은 라이브러리 이름을 나열하는 것이 아니라, 데이터 형태를 어디서 검토하고 어떤 불변조건을 지킬지까지 설명해야 한다는 점을 배웠습니다.