인터페이스 코딩 규칙 정리
인터페이스에서 규칙 정의가 필요한 항목
Section titled “인터페이스에서 규칙 정의가 필요한 항목”dictionary-api 저장소가 국립국어원 표준국어대사전/한영사전 오픈API를 연동하는 방식
(interfaces 패키지, StdictClient/KrdictClient)을 기준으로 정리한다.
- 인터페이스 라이브러리 사용 규칙
- 인터페이스 개발 규칙
- 인터페이스 테스트 규칙
- 인터페이스 운영 적용 규칙
인터페이스 라이브러리 사용 규칙
Section titled “인터페이스 라이브러리 사용 규칙”- 외부 API 호출은 Spring **
RestClient**로 통일한다.RestClient.builder()를 직접 호출하지 않고, Spring Boot가 자동 구성한RestClient.Builder를 주입받아baseUrl만 지정하는 전용Config빈(StdictConfig/KrdictConfig)을 둔다. - JSON 응답은 기본 Jackson으로, XML만 지원하는 API는 클래스패스의
jackson-dataformat-xml을 Spring Boot가 자동 구성하는JacksonXmlHttpMessageConverter를 그대로 쓴다 — 별도 컨버터를 직접 등록하지 않는다.
인터페이스 개발 규칙
Section titled “인터페이스 개발 규칙”- 외부 API 연동 클라이언트는 특정 기능(feature)에 종속되지 않는 공용 레이어이므로, 각
기능 패키지가 아니라 최상위
interfaces패키지에 둔다. - 인증키는 프로퍼티(예-
stdict.api-key,krdict.api-key)로 설정하고, 값은 프로파일 설정에ENC(...)로 암호화해 저장한다. - 응답 포맷이 API마다 다를 수 있음을 클라이언트가 흡수한다 — 검색 결과가 1건이면 배열이 아니라 단일 객체로 오는 등의 API별 특이사항은 클라이언트 내부에서 정규화하고, 호출부에는 일관된 형태로만 노출한다.
- 외부 서버(WAF 등)의 요구사항 때문에 필요한 헤더 보정 같은 우회 로직은 클라이언트 내부에 격리하고, 그 이유를 주석으로 남긴다.
- 신규 인터페이스는 CRUD 저장 흐름과 바로 연결하지 않고 호출/파싱까지 먼저 구현한 뒤, 실제 저장 연동은 별도 단계로 진행할 수 있다.
인터페이스 테스트 규칙
Section titled “인터페이스 테스트 규칙”- 클라이언트 자체는
MockRestServiceServer.bindTo(RestClient.Builder)로 요청 파라미터 구성과 응답 파싱만 검증하는 순수 단위테스트로 커버한다. Spring 컨텍스트를 띄우지 않고, 실제 네트워크 호출도 하지 않는다. - 실제 외부 API를 진짜로 호출해 연동을 확인하는 테스트는
@Tag("integration")으로 분리한다. 하루 호출 제한·네트워크 의존성 때문에 일반 빌드/테스트(./gradlew build/test)에는 포함하지 않고, 별도 태스크(./gradlew integrationTest)로만 수동 실행한다. - 이 인터페이스를 호출하는 컨트롤러를 테스트할 때는 클라이언트를
@MockitoBean으로 대체해 실제 네트워크 호출 없이 라우팅/응답 조립만 검증한다.
인터페이스 운영 적용 규칙
Section titled “인터페이스 운영 적용 규칙”- 외부 API 인증키는 발급 기관 정책(사용자당 1개, 하루 요청 건수 제한)을 확인하고 프로퍼티로만 관리한다 — 코드에 하드코딩하지 않는다.
- 운영 환경의 인증키도 개발/테스트와 동일하게
ENC(...)로 암호화해 저장하고, 암호화 규칙의 마스터 패스워드 관리 절차를 따른다. - 하루 호출 제한에 걸릴 수 있는 기능(대량 조회/배치 등)은 운영 적용 전에 호출량을 추정해 제한 초과 가능성을 미리 점검한다.