간단한 커뮤니티를 제작하며 TDD 학습을 위한 레포지토리.
- Java 11
- SpringBoot
- Jpa
- QueryDSL
- H2
브랜치 관리 전략
많은 깃 브랜치 관리 전략 중 하나인 git-flow 를 도입하여 개발을 진행합니다.
코드 리뷰 기반 개발
하나의 기능은 하나의 pull_request 를 생성합니다.
해당 pull_request 에 대하여 다른 개발자가 리뷰를 하여 병합하는 습관을 연습합니다.
페어 프로그래밍
code with me 를 활용하여 어렵거나 힘든 기능을 의견을 주고 받으며 페어 프로그래밍을 진행합니다.
- 회원 가입
- POST /members MemberController#signUp(@RequestBody MemberSignUpDTO)
- 회원정보 수정
- PUT /members MemberController#updateMember(@RequestBody MemberInfoUpdateDTO)
- 비밀번호 수정
- PATCH /members MemberController#updatePassword(@RequestBody MemberChangePasswordDTO)
- 회원탈퇴
- DELETE /members MemberController#quitMember()
- 조회
- GET /members MemberController#fetchMember()
- 로그인
- POST /members/sign-in MemberController#signIn()
- 회원 아이디 찾기
- GET /members/find-id MemberController#findId()
- 비밀번호 찾기
- GET /members/find-pw MemberController#findPw()
- 쓰기
- POST /posts PostController#posts(@Valid @RequestBody PostSaveRequestDTO)
- 수정
- PATCH /posts PostController#updatePosts(@Valid @RequestBody PostUpdateRequestDTO)
- 삭제
- DELETE /posts/{id}/{postId} PostController#deletePost(@Valid @RequestBody PostDeleteRequestDTO)
- 조회(제목조회(페이징목록), 개별게시글조회)
- 개별게시글조회
- GET /posts/{id} PostController#posts/{id}(@PathVariable Long id)
- 제목조회(페이징목록)
- GET /posts/page={number} PostController#posts(@PathVariable Long page)
- 개별게시글조회
"*" : 변경이 필요한 요구사항입니다.
- 닉네임, 비밀번호, 비밀번호 확인을 입력하기 #validateSignUpParam
- 닉네임 검증: #validateNickname(String username)
- 최소 3자 이상
- 알파벳 대소문자(a
z, AZ) - 숫자(0~9)로 구성하기
- 비밀번호 규칙검증: #validatePassword(String password)
- 최소 8자 이상
- 대문자 하나이상 포함
- 특수문자 하나이상 포함
- 숫자 하나이상 포함
- 닉네임 중복 체크 #checkDuplicatedNickname(String nickname)
- 로그인 검사 - JWT (필터)
- 토큰 디코딩(복호화) JwtUtil#decode(String token)
- 토큰 검증 JwtUtil#validateAccessToken(String token),
- 권한 설명 (일반유저, 관리자, 밴유저) (USER, ADMIN, BLOCK)
- 일반유저
- 회원 기본 기능(정보 수정, 개인정보 조회, 로그인, 회원 탈퇴)
- 게시물(작성, 수정, 삭제, 조회)
- 댓글 및 대댓글(작성, 수정, 삭제, 조회)
- 관리자 (일반유저가 할 수 있는 기능을 전부 수행 가능)
- 회원 관리(특정 회원 정보 조회, 회원 권한 수정)
- 게시판 관리
- 게시글 관리(특정 게시물 숨김/보임 처리)
- 댓글 및 대댓글 관리(특정 게시물 댓글 및 대댓글 작성 비활성화/활성화 처리)
- 밴유저
- 일반유저 및 관리자의 기능을 모두 사용할 수 없음
- 관리자에 의해서만 강등된 역할(Role)
- 일반유저
- 게시물 제목은 1글자 이상 30글자 이하 허용
- 30글자가 넘어가는 경우 "게시글 제목 길이가 초과되었습니다."(400 Bad Request, *-1) 메세지를 보내주기
- 게시물 내용은 1글자 이상 2000글자 이상 허용
- 게시판 내용이 비어있으면 "게시판 내용은 비어있을 수 없습니다."(400 Bad Request, *-2) 메시지를 보내주기
- 게시물 내용으로 작성될 수 있는 컨텐츠 타입은 이미지, 텍스트를 지원
- *(특정 주기)마다 자동 임시 저장 (프론트엔드 서버에서 제어)
- 게시판의 게시물 조회 순서는 시간 순서로 최근 작성된 것을 먼저 보여주기
- Block 처리된 게시물 제외
- 게시물 저장 기능 구현
- 게시물 본문 태그 함께 저장하기 (프론트엔드 서버에서 제어)
- 게시물 조회 기능 구현
- 수정/삭제 시도시 본인이 작성한 게시글인지 서버에서 검증로직 추가하기
- 본인이 작성하지 않은 게시글을 삭제 또는 수정 시도시 (403 FORBIDDEN, *-1) 메시지를 보내주기
-
하나의 클래스는 하나의 책임만 담당하게 만든다.
-
else 예약어를 사용하지 않는다.
-
한줄에 점 하나만 찍는다 ( 체이닝 )
-
최대한 단위를 쪼개어 메소드를 만든다.
-
최대한 Lambda Stream 을 이용하기
-
구분자는 탭(스페이스 4칸)을 사용한다.
-
예약어(if, switch, for, while 등) 작성 후 스페이스로 한 칸 띄운다. 괄호를 닫은 후 다시 스페이스를 한 칸 띄운다.
-
필드변수는 모두 메서드 바로 아래에 함께 작성하여 모아둔다.
- 필드 변수
- 생성자
- override 메소드
- public 메소드
- private 메소드
예시는 아래와 같다.
public class Main {
public static void main(String... args) {
int n = 0;
while (n-- > 0) {
log.info(n);
}
}
}
- 클래스 / 메서드 추가시마다 javadoc 작성.
- javadoc은 아래와 같은 포맷을 가진다.
/**
* 애플리케이션 실행시 진입 지점으로 사용되는 클래스
*
* @author 작업자1
* @author 작업자2
*
*/
public class Main {
/**
* 0부터 사용자 입력값(정수)까지 더하고 해당 결과값을 출력합니다.
*
* @param args 사용자 입력값 (문자열 배열)
* @author 작업자1
*/
public static void main(String... args) {
int result = sum(Integer.parseInt(args[1]));
System.out.println(result);
}
/**
* 0부터 n까지 더한 값을 반환합니다.
*
* @param n 사용자 입력값 (정수 변환)
* @return 0부터 n까지의 합산값
* @author 작업자1
*/
private static int sum(int n) {
int sum = 0;
while (n-- > 0) {
sum += n;
}
return sum;
}
}