페이지 발표 시작 안내 ( 1 ~ 2 페이지 )
- 안녕하십니까. 3조 링북 발표를 맡은 XX입니다.
- 순서로는 프로젝트 개요, 기능 소개, 협업 방식, 개발 방법 순으로 진행하도록 하겠습니다.
프로젝트 개요 ( 3 ~ 9 페이지 )
링북이란 서비스를 개발하기로 한 배경과 저희들이 조사한 유사 서비스 및 기대 효과에 대해 말씀드리겠습니다.
프로젝트 구조 ( 23 페이지 )
프로젝트 구조 흐름도입니다.
- 유저는 React, Next.js, TypeScript로 구현하고 Vercel로 배포한 프론트 단 화면을 통해 서비스를 제공받습니다. 또한, 이미지들을 저장하기 위한 저장소로 AWS S3를 사용했습니다.
- 화면에 출력하기 위한 데이터를 받아오기 위해 프론트에서 AXIOS를 통해 백엔드에 요청을 보냅니다.
- 스프링 프레임워크로 구현하고 웹 서버인 NGINX로 요청을 받습니다. 백엔드 서버는 AWS EC2 서비스를 사용했으며 CI/CD를 위해 Docker와 Github Action을 사용했습니다.
Trouble Shooting
이제부터 트러블슈팅에 관해서 설명하도록 하겠습니다.
Security
- Security 설정정보 클래스는 기존 WebSecurityConfigurerAdapter 클래스 상속받아서 해당 메서드를 오버라이딩 하는 방식으로 구현하였습니다. 하지만 스프링 버전이 업데이트 됨에 따라 WebSecurityConfigurerAdapter 클래스가 deprecated 되었습니다. 이를 해결하기 위해 필요한 클래스들을 Bean으로 등록하는 방식으로 변경하였습니다.
- Access-Token의 인증 과정은 필터에서 진행되어지는데 이곳에서 예외가 발생하게 되면 스프링 컨테이너에서 예외처리가 불가하였습니다. 이를 해결하기 위해 Filter Chain 앞단에 필터의 예외를 처리하는 Filter를 구현하였습니다.
- 이메일 인증시 이메일 인증이 완료된 이메일인지를 검증하는 로직이 필요하였습니다. 세션을 사용하여 정해진 시간동안 인증된 이메일의 정보를 저장하고, 회원가입 요청시에 해당 이메일을 검증하는 로직을 구현하였습니다.
Feature
기능개발에서 발생했던 주요 트러블 슈팅을 설명드리겠습니다.
첫번째로는
JPQL에서 Fetch Join과 ON절을 함께 사용하면서 DB와의 일관성이 깨지는 결과가 반환되는 문제가 있었습니다 저희는 이를 fetch join과 IN 그리고 서브쿼리를 이용해서 해결하였습니다.
두번째로는
하나의 기능에 여러 Entity가 관여하면서 정확히 어떤 Entity에서 발생하는 에러인지 알 수 없는 문제가 발생했습니다. 따라서 에러코드의 범위를 Entity별로 나눠서 에러 반환 객체를 custom하여 문제를 해결했습니다.
세번째로는
상위태그와 하위태그 즉 계층적인 구조의 태그를 구현하기위해, 데이터베이스 설계와 유효성체크의 효율성의 대한 고민이 있었고, 데이터베이스는 계층별로 테이블을 분리해서 연관관계를 맺어주는 것으로 해결, 유효성체크는 계층적으로 Enum Type을 구현하여 해결했습니다.
마지막으로
API단위를 나눌 때 비즈니스적 로직과 객체지향적 설계가 추구하는 바가 충돌하는 경우가 생겼었고, Controller단 즉, API단위는 사용자의 만족도를 높이기 위해 비즈니스적 로직에 맞추고, 그 밑단에서 최대한 객체지향적으로 구현하여 재사용성을 확보하는 방향으로 해결했습니다.
Deploy
끝으로 배포과정에서는
Docker에서 컨테이너간 데이터 포워딩이 제대로 되지않았던 문제를 Docker 컨테이너 안에 자체 메모리공간에 대해 이해하고 데이터를 전달하여 문제를 해결했습니다.