누리미디어 - 채용 홈페이지 누리미디어 채용 홈페이지입니다.

누리미디어 - 채용 홈페이지

누리미디어 채용 홈페이지입니다.

IMC

🚀 백엔드 프로젝트 구축기 (feat. AI 채팅)!

국내 최대 학술 서비스인 DBpia는 논문 콘텐츠를 제공하는 것 이상의 서비스를 제공하고자 많은 시도를 하고 있습니다. 24년에는 이러한 시도의 일환으로 논문 뷰어에서 한 발 더 나아간 논문 채팅 서비스를 만들기로 했는데요. 논문을 보면서 그 논문에 대해 질의 응답을 할 수 있는 AI 채팅이 바로 그것입니다!😆 빠른 서비스 출시를 위해 API로 타 업체의 PDF 요약, PDF 채팅 기능을 구현하고 구현된 API를 이용해 DBpia에 채팅 기능을 붙일 백엔드 서버를 새로 구성하는 작업을 거쳤는데요. 이 글은 그 과정에 대해 간략히 공유드릴 목적으로 작성되었습니다! 😎

제목 없음

🛠️ 프로젝트 뼈대 구성

프레임워크는 스프링부트로 선정했습니다. 스프링부트는 팀원들 모두 노하우가 있는 프레임워크였기 때문에 빠른 개발이 가능하고, 많은 보안 라이브러리를 제공해주어 보안적으로도 부담없는 개발이 가능한 프레임워크였습니다.

스프링부트를 이용해 초기 작업인 필수 의존성 설정, 디비 연동, 환경 분리, 공통 예외, CORS 등을 설정 해주었습니다. 기본적인 뼈대가 만들어졌으니 이제 살을 붙여보도록 합니다.

제목 없음

📝API 문서화

API 도큐먼트로는 Swagger 3.0(open api 3.0 docs)을 사용하기로 했습니다. 스프링 프레임워크에서 Swagger를 이용할 수 있게 도와주는 라이브러리는 크게 두 가지가 있는데요. 업데이트 이력을 바탕으로 springdoc을 이용하기로 결정하였습니다.

1. Springfox

mvnrepository를 보면 2018년 6월부터 업데이트가 2년간 중단 되었고, 가장 최근 업데이트는 2020년입니다.

2. Springdoc

반면 Springdoc은 최근까지도 활발하게 업데이트를 하고 있습니다. 또한 Springdoc은 Springfox가 업데이트 하지 않은 기간동안 webflux라는 논블록킹 비동기 방식을 지원하며 발전된 라이브러리 모습을 보였습니다. 그래서 Springdoc 라이브러리를 채택하기로 했습니다!

제목 없음

💼 AI 채팅 API 작성

이번 프로젝트는 RESTful API 규칙을 따라 작성하기로 했습니다. RESTful API란, REST(REpresentational State Transfer) 아키텍처 스타일의 디자인 원칙을 준수하는 API로 REST는 GET, POST, PUT, DELETE 및 PATCH와 같은 표준 HTTP 메서드를 사용하여 리소스에 대해 수행할 작업을 나타냅니다.

REST API 디자인 1. URI는 정보의 자원을 표현해야 한다. (리소스명은 동사보다는 명사를 사용) 2. 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)로 표현

AI 채팅 API는 이러한 규칙들에 맞춰 작성 됐습니다. 1. 슬래시 구분자(/)는 계층 관계를 나타내는 데 사용한다. 2. URI 마지막 문자로 슬래시(/)를 포함하지 않는다. 3. 하이픈(-)은 URI 가독성을 높이는데 사용한다. 4. 밑줄(_)은 URI에 사용하지 않는다. 5. URI 경로는 소문자로 작성한다. 6. 파일 확장자는 URI에 포함하지 않는다.

제목 없음

⚠️ CORS 문제 발생

처음 프로젝트 뼈대를 구축할 때 CORS 설정도 해두었다고 말씀 드렸었는데요. 허용 origin을 모두 설정해주었기 때문에 문제가 없을 것이라 생각했습니다. 그러나 실제 개발서버로 올리고 보니 자꾸만 CORS 오류가 발생하였습니다. 처음에는 설정해둔 CORS filter에 문제가 있는줄 알고 코드를 계속 수정해가며 테스트 했으나 문제가 해결되지 않았고 요청 헤더를 확인하여 계속 방화벽으로 리다이렉트 되고 있는것을 발견 하였습니다. WAF에서 리다이렉트 시키던 요청은 *preflight 요청으로 CORS 동작 방식중 하나였는데요. 히스토리를 확인해보니, 이전에 DBpia는 이렇게 백엔드를 분리한 적이 없었기 때문에 OPTIONS 메소드가 불필요하다고 생각해 막아둔 것이었죠.. 이제 DBpia는 백엔드, 프론트엔드 분리를 앞두고 있기 때문에 해당 메소드를 허용하도록 수정해주었습니다.

*body에 큰 크기의 요청이 담길 경우, 유효하지 않은 요청을 보내게 되면 리소스를 낭비고 서버에 큰 부하를 주게 됩니다. 지금 보내려는 요청이 유효한지 OPTIONS 메소드로 예비 요청을 먼저 보내보는 기능이 preflight입니다.

제목 없음

☁️ 배포를 위한 클라우드 구성

다음단계는 배포를 위한 클라우드 구성으로 DBpia 인프라는 AWS로 구성되어 있어 필요한 서버를 새로 구축하면 개발자가 직접 간단한 인프라를 구성해볼 수 있습니다. Route53을 통해 도메인을 설정하고, EC2 인스턴스를 생성해 연결, 서버 유형에 맞는 보안그룹을 설정하고 실서비스를 위한 로드밸런서도 구성함으로서 기본적인 인프라를 구축을 완료하였습니다.

기본적인 AWS 구성 누리미디어에서는 이런 기본적인 구성을 직접 해보며 네트워크에 대한 이해를 좀 더 높일 수 있습니다. 인프라 구성이 완료 되면 실제 배포를 위해 인스턴스에 여러 설정을 해주고, 서버를 띄워 실제 동작하는지 확인을 해줍니다.

제목 없음

👥 마치며..

현재 누리미디어 개발팀은 지속적으로 시스템을 개선해 나갈 수 있는 작업 환경을 구축하기 위해 백엔드와 프론트엔드의 역할을 구분하는 작업 또한 진행하고 있는데요. 이번 AI채팅 개발은 DBpia라는 프로덕트 내에서 AI 채팅이 동작하도록 구성하지 않고 백엔드를 기반으로 프로젝트를 구축한 의미있는 작업이었습니다. 이 프로젝트를 시발점 삼아 백엔드 개발자로서 더 나은 개발 환경을 향해 변화하며 발전할 수 있도록 노력하겠습니다! 😉