광운대학교 미디어커뮤니케이션 학부 기자재 대여 웹 서비스를 구현할 때 광운대학교 미디어커뮤니케이션 학생만 사용할 수 있도록 해야한다. 하지만 문제는 광운대학교에서는 Open API를 제공하지 않아서 학생 구성원을 어떻게 확인해야 할 지가 큰 문제였다.
개선 방법
광운대학교 학습 전산 시스템인 klas에 가보면 개인번호 조회 기능이 있는 걸 발견했다. 이름과 생년월일을 입력하면 신분, 학과, 성명, 개인번호를 조회할 수 있다. 기리기리 팀은 이를 활용해보기로 했다.
그렇다면 광운대학교의 개인번호 조회 API를 얻어낼 수 있지 않을까? 크롬 개발자 도구를 통해 네트워크 탭에서 어떤 요청을 보내는 지 확인해봤다. 그 결과 다음과 같은 API를 통해 요청을 날리는 것을 확인할 수 있었다.
자 그러면 해당 API를 포스트맨으로 테스트해보자.
이 정보를 활용하면 미디어커뮤니케이션 구성원 검증을 할 수 있을 것이다!!!
어디서 API 호출할 것인가? 우리가 찾아낸 API를 브라우저(프론트엔드)에서 즉시 호출하면 CORS 에러가 발생한다!!!!! 왜냐면 해당 요청의 Content-Type이 application/json인 POST 요청이라 (즉 non simple request) CORS 정책에 대상이 되는 요청이기 때문이다. 이렇기 때문에 백엔드에서 API를 호출하고 프론트엔드에 전달하는 방식으로 구현하기로 했다.
구현
이제 백엔드에서 광운대 API를 호출해서 프론트엔드에 학번 정보만 전달하는 코드를 구현해보자.
Spring 6 HTTP interface 구현
Spring 6에서 HTTP interface 기능을 활용해서 HTTP Client를 쉽게 구현할 수 있다. 먼저 HTTP interface는 내부적으로 WebClient를 사용하므로 WebFlux를 의존성 추가해야 한다.
광운대 API의 baseUrl과 예외 핸들링을 설정한 WebClient를 생성하고 HttpInterface의 구현체로 만들어 빈으로 등록한다. 그러면 이제 아까 만든 인터페이스를 주입할 때 해당 구현체를 주입할 것이다.
Http interface 주입받아서 광운대 학생 검증 로직 구현
이제 광운대 API를 통해 학생의 학번과 학과 등 정보를 조회해올 수 있다. 우리의 목표는 해당 학생이 미디어커뮤니케이션 학생인지를 검증하는 것이다. 미디어커뮤니케이션 학생들은 10자리 학번 중 가운데 3자리가 317 혹은 323이다. 이를 확인하면 광운대 미디어커뮤니케이션 학생임을 확인할 수 있다.
enum으로 미디어영상학부 전공 번호를 도입해서 미디어영상학부 전공번호 확인 로직을 분리했다. 이렇게 한 이유는 전공 번호 확인 로직을 분리해야 테스트하는데 유리하고 학번에서 전공번호의 인덱스 등을 서비스에서 노출하는 것이 지나치게 세부적인 사항이라고 판단했다!!
지금까지 구현한 컴포넌트를 호출하는 서비스를 구현하자. 기존의 회원 관리 서비스와 분리해서 서비스를 구현했는데, 기존의 회원 서비스는 현재 기리기리 서비스의 회원과 관련된 서비스고 지금 구현하려는 광운대 학생 확인 서비스는 아직 우리의 회원이 아닌 사람의 정보를 다루는 로직이라 판단해서 구분지었다.