Don't give up!

[개인 프로젝트] 커뮤니티 게시판 구현 프로젝트 회고 본문

Spring Boot

[개인 프로젝트] 커뮤니티 게시판 구현 프로젝트 회고

Heang Lee 2021. 7. 9. 20:01

언제 진행했는가

이 글은 2021/06/19~2021/07/08 약 3주간 진행한 개인 프로젝트에 대한 회고입니다.

커뮤니티 게시판을 구현하였으며 아래의 Github 링크를 통해서 코드를 볼 수 있습니다.

niveus323/web-community-server: SpringBoot 게시판 미니프로젝트 (github.com)

 

niveus323/web-community-server

SpringBoot 게시판 미니프로젝트. Contribute to niveus323/web-community-server development by creating an account on GitHub.

github.com

왜 시작했는가

자바의 정석을 읽고 난 후 다음 목표는 Spring Boot를 공부하는 것이었습니다.

Spring Boot 에 대해 공부하고자 서점에서 '처음 배우는 스프링 부트 2'책을 구매하였고, 이를 읽으면서 프로젝트를 진행했습니다.

알라딘: 처음 배우는 스프링 부트 2 (aladin.co.kr)

 

처음 배우는 스프링 부트 2

구현 순서에 맞춰 프로젝트를 진행하며 배우는 실전 입문서. 스프링 부트 입문자의 눈높이에 맞춰 스프링 부트 환경 설정부터 커뮤니티 게시판 구현까지를 다룬다. 스프링 부트의 기본 개념과

www.aladin.co.kr

사용한 기술

프로젝트에 적용된 기술은 다음과 같습니다.

  • Spring Boot (SDK 11)
  • Spring Security
  • Spring Data Rest
  • Spring Data JPA
  • OAuth2
  • H2, Mysql
  • Thymeleaf
  • Bootstrap (v.3.3.7)
  • Websocket

무엇을 개발했는가

책의 자료들을 활용하여 개발하였기 때문에 웹 디자인, 게시판 CRUD 기능, 로그인 API 처리는 책의 자료와 비슷하게 구현되어 있습니다.

그러나 이에 그치지 않고 다음의 기능들이 필요하다고 생각하여 추가적으로 구현하였습니다.

  • 게시글 분류에 따른 우선도를 적용한 리스트 Read 기능
  • Mysql Regexp를 사용한 게시글 검색 기능
  • 댓글 CRUD를 수행하도록 REST API 구성
  • 다른 사용자의 댓글 추가 시 해당 게시글을 보는 사용자에게 실시간 알림 기능
  • 게시글 추천 기능 및 실시간 추천 수를 보여주는 View 구성
  • JPA 페이징을 활용하여 구현된 댓글 더보기 기능

결과 화면

직접 구현한 기능들에 대한 설명입니다.

1. 메인화면(게시글 리스트)

JPA Pagination을 적용하여 10개 단위로 게시글을 화면에 출력합니다. 게시글의 리스트는 공지사항을 우선적으로 출력하며, 조회수, 제목, 작성자, 작성 시간을 리스트에 출력합니다.

2. 게시글 화면

게시글과 게시글에 달린 댓글을 페이지에서 확인할 수 있으며 글쓴이의 댓글, 수정된 댓글을 View에 나타낼 수 있도록 하였습니다. 

3. 게시글 추천

추천 버튼을 통해 게시글을 추천할 수 있으며 Websocket을 통해 같은 게시글을 보고 있는 다른 사용자에게 실시간으로 추천 수가 갱신되도록 하였습니다.

4. 댓글 더보기

댓글 또한 JPA Pagination으로 10개 단위로 출력합니다. 게시글에 담긴 댓글이 10개를 초과하면 '이전 댓글 더보기' 버튼이 추가되며 클릭시 10개 단위로 댓글을 불러와 View에 추가합니다.

5. 댓글 추가 알림

댓글이 추가된 게시글을 보고 있는 사용자는 Websocket으로 댓글 추가 알림을 받아 View에 버튼을 생성합니다.

사용자는 버튼을 눌러 새로운 댓글을 확인할 수 있습니다.

6. 게시글 검색

제목과 내용을 키워드로 찾아내는 게시글 검색입니다.

게시글 검색 기능은 띄어쓰기를 포함한 검색이 아닌 띄어쓰기로 단어를 분류하여 검색하도록 하였습니다.

'A B'으로 검색하였을 때 결과는 A와 띄어쓰기 그리고 B를 포함하는 것이 아닌 (?=.*<문자>)의 정규표현식으로 A와 B라는 단어를 모두 포함하는 검색 결과를 얻을 수 있습니다.

JPA의 Native Query 기능을 사용하였으며 Mysql의 regexp를 활용하였습니다.

프로젝트를 마무리하며

책을 따라하는데 그치지 않았다.

EntityGraph, nativeQuery, Projection을 직접 적용하여 쿼리문을 최적화하였다.

책을 따라하는데 그치지 않고 추가할 기능들을 생각해내고, 구현에 성공했다는 점에서 프로젝트가 의미있었다고 생각합니다.

새로운 기능을 구현하거나 기존의 코드가 갖는 문제들을 해결하면서 코드의 원리를 이해할 수 있었으며 자신감을 갖게 되었습니다. 

시간이 오래 걸렸다.

프로젝트 완성까지 3주 걸렸다는 점은 아쉬운 점입니다. 책의 자료들을 활용하면서 시간을 단축하고자 하였음에도 불구하고 버려지는 시간이 많았던 것 같습니다.

테스트 코드를 적지 않았다.

테스트 코드를 작성하지 않았다는 점은 제일 크게 반성해야할 부분입니다. 테스트 코드를 적는 것까지가 좋은 코드의 완성임에도 불구하고 기능을 작성하고 바로 런타임에서 실행하였습니다.

다음 프로젝트부터는 테스트 코드를 우선적으로 작성하는 테스트 주도 개발(TDD)를 확실하게 해야겠습니다.

'Spring Boot' 카테고리의 다른 글

[SpringBoot] Spring과 AOP  (0) 2021.08.13
[Spring Boot] Bean 등록  (0) 2021.08.04
[Spring Boot] SpringApplication의 실행과정  (0) 2021.08.02