hanghae99/프로젝트

[프로젝트 회고] 개인 프로젝트를 마치고

욘아리 2024. 3. 1. 18:07

5주간 진행했던 개인 프로젝트가 드디어 끝났다!!

물론 아직 부족한 점이 많지만 그 아쉬웠던 점과 함께 프로젝트 내용을 기록할 겸 회고를 작성해보려고 한다.

 

프로젝트 내용


📌 프로젝트 목적

소프트웨어 설계, 개발, 그리고 테스트에 대한 이해와 경험을 쌓고 향상하는 것이 목적!

팀 프로젝트 경험과 다르게 개인 프로젝트를 진행함으로써 개발 환경 세팅부터 주어진 기능 구현, 그리고 안정적인 코드를 위한 테스트 진행까지 스스로 할 수 있다.

 

🔻ERD 설계

user
- pw_history, follow, post, post_like, comment, comment_like 1 : N 관계
- active 컬럼으로 탈퇴 여부 처리 (soft delete)

pw_history
- 비밀번호 이력 저장

post
- comment, post_like, multimedia 1 : N 관계

comment
- comment_like 1 : N 관계

 

🔻구현하고자 했던 기능

회원가입 / 로그인
- JWT 토큰과 Security를 이용한 회원가입 로그인
- 회원 권한 부여(USER, ADMIN)

사용자
- 사용자 정보 및 작성한 게시물, 팔로워 & 팔로잉 목록 조회
- AWS S3를 이용한 프로필 사진 업로드
- 비밀번호 수정 시 최근 3번 안에 사용한 비밀번호 사용 제한
- 팔로우 기능

게시물, 댓글
- 게시물, 댓글 조회를 제외한 모든 기능에 인가 적용
- 수정과 삭제는 작성자만 가능
- AWS S3를 이용한 멀티미디어 업로드
- 자신의 게시물, 댓글 제외 좋아요 및 취소 기능

백오피스(관리자)
- 사용자 권한 수정 및 강제 탈퇴 시킬 수 있는 사용자 관리 기능
- 게시물, 댓글 수정과 삭제할 수 있도록 게시물 관리 기능

 

🔻테스트

테스트 코드
- 통합 테스트 : MockMvc를 사용한 컨트롤러 통합 테스트
- 단위 테스트 : Mockito를 사용한 서비스 단위 테스트

(+) 부하 테스트
- Artillery 이용 : 게시물 조회 API에 대한 성능 개선 작업

 

기술 스택 선택 이유


Java 17

- Java는 플랫폼 독립성을 제공하여 다양한 운영체제에서 실행될 수 있으며, 모듈화를 통해 재사용성을 높일 수 있음

- Java 17 버전은 장기적인 지원을 제공하여 호환성과 안정성 보장하며, 최신 기술과 트렌드에 대한 지원을 통해 다음 세대 프레임워크로의 마이그레이션이 용이함

- Spring Boot 3.0부터는 Java 17 이상을 지원한다는 점도 고려

Spring Boot

- 간편한 설정을 통해 스프링을 편리하게 사용할 수 있도록 지원

- Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨

- 의존성 관리를 위한 스타터(starter) 패키지를 제공하여 필요한 라이브러리들을 쉽게 추가 가능

 

Spring JPA

- Java 객체와 관계형 데이터베이스 테이블 사이의 매핑을 자동으로 처리해 줌

- 데이터베이스 관련 작업을 단순화하고 추상화하여 SQL 쿼리를 직접 작성하지 않아도 됨

- CRUD 작업을 위한 간단한 메서드를 제공하여 반복적인 작업 간소화 시켜줌


MySQL

- 다양한 데이터 간의 관계가 연관되어 있기 때문에 관계형 데이터베이스로 효과적으로 관리할 수 있음

- 가장 널리 사용되고 있고 무료로 사용이 가능

 

JWT

- 클라이언트 측에서 인증 정보를 관리하여 서버 확장 시 세션 불일치 문제 해결

- 서버가 사용자 인증 정보를 저장할 필요가 없어, HTTP의 무상태성을 그대로 활용

- 서버의 메모리 부담을 줄여주며, 각 요청을 독립적으로 처리하여 성능과 안정성 유지

 

AWS S3

- 필요에 따라 자동으로 확장되므로 메모리 관점에서 로컬보다 효율적

- 세계 최대 규모의 클라우드 서비스인 AWS에서 제공하는 매우 높은 확장성과 신뢰성

 

QueryDSL

- 컴파일 시점에서 쿼리 오류를 검출하여 타입 안전성을 보장

- 직관적인 자바 코드로 쿼리를 작성할 수 있음

- JPA의 한계를 극복하여 복잡한 쿼리를 처리할 수 있고, 필요에 따라 SQL과 유연하게 조합하여 사용 가능

 

잘했거나 좋았던 점


깃 관리

- 처음으로 GitHub을 사용하여 프로젝트를 진행했는데, 이전에는 GitLab을 사용한 협업 경험만 있었다. 프로젝트 시작 전 이전 프로젝트에서 피드백을 받았던 부분을 적용하기 위해 GitHub의 issue와 pull request template을 활용하여 기능 구현과 진행 사항을 체계적으로 기록했다. 또한, 개인 프로젝트지만 브랜치를 나누어 진행함으로써 작업을 분리하고 효율적으로 관리하며 협업에 대한 연습을 할 수 있었다.

 

JWT 및 Spring Security를 통한 인증 및 인가 구현

- 이번 프로젝트에서 JWT와 Spring Security를 사용하여 인증 및 인가 기능을 구현했다. 이전에는 Node.js를 사용했기도 하고, 스켈레톤 코드를 받아 작업했었기 때문에, 이번에는 처음부터 설정하고 구현하는 과정을 경험했다. 이를 통해 인증 흐름에 대한 깊은 이해를 얻을 수 있었다. 서버 쪽 코드를 완성한 이후에 프론트를 구현함에 있어서 클라이언트-서버 간 통신에서 발생한 문제를 해결하면서 토큰의 관리와 정보 전달에 대해 더욱 명확하게 이해할 수 있었다. 

 

테스트 코드 작성

- 테스트 코드 작성 과정에서도 어려움을 겪었지만, 이를 통해 많은 경험을 얻었다. 처음으로 테스트용 데이터베이스를 연결하며 통합 테스트도 작성해 보고, 외부 영향받지 않고 내가 작성한 코드만 테스트하는 단위 테스트도 작성해 보면서 테스트에 대한 이해도를 높일 수 있었다. 그러나 모든 기능을 한 번에 작성하려고 하다 보니 시간이 오래 걸렸고, 앞으로는 기능을 구현하면서 동시에 테스트 코드를 작성해야 함을 깨달았다.

 

결론적으로 이러한 경험들을 혼자서 스스로 선택하고 해결해 나가는 과정에서 가장 큰 성취감을 느꼈다. 개발자로서의 능력과 자신감을 향상할 수 있었고, 앞으로 프로젝트를 어떤 식으로 하면 더 좋을지 생각했으므로 그 점들을 적용해 다음 프로젝트는 더 잘 해내고 싶다.

 

문제였던 점이나 아쉬웠던 점


인증 및 인가 구현 시 마주한 어려움

- 블로그에도 정리했었지만, JWT와 Spring Security 관련 코드를 한꺼번에 적용시키려다 보니 코드에 대한 이해가 부족했다. 제공된 자료에 있는 코드를 무작정 따라 하다 보니 인증 로직에 대한 파악이 어려웠다. 코드와 로직에 대한 이해가 안 된다면 관련 기능이 추가 갈수록 더 큰 어려움에 직면할 것으로 생각이 들었다. 그래서 일주일 동안의 작업을 미뤄두고, 먼저 기본적인 CRUD 기능을 작성하기 시작했다. 기본 기능을 먼저 구현하면서 코드 이해도를 높이고, 그 후 인증 로직을 구현하는 것이 중요하다고 판단했다. 처음부터 차근차근 진행했어야 했지만, 주어진 시간 내에 완료해야 한다는 압박감이 더 앞섰던 것 같다. 이러한 점이 아쉬움으로 남지만, 시행착오를 통해 많은 것을 배우고 성장할 수 있었다.


테스트 코드 작성 시 잘못된 접근

- 통합 테스트를 작성할 때 각 테스트 메서드를 개별적으로 실행할 때는 성공했지만, 모든 테스트를 한 번에 실행할 때 실패로 뜨는 현상이 발생했다. 모든 테스트를 진행하면서 User의 ID가 내가 지정한 값이 아닌 다른 값으로 저장되면서 발생된 문제였다. 따라서 저장된 User의 ID값을 가져와서 이를 테스트에 활용하여 비교함으로써 문제를 해결할 수 있었다. 

- 이 과정에서 피드백으로 받은 내용은 서비스 단위 테스트의 중요성에 대한 것이었다. 통합 테스트는 외부에서 오류가 발생할 수 있어서, 핵심 로직인 비즈니스 로직은 서비스 단에서 다른 요인들을 배제하고 독립적으로 테스트되어야 한다는 것을 배웠다. 따라서 서비스 단위 테스트를 진행하여 핵심 비즈니스 로직에 대한 테스트를 진행할 수 있었다. 처음부터 충분한 이해를 바탕으로 테스트 코드를 작성했다면 이러한 문제를 빠르게 해결할 수 있었을 것이다. 하지만 이러한 경험을 통해 테스트 코드에 대한 이해도를 높일 수 있었다.

 

다음에 시도하고 싶은 점


소셜로그인 기능

- 소셜 로그인을 구현하고 싶었지만, 다른 기능들을 구현하는 데에 예상보다 오랜 시간이 걸려서 소셜 로그인 기능을 시도하지 못한 아쉬움이 있다. 소셜 로그인은 사용자가 외부 소셜 플랫폼의 인증 시스템을 활용하여 로그인하는 기능을 제공한다. 이를 통해 사용자는 별도의 가입 절차 없이 간편하게 로그인할 수 있으며, 소셜 로그인을 통해 oauth와 같은 인증 프로토콜을 다뤄볼 수 있는 좋은 기회가 될 것이라 생각했다. 다음 기회에 꼭 소셜 로그인 기능을 구현해 다양한 로그인 옵션을 제공하고 싶다.


배포

- 다음에 시도하고 싶은 점은 프로젝트 완성 후 배포하는 것이다. 개발하는 과정도 중요하지만, 실제 사용자가 이용할 수 있도록 배포하는 것도 중요하고 그 과정에서 문제들도 많이 발견할 수 있다. 그렇기 때문에 배포 과정에서 발생하는 문제들을 해결하고 운영하는 경험 또한 필요하다고 생각한다. 따라서 다음 프로젝트에서는 프로젝트의 완성을 위해 배포 과정을 경험하고, 사용자들이 실제로 서비스를 이용할 수 있도록 하고 싶다.