개인 프로젝트 (SNS 프로젝트)

Sol's·2023년 1월 1일

프로젝트

목록 보기
1/16

SNS 프로젝트를 진행하면서 해결 과정과 오류들을 기록하기로 하였다.

해당 프로젝트는 아래와 같은 목표를 갖고 있다.

  • 로그인, 글쓰기, 수정, 삭제, 피드기능(페이징), 댓글, 좋아요, 알림 기능을 개발해보며 복습과 응용.
  • 나의 개발 스타일 만들기
  • 전체적으로 통일감 있는 코드를 작성하기
  • 주어진 제약사항 내에서 기술을 사용하는 이유에 대해 이해하고 최선의 선택하기.
  • 유지보수와 작업효율을 고려하여 아키텍쳐 설계 및 라이브러리 선택을 진행.

개발환경


  • 에디터 : Intellij Ultimate
  • 개발 툴 : SpringBoot 2.7.5
  • 자바 : JAVA 11
  • 빌드 : Gradle 6.8
  • 서버 : AWS EC2
  • 배포 : Docker
  • 데이터베이스 : MySql 8.0
  • 필수 라이브러리 : SpringBoot Web, MySQL, Spring Data JPA, Lombok, Spring Security

멋사스네스(MutsaSNS) 서비스 소개


 회원 인증·인가

  • 모든 회원은 회원가입을 통해 회원이 됩니다.
  • 로그인을 하지 않으면 SNS 기능 중 피드를 보는 기능만 가능합니다.
  • 로그인한 회원은 글쓰기, 수정, 댓글, 좋아요, 알림 기능이 가능합니다.

 글쓰기

  • 포스트를 쓰려면 회원가입 후 로그인(Token받기)을 해야 합니다.
  • 포스트의 길이는 총 300자 이상을 넘을 수 없습니다.
  • 포스트의 한 페이지는 20개씩 보이고 총 몇 개의 페이지인지 표시가 됩니다.
  • 로그인 하지 않아도 글 목록을 조회 할 수 있습니다.
  • 수정 기능은 글을 쓴 회원만이 권한을 가집니다.
  • 포스트의 삭제 기능은 글을 쓴 회원만이 권한을 가집니다.

 피드

  • 로그인 한 회원은 자신이 작성한 글 목록을 볼 수 있습니다.

댓글

  • 댓글은 회원만이 권한을 가집니다.
  • 글의 길이는 총 100자 이상을 넘을 수 없습니다.
  • 회원은 다수의 댓글을 달 수 있습니다.

좋아요

  • 좋아요는 회원만 권한을 가집니다.
  • 좋아요 기능은 취소가 가능합니다.

알림

  • 알림은 회원이 자신이 쓴 글에 대해 다른회원의 댓글을 올리거나 좋아요시 받는 기능입니다.
  • 알림 목록에서 자신이 쓴 글에 달린 댓글과 좋아요를 확인할 수 있습니다.

Architecture(아키텍처)

  • 각 단에 데이터를 전달 받을시 DTO 형태로 전달합니다.

ERD

  • ERD는 최종버전이 아님.

Error Code

  • 에러발생시 반환되는 Http 상태코드이다.
	@AllArgsConstructor
@Getter
public enum ErrorCode {
    DUPLICATED_USER_NAME(HttpStatus.CONFLICT, "UserName이 중복됩니다."),
    USERNAME_NOT_FOUND(HttpStatus.NOT_FOUND,"UserName Not founded"),
    INVALID_PASSWORD(HttpStatus.UNAUTHORIZED, "패스워드가 잘못되었습니다."),
    INVALID_PERMISSION(HttpStatus.UNAUTHORIZED, "사용자가 권한이 없습니다."),
    POST_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 포스트가 없습니다."),
    COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 댓글이 없습니다."),
    DATABASE_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "DB에러"),
    // ADMIN 회원이 일반회원 업로드 하기위해 id로 조회
    ID_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 ID가 없습니다."),
    ID_NOT_MATCH(HttpStatus.NOT_FOUND, "ID가 서로 일치하지 않습니다."),
    // Filter에서 Admin회원 아닐때 접근하기 위함
    FORBIDDEN_REQUEST(HttpStatus.FORBIDDEN, "ADMIN 회원만 접근할 수 있습니다."),
    EXPIRED_TOKEN(HttpStatus.UNAUTHORIZED, "만료된 토큰입니다."),
    INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "잘못된 토큰입니다."),

    TOKEN_NOT_FOUND(HttpStatus.UNAUTHORIZED, "토큰이 존재하지 않습니다."),

    ;


    private HttpStatus httpStatus;
    private String message;
}

반환 타입

  • Response
@AllArgsConstructor
@Getter
public class Response<T> {
    private String resultCode;
    private T result;

    //에러 리턴
    public static Response<ErrorResponse> error(ErrorResponse errorResponse) {
        return new Response("ERROR", errorResponse);
    }
    // 성공 리턴
    public static <T> Response<T> success(T result) {
        return new Response("SUCCESS", result);
    }
}
  • ErrorResponse
@AllArgsConstructor
@Getter
public class ErrorResponse {
    private String errorCode;
    private String message;
}
  • AppException
@AllArgsConstructor
@Getter
public class AppException extends RuntimeException{
    private ErrorCode errorCode;
    private String message;
}
  • ExceptionManager
@RestControllerAdvice
public class ExceptionManager {
    @ExceptionHandler(AppException.class)
    public ResponseEntity<Response> AppExceptionHandler(AppException e) {
        return ResponseEntity.status(e.getErrorCode().getHttpStatus()).
                body(Response.error(new ErrorResponse(e.getErrorCode().name(), e.getMessage())));
    }
}
profile
배우고, 생각하고, 행동해라

0개의 댓글