[게시판 서비스] 프로젝트 회고

황인권·2024년 8월 15일

1인 개발로 진행해온 게시판 서비스 프로젝트의 고도화 작업까지 마무리가 되어 프로젝트 동안 겪었던 내용을 정리해놓고자 합니다.

프로젝트에 대한 세부 내용은 깃허브 README로 대체합니다.

https://github.com/dlsrnjs125/board_project


1. 프로젝트 시작 이유 및 선택

지금까지 동영상이나 책을 통해 이론으로만 공부하다보니 머리속의 지식들이 정리되는 것이 아닌 파편적으로 있다고 느껴졌다.
특히 해당 내용들을 이해한 것이 아니라 외운 것에 불과하다라는 느낌이 많이 들었고 이 문제를 해결하기 위해 직접 프로젝트를 진행하는 것이 최선이라 판단했다.

게시판 서비스라하면 간단하게 생각할 수 있지만 여러가지 기능들을 추가하게 되면 무궁무진하게 공부해볼 수 있는 프로젝트라 생각했다.
간단하게 만든다면 CRUD, Restful API, DB 등등 간단하게 할 수 있다. 하지만 여기서 로그인과 같은 보안기능, 해시태그를 통한 필터링 기능, 게시판 글쓰기 뿐만이 아닌 댓글 기능 등등 여러 기능들을 추가하면 할수록 공부해야 할게 많다고 판단했다.

또한 이번 프로젝트를 진행하기에 앞서 먼저 중요하게 생각했던 부분이 기획과 문서작성, 개발, 형상관리, 테스트 등과 같이 개발 프로세스 전반을 경험해보고자 했다.


2. 기술 스택 선택 이유

Java 17

  • Java는 플랫폼 독립성을 제공하여 다양한 운영체제에서 실행될 수 있으며, 모듈화를 통해 재사용성을 높일 수 있음
  • Java 17 버전은 장기적인 지원을 제공하여 호환성과 안전성을 보장하며, 최신 기술과 트렌드에 대한 지원을 통해 다음 세대 프레임워크로의 마이그레이션이 용이함.
  • Spring Boot 3.0부터는 Java 17이상을 지원한다는 점도 고려

Spring Boot

  • Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 된다.
  • 의존성 관리를 위한 스타터(starter) 패키지를 제공하여 필요한 라이브러리들을 쉽게 추가 가능
  • 간단한 설정을 통해 스프링을 편리하게 사용할 수 있도록 지원

Spring JPA

  • Java 객체과 관계형 데이터베이스 테이블 사이의 매핑을 자동으로 처리해준다.
  • 데이터베에스 관련 작업을 단순화하고 추상화하여 SQL 쿼리를 직접 작성하지 않아도 된다.
  • CRUD 작업을 위한 간단한 메서드를 제공하여 반복적인 작업을 간소화 시켜준다.

MySQL

  • 다양한 데이터간의 관계가 연관되어 있기 때문에 관계형 데이터베이스로 효과적으로 관리할 수 있다.
  • 가장 널리 사용되고 무료로 사용이 가능

Thymeleaf

  • Java 기반의 서버 사이드 템플릿 엔진으로, 웹 애플리케이션의 뷰를 생성하는 데 사용된다.
  • Spring Framework와의 통합이 원할하여 Spring의 컨트롤러와 모델 데이터를 템플릿에 쉽게 전달이 가능하다.
  • HTML을 직접 작성할 수 있어서, 템플릿을 서버 없이도 테스트할 수 있는 기능을 제공한다.

Oauth2

  • 웹, 앱, 모바일 앱, 서버간 통신 등 다양한 클라리언트 유형 및 상황에 맞게 설계된 여러 인증 흐름을 제공한다.
  • 토큰 기반의 인증 방식으로 제한된 기간동안에만 유효하며, 보안 위협을 최소화한다.
  • 애플리케이션의 사용자 암호를 직접 다루지 않고 사용자의 데이터에 접근하도록 한다.

Vault

  • 민감한 데이터들을 안전하게 저장하고 관리하기 위해 고안된 솔루션이다.
  • 카카오 인증에 필요한 데이터와 여러 환경변수들은 민감한 데이터인데 이를 안전하게 저장하고 관리하기 위해 사용

Lombok

  • Java 언어의 반복적인 코드를 줄이고, 코드의 가독성과 유지보수성을 향상시켜준다.
  • 유용한 애노테이션을 제공하여 특정 설게 패턴을 쉽게 구현할 수 있게 해준다.

Swagger UI

  • 프로젝트에서 지정한 URL들을 자동으로 문서화해준다.
  • 간단히 API를 볼 수 있을 뿐만 아니라, 요청과 응답 테스트 또한 진행할 수 있다.
  • 다양한 설정 옵션과 커스터마이제이션 기능을 제공하여 조직의 요구사항에 맞게 API 문서를 구성할 수 있다.

GitKraken

  • Git 클라이언트로 다양한 기능을 통해 Git workflow를 더욱 효율적이고 직관적으로 관리할 수 있게 도와준다.
  • 시각적이고 직관적인 인터페이스를 제공하여 복잡한 히스토리와 브랜치를 쉽게 이해하고 관리할 수 있게 해주며, 명령어를 별도로 입력하지 않아도 된다.
  • Undo, Redo 기능이 존재하여 로컬에서의 작업을 되돌리고 싶으면 언제든지 되돌릴 수 있다.

3. 배우거나 얻은 점

고민할 거리가 많았던 것

전체 개발 기간 중 80%가 넘는 시간은 다음 요소 등에 쓰였다.

  • 애플리케이션의 동작 원리에 대한 이해
  • 더 좋은 변수명과 코드의 가독성을 위한 고민
  • 최대한 많은 시나리오를 커버할 수 있는 테스트 코드를 위한 고민
  • 코드의 성능 개선 개능성에 대한 고민
  • 코드 작성 이후의 리팩토링 가능성에 대한 고민

코딩을 하는 시간은 전체의 일부분에 불과했고 대부분은 더 좋은 코드를 만들기 위해 구글링을 하고 개념을 익히는 것에 대부분의 시간을 할애한 것같다.

문제 하나를 해결하기 위해 검색하기 시작하면 모르는 지식들이 꼬리를 물고 나와 수 시간이 지난후 보면 수십개의 크롬 탭들이 켜져 있는 경우도 허다했다. 그럼에도 결국 원리를 이해하고 하나하나 탭을 꺼가며 공부했던 흐름을 리마인드할 때 가장 큰 성취감을 느낄 수 있었다.

전체적인 개발흐름을 이해할 수 있었던 것

이번 프로젝트는 아무것도 없이 시작한것이 아닌 전체적인 아키텍쳐와 ERD등을 먼저 구상하고 그에 따라서 옆길로 새지 않고 해당 내용만 탑다운 방식으로 진행했다.

개발을 함에 있어서 구현도 중요하지만 다른 여러가지 작업들이 중요하다는 것을 느끼게 되었다.

  • 요구사항 분석
  • 설계
  • 구현
  • 테스트
  • 배포
  • 유지보수
  • 문서화
  • 프로젝트 관리

이러한 각 단계를 통해 소프트웨어 개발이 체계적으로 진행될 수 있으며, 효과적인 결과를 도출할 수 있게 된다. 각 단계는 서로 연계되어 있고 각 단계에서의 결정과 작업은 다음 단계에 영향을 미치기 때문에 전체적인 흐름을 이해하는 것이 중요하다.

특히 프로젝트에서 요구사항 분석이 중요하다고 느꼈다. 요구사항 분석이 제대로 되어야 어떤 기능을 도출해야할지 정해지고 구현 방안의 기획이 잡히고 개발을 시작할 수 있기 때문이다.

Git 관리

이전에는 프로젝트를 구현할 때 모든 작업을 마치고 Github에 한번에 올리는 등의 방식을 사용했는데, GitKraken을 이용하여 Github에 각 개발과정을 세세하게 분리해서 관리할 수 있었다.
특히 개인 프로젝트이지만 브랜치를 나누어 진행하고 Github의 issue와 pull request등을 활용함으로써 작업을 분리하고 효율적으로 관리하며 협업에 대한 연습을 할 수 있었다.

테스트 코드, 문서화의 중요성

테스트 코드 작성 과정에서도 어려움을 겪었지만, 처음으로 테스트용 데이터베이스를 연결하여 통합 테스트도 작성해보고, 외부 영향을 받지 않고 내가 작성한 코드만 테스트하는 단위 테스트도 작성해보면서 테스트에 대한 이해도를 높일 수 있었다.
이전에 했던 프로젝트에서는 테스트코드를 작성하지 않은채 기능 구현 위주로 프로젝트를 진행했다.

그러던 중 기능이 점점 복잡해지고 코드의 양이 쌓여가면서 왜 그렇게 사람들이 테스트, 주석, 문서화와 같은 기본기의 중요성에 대해 말하는지 알 수 있었다.

  • 내가 무엇을 만들고 있는지 정확히 인지

개발자는 주로 요구사항을 분석하여 설계 후 구현하는 일을 하는데 가장 중요한 것이 요구사항을 제대로 분석하는 일이다. 그리고 반드시 요구한 항목을 최대한 구현해야 한다.

테스트 코드를 작성하면서 요구사항의 기능적인 항목들을 차분히 정리하는 과정을 경험할 수 있고, 이때 발생할 수 있는 예상외의 코너 케이스를 찾을 수도 있다.

  • 테스트 코드가 없다면 프로젝트 진행 속도가 현저히 느려진다.

테스트 코드를 작성하지 않을 때는 기능 하나를 작성하고 UI를 직접 보면서 기능이 원하는대로 잘 구현되어있는지, 문제는 없는지 확인을 했다.
서버를 재시작해가면서 기능의 동작여부를 확인하다가 기능들이 많아지고 점점 진행속도가 현저히 느려지게 될 것이다.
테스트 코드가 없는 프로젝트에서는 새로운 기능을 추가하는 것도 힘들겠지만, 기존 기능을 수정하는 것은 더욱 어려운 일이될 것이다.
하지만 테스트 코드가 있다면 수정이나 구조 변경 후에도 기능이 요구사항에 맞게 정상적으로 작동하는지 검증할 수 있게 된다.

  • 주석과 문서화가 없다면 어떻게 동작하는지 알기 힘들다.

프로젝트를 시작하고 며칠, 몇주까지는 모든 기능들이 어떻게 동작하는지 기억에 남아있고 이땐 이걸 이렇게 사용해야지 했지만 테스트 코드의 경우처럼 기능들이 많아져 복잡해지고 시간이 지나면서 문제가 발생했다.
작성할 당시에는 어떻게 동작하는지 알고 있었지만 시간이 지난 뒤는 기능이 어떻게 동작하는지 알지 못하는 상황이 온것이다.
본인이 작성한 코드를 한참 들여다보고 내부 코드를 이해하면서 시간을 쓰는 동안 남을 위해서가 아니더라도 나를 위해서 상세한 주석과 문서화가 필요함을 느꼈다.
이를 프로젝트상에도 문서화 했지만 각 기능별로 브랜치를 나누어 진행하여 Git에 Issue정리와 pull request를 함으로써 문서화를 하여 각 기능들에 대한 문서화를 진행했다.

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

이번 프로젝트에서 Spring Security와 OAuth2를 사용하여 인증 및 인가 기능을 구현했다.
인증과 권한 부여를 위해 JWT와 OAuth2은 웹 및 어플리케이션 개발에서 널리 사용되는 기술이다. JWT는 간단한 토큰 기반 인증 시스템을 제공하는 반면 OAuth2는 보다 복잡한 권한 부여 프로세스를 지원한다.
또한 OAuth2는 사용자의 중요한 정보를 담고 있지 않고 카카오 로그인 서비스를 이용하고자 OAuth2를 선택했다.

또한 프로젝트 내부에 민감정보들을 그대로 사용하면 보안에 취약하므로 Vault를 이용한 환경변수를 통제하여 보안에 신경을 썼다.

쿼리 최적화 경험

인덱스 최적화

  • 데이터베이스에 게시글과 댓글 데이터가 많아짐에 따라 조회 성능이 떨어졌다.
  • 특정 컬럼에 대해 인덱스를 추가하여 성능을 최적화했다. 예를 들어, Post 테이블의 create_at 컬럼에 인덱스를 추가하여, 최신 게시글을 빠르게 조회할 수 있도록 했다.

해시태크 고도화 작업

  • Jpa를 사용하면 쿼리 메소드를 실행시 터미널에 자동으로 JPQL 생성문이 찍힌다. 이를 사용하여 Jointable 애노테니션을 활용해 해시태그를 여러개 만들었다.
  • 해시태그 같은 경우에도 엔티티 필드에 게시글과 해시태그를 @joinColumn으로 각각 게시글과 해시태그의 PK를 참조하는 방식으로 관계를 맺어 설정 -> 연관관계 매핑

대댓글 작업

계층적 댓글 구조

  • JPA를 사용하고 댓글 엔티티를 구성할 때 부모 엔티티를 포함하여 N:1로 구성
  • 계층적 테이블 구조를 형성하고 부모 엔티티를 null로 설정 (댓글 리스트 조회시 부모 엔티티를 통해 해당 댓글 엔티티가 어디 그룹에 속한지 알게 된다.)

DB 마이그레이션

  • 빈번한 데이터 변경이 많은 환경에서는 PostgreSQL을 사용하는게 훨씬 좋은 선택
  • 또한 표준 SQL 문법을 더 많이 적용 및 지원한다.
  • JSON 타입을 제공하여 비정형 데이터도 관리할 수 있는 장점
  • 복잡한 쿼리 및 데이터 처리 작업을 효율적으로 수행 -> 대댓글과 해시태그 등을 통해 쿼리문이 복잡해졌기 때문에

4. 시도해보고 싶은 점(아쉬운 점)

다른 사람과 협업을 해볼 기회가 없었던 점

다른 사람과 함께 깃플로우를 이용하여 깃관리도 해보고 컨플릭션도 겪어보고 슬랙, 지라같은 협업툴도 써보고 싶었으나, 해당 프로젝트를 진행하며 그럴 기회가 없었던 점이 아쉽게 남았다.
혼자서 상황을 가정해보고 시뮬레이션을 진행해보는 것은 아무래도 한계점이 크고 문제를 해결한다는 느낌이 들지 않았고 서로의 코드를 리뷰하고 서로간의 더 좋은 코드를 위해 아이디어를 개선해보지 못한 것등도 아쉽게 남았다.

배포

프로젝트 완성 후 배포를 해보는 것이다. 개발하는 과정도 중요하지만 실제 사용자가 이용할 수 있도록 배포하는 것도 중요하고 그 과정에서 많은 문제들도 발견할 수 있다.
그렇기 때문에 AWS와 같은 개발 환경을 공부하여 배포를 해보도록 하겠다.

profile
inkwon Hwang

0개의 댓글