Thanks to visit codestin.com
Credit goes to github.com

Skip to content

hakie2kim/board

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

게시판

💬 소개

배포 경험을 위해 CRUD의 가장 기본적인 기능을 포함한 회원 가입, 로그인/로그아웃, 게시판, 댓글 기능을 구현한 웹 페이지

📚 기술 스택

  • 서버 사이드 렌더링: Tiles JSP
  • 벡엔드: Spring
  • 데이터베이스: MyBatis MySQL Docker
  • 배치: Maven
  • 클라우드: AWS - EC2, RDS
  • 서버: Ngnix
  • 기타 도구: MobaXterm FileZilla Sourcetree Github Notion

🔨 기능 요구사항

회원 가입

  • 회원 가입 시 제약 사항
    • 아이디는 공백 또는 빈 칸일 수 없고 4~20자의 영어 소문자, 숫자만 사용 가능
    • 이미 존재하는 아이디로는 가입 불가
    • 비밀번호는 8~16자의 영문 대/소문자, 숫자를 사용, 특수문자를 1개 이상 포함
    • 이름은 공백 또는 빈 칸일 수 없음
    • 이메일은 공백 또는 빈 칸일 수 없고 이메일 형식을 준수
  • 패스워드는 DB에 암호화 후 저장
  • 사용자 이메일 유효 여부 인증
    • 인증 링크를 포함한 이메일 전송
    • 사용자가 인증 링크를 클릭한 후 인증 여부를 DB에 반영
    • 만료된 인증 링크로 접속 시 이메일 재전송

로그인, 로그아웃

  • 로그인
  • 다음 기능들은 로그인 후에만 가능하도록 제한
    • 공지사항 작성 페이지 접근
    • 공지사항 수정 페이지 접근
    • 댓글 달기
    • 좋아요/싫어요
    • 로그인이 필요한 기능 접근 제한 후 로그인에 성공한 경우 이전 요청으로 리다이렉트
  • 이메일 유효 여부 인증이 완료된 사용자만 로그인 가능
  • 로그인 페이지의 Remeber Me 체크 시 일주일 동안 아이디 기억
  • 로그아웃

게시판

게시글 목록

  • 페이지네이션 (Pagination)
    • 1 페이지와 마지막 페이지에는 각각 이전, 다음 화살표를 보여주지 않음
    • 한 페이지 당 출력할 게시글: 10개
    • 네비게이션 바 - 한 페이지 당 출력할 페이지 번호: 10개

게시글 작성

  • 제약 사항
    • 제목은 공백 또는 빈 칸일 수 없고 5~50자 사이
    • 내용은 공백 또는 빈 칸일 수 없고 5~1000자 사이
    • 파일당 10MB까지 첨부 가능

RestController 구성 및 요청

Servlet 구성 및 요청

예외 처리

기타

🚨 트러블 슈팅

  • member_auth 테이블의 expire_dtm 컬럼을 INT로 변경한 후, 회원 가입 시 "Data truncation: Incorrect datetime value" 오류 발생
  • expire_dtm 컬럼의 데이터 타입을 더 큰 범위를 담을 수 있는 BIGINT로 변경하여 오류 해결
  • /auth/joinPage.do 요청 시 "Neither BindingResult nor plain target object for bean name 'joinForm' available as request attribute" 오류 발생
  • JoinControllerjoinPage 메소드에 joinForm 객체를 Model에 추가하여 해결
  • /auth/emailAuth.do 요청 시 "Required request parameter 'uri' for method parameter type String is not present" 오류 발생
  • @RequestParamdefaultValue=""를 설정하여 uri 값이 null인 경우를 방지
  • 로그인 페이지에서 아이디 또는 패스워드만 입력 시, 각각의 필드에 "공백일 수 없습니다" 메시지와 "아이디 또는 비밀번호가 맞지 않습니다" 메시지가 동시에 보임
  • bindingResult에 에러가 있는 경우 로그인 페이지를 다시 보여주는 부분의 위치를 로그인 폼 입력 검증 후로 이동하여 해결
  • 회원가입하지 않은 아이디로 로그인 시도 시, EmptyResultDataAccessException 예외 발생
  • MemberController에서 EmptyResultDataAccessExceptioncatch하여 "존재하지 않는 아이디입니다." 메시지를 설정하고 로그인 페이지를 다시 보여줌
  • 로그인을 하지 않은 상태에서 로그인 후에만 접근 가능한 기능에 접근 시, "응답이 이미 커밋된 후에는, sendRedirect()를 호출할 수 없습니다" 오류 발생
  • LoginFilter에서 sendRedirect()return;을 추가하여 리다이렉트 후 추가 작업이 진행되지 않도록 수정
  • /forum//notice/listPage.do?page=1&size=10 요청 시, query string 값이 없을 경우 "Cannot parse null string" 오류 발생
  • @RequestParamdefaultValue를 설정하여 pagesize 값이 없을 때 기본값을 가지도록 설정하여 해결
  • ${pagination.postsPerPage}를 호출할 때, Pagination 클래스에 해당 필드에 대한 getter 메서드가 없어서 발생한 예외
  • Pagination 클래스에 getPostsPerPage() 메서드를 추가하여 문제 해결
  • list.jsp에서 pagination.isPrevpagination.isNext를 호출할 때, Pagination 클래스에 해당 필드에 대한 getter가 없어서 발생한 예외
  • Lombok@Getterboolean 타입 필드의 접근자를 is[필드명]으로 생성하는데, 이를 위해 isPrevisNext를 각각 prevnext로 필드 이름을 변경하여 문제를 해결
  • 공지사항 게시글 작성 시, @NotBlank 애너테이션을 boardTypeSeq 필드에 적용했으나, 이는 Integer 타입에서는 사용할 수 없어서 발생한 오류
  • boardTypeSeq 필드의 검증 애너테이션을 @NotNull로 변경하여 문제를 해결

📝 메모

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published