[Spring] 프로젝트 준비
서론
최근에 인프런 강의를 듣거나 책을 읽으며 공부를 하는 중이었는데, 아무래도 이론만 배우다보니 숙달하고 적용하기가 어려울 뿐더러 직접적인 개발 실력이 오르지 않는 느낌이 들었다. 그래서 프로젝트를 하나 진행하며, 그 진행 상황을 블로그에 공유해보려 한다.
프로젝트 내용은 내가 작년에 단장을 맡았던 동아리 자몽의 봉사 신청관리 웹페이지를 만들어 보는 것이다. 이 프로젝트를 선정한 이유는 우선 내가 가장 원했던 프로젝트의 조건은 사용자가 있을 것 이었는데, 기존에 사용하던 방식보다 편리하게 만들기만 하면 따로 사용자 모집이 필요없이 100명 가량의 접속자가 생긴다는 것이 첫 번째 이유였고, 단장을 할 때도 봉사 신청을 받고 이것을 관리하는 것이 매우 번거롭고 귀찮았어서 이 과정을 웹페이지로 만들어서 봉사 등록과 신청을 받고 알림까지 하게 하면 후임 단장들한테도 도움이 될 것 같아 이 아이디어로 프로젝트를 제작해보기로 했다.
기능 사항
만들고자 하는 기능은 추후에 변경될 수도 있겠지만 지금 계획중인 것들은 다음과 같다.
- 봉사 관리
- 봉사를 등록하는 기능
- 봉사 내용, 장소, 일시, 인원등을 포함하여 게시글로 등록
- 봉사 등록 시, 전원에게 봉사 등록 알림 메일 or 카톡 발송
- 봉사 인원이 제한이 있어서 선착순 등록이 필요하다면, 봉사 기획자가 설정한 신청 가능 시간에만 신청가능
- 봉사 삭제 기능
- 봉사 등록자만 삭제 가능
- 봉사 완료기능
- 봉사 등록자만 완료 처리 가능
- 완료된 봉사는 완료된 봉사 탭에서 조회 가능
- 봉사를 신청하는 기능
- 봉사를 신청하게 되면 확정 알림 메일 or 카톡이 발송
- 선착순 봉사에 대기순위로 등록되었다면, 대기 순위 알림 메일 or 카톡 발송
- 선착순 봉사에 결원 발생 시 자동으로 대기자 우선순위 순서대로 메일 or 카톡 발송
- 봉사를 취소하는 기능
- 신청 사유 제출과 함께 봉사를 취소 가능
- 봉사를 등록하는 기능
- 회원 관리
- 회원 등급 기능 (게스트, 신입, 운영진, OB)
- 게스트
- 신청서 작성이나 게시물 열람만 가능
- 신입
- 봉사 신청, 등록, 취소 가능
- 운영진
- 봉사 신청, 등록, 취소 가능
- 멤버 등급 조정 기능
- 자신이 작성한 게시물 외에도 삭제 가능
- 게스트
- 회원 등급 기능 (게스트, 신입, 운영진, OB)
- 신입 모집
- 날짜를 설정 후 모집기능을 활성화 하면 해당 탭에서 지원서를 작성 가능
- 운영진들은 해당 지원서들을 웹에서 열람 가능
- 합격인원에 대해서 자동 메일 발송
패키지 구조
크게 패키지 구조는 도메인형 패키지 구조와 레이어형 패키지 구조로 나눌 수 있다.
도메인형 패키지 구조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
com
ㄴ dsm
ㄴ clematis
ㄴ domain
| ㄴ account
| | ㄴ controller
| | | ㄴ request
| | | ㄴ response
| | ㄴ service
| | | ㄴ provider
| | ㄴ repository
| ㄴ project
| | ㄴ controller
| | | ㄴ request
| | | ㄴ response
| | ㄴ service
| | | ㄴ provider
| | ㄴ repository
ㄴ Application
위처럼 도메인형 구조는 해당 도메인별로 패키지를 중심으로 구성하여, 계정에 관한 컨트롤러와 서비스등이 모두 account에 모여있는 구조이다.
레이어형 패키지 구조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
com
ㄴ example
ㄴ jamong
ㄴ configuration
ㄴ controller
| ㄴ request
| ㄴ response
| ㄴ filter
ㄴ domain
ㄴ exception
| ㄴ entrypoint
| ㄴ handler
ㄴ repository
ㄴ service
| ㄴ attribute
| ㄴ provider
ㄴ Application
레이어형 패키지 구조는 레이어를 중심으로 패키지를 구성하는 것으로, controller는 controller끼리, service는 service끼리 모아 놓는 식으로 패키지를 구성한다.
이 둘은 각각의 장단점이 있는데, 사실 기존에 책이나 강의에서 기본적으로 레이어형 패키지 구조를 사용해서 나도 자연스럽게 레이어형으로 패키지 구조를 설계하곤 했었는데, 쓸 때 마다 도메인형 구조가 더 효율적으로 느껴지는 상황이 자주 나왔었다.
아무래도 레이어형 구조는 도메인형에 비해 비직관적인 부분이 있어서, 내가 해당 기능에 맞는 부분을 찾을때 직관적으로 느껴지지 않아서 조금 불편했다. 예를들어 회원에 대한 기능을 찾으려면 도메인형 패키지 구조에서는 해당 도메인 폴더로 가서 기능을 수정하면 되는데, 레이어형 패키지 구조에서는 controller나 service 폴더로 가서 내가 수정하려하는 도메인에 해당하는 클래스를 찾기 번거로운 부분이 있었다.
그리고 요즘은 마이크로서비스아키텍쳐가 대세기 때문에 대부분의 기업에서도 도메인으로 구분하는 경우가 늘었다고 해서, 이번 프로젝트는 도메인형 패키지 구조를 선택해서 진행해보기로 했다.
자바 8 & 자바 11
지금까지는 그냥 책에서 자바 8쓰면 자바 8 쓰고, 자바 11쓰면 자바 11쓰곤 했는데, 막상 프로젝트에서 사용하려니까 조금 고민이 되서 정보를 조금 찾아봤다.
11에서 변경된 점들이 따로 게시물 하나로 다룰만큼의 양이라서, 굳이 모든 변경사항을 쓰지 않고, 내가 체감할만한 변경점을 정리해보았다.
Java 8 | Java 11 |
---|---|
String 문자열 관련 메소드가 적음 | isBlank(), line(), repeat(n), stripLeading(), stripTrailing(), strip()와 같은 새로운 String 문자열 방법이 도입됨 |
람다식에 특수 변수 사용 불가 | 람다식에 var 변수 사용가능 |
로컬 파일에 접근하여 작업 수행 불가 | writeString(), readString(), isSamFile()과 같은 다양한 메소드로 파일에 접근하여 작업 수행 가능 |
Parallel GC | G1 GC |
사실 자바 8에서 이미 자바에서 사용가능한 stream이라던가 람다식, Optional등의 주요 편의기능이 추가된 상태이기 때문에, 11에서의 변경점이 크지 않았다.
그래서 자바 8을 그냥 사용하려다가도, 자바 11의 GC가 개선되어 좀 더 성능이 좋다고 하여 조금 고민이 되었다.
하지만 결국 자바 8로 선택했는데, 이유는 다음과 같다.
- 외부 라이브러리나 프레임워크들과의 연동성
프로젝트를 진행하다보면 자바 어플리케이션만을 사용하는게 아니라 여러가지 다른 외부 툴들을 사용해야한는데, 아무래도 자바 8이 나온지도 오래되었고, 자바 11에서는 요금 정책변경으로 인해서 Open JDK를 사용할때만 무료로 사용가능 하기 때문에 툴과의 연동성에서 생기는 이슈들이 종종 있다고 한다.
- 변경사항이 크게 메리트가 없음
아까 언급했다 싶이 개발의 효용성을 가시적으로 높여줄만한 메서드가 추가된 것도 아니고, 성능 문제도 사실 내가 만드는 프로젝트가 성능에 민감한 프로젝트가 아니다보니, 오히려 연동성도 좋은 자바 8을 사용하는게 더 맞다고 생각했다.
- 버젼 변경이 크게 어렵지 않음
자바 8 -> 자바 11로 프로젝트의 자바 버젼을 변경하는게 크게 어렵지 않아서, 사용하다가 자바 11로 변경해야하는 상황이 생기면 그때 변경하는게 낫다는 생각이 들었다.
마무리하며…
이번 프로젝트는 구현을 빨리하는것보다 하나하나 고민하고 기록해가면서 진행해 볼 생각이다. 최대한 실제 서비스를 제작한다는 생각으로 꼼꼼한 커밋과 테스트 코드 작성을 하며 실력을 더 키울 수 있는 기회가 되었으면 좋겠다.
댓글남기기