[TIL]22.01.06 5조 블로그 프로젝트 발표

hyewon jeong·2023년 1월 6일
0

TIL

목록 보기
63/138

오구오구조: Rule

  1. 정기 회의 시간: 매일 1회, 저녁 7시
  2. merge 하기 전 팀원 2명 이상에게 approve 받기
  3. Pull Request할 때, 슬랙으로 팀원들에게 공지해주기
  4. feature/1-작업명 간단하게 만들고 시작하기
    1 - 태이, 2 - 준혁, 3 - 혜원, 4 - 승엽, 5 - 학윤

Git branch

main - develop- feature

  1. 개인 작업은 꼭 feature 브랜치에서 하기
  2. 모든 작업 시작 전 develop에서 Pull을 받은 후 → feature 브랜치에서 작업 시작
  3. 개인 작업 마치면 feature브랜치로 pull request를 통해 develop에 머지하기
  4. 프로젝트 완료 후 main으로 머지하기
  • 작업 예시 )
  1. develop 브랜치에서 Pull 받는다.

    [명령어] git pull origin develop

    1. 디벨롭 브랜치에서 개인 작업 브랜치 만든다.

    [명령어] git checkout -b [브랜치 이름]

    • 브랜치 이름 예시 ) feature/작업이름 (feature/create-post-entity), (feature/delete-post-entity)
    1. 작업한다.

    2. 내 작업물 상태 확인해보기

    [명령어] git status

    1. 작업물 상태 확인되면 깃에 추가한다.

    [명령어] git add * (-> 전체 파일 추가) git

    [명령어] git add [파일명] (-> 파일 개별로 하나씩 추가)

    전체 추가일지 파일 개개별 추가는 자기 마음대로

    1. 깃 커밋한다.

    [명령어] git commit -m”커밋 메세지 (무슨 작업했는지 메세지 남김)”

    1. 푸쉬한다.

    [명령어] git push origin [브랜치이름]

    1. 깃헙 홈페이지로 와서 pull request 탭으로 온다. create Pull Request 눌러서 PR 생성

    2. 팀원 확인 완료 되면 머지 버튼 누르면됨

    3. 확인 완료 후 머지 되면 다시 디벨롭 브랜치로 간다.

    [명령어]  git checkout develop

    1. 다시 pull 받는다.

    [명령어]  git pull origin develop

    다시 첫번째 부터 시작

역할 분담

  • 크게 해야할일 → (인증/인가, 예외처리), User , Post, Comment, Like 기능 만들기
  • 인증인가/ 예외처리 → 태이(1)
  • Like → 준혁(2)
  • User → 혜원(3)
  • Post → 승엽(4)
  • Comment → 학윤(5)

개발해야 하는 기능들

  1. 회원 가입 API
  2. 로그인 API
  3. 전체 게시글 목록 조회 API
  4. 게시글 작성 API
  5. 선택한 게시글 조회 API
  6. 선택한 게시글 수정 API
  7. 선택한 게시글 삭제 API
  8. 댓글 작성 API
  9. 댓글 수정 API
  10. 댓글 삭제 API
  11. 예외 처리(AOP를 활용하여 구현 )
  12. Spring Security 적용하기
  13. 게시글 좋아요 API
  14. 댓글 좋아요 API

테이블 명세 - ERD

User
Id(PK) / username / password / email / userRole / createdAt / modifiedAt
Post
Id(PK) / USER_ID(FK) / title / contents / comments / createdAt / modifiedAt
Comment
Id(PK) / USER_ID(FK) / Post_id(FK) / contents / createdAt / modifiedAt
PostLike
Id(PK) / USER_ID(FK) / Post_id(FK) / createdAt / modifiedAt
CommentLike
Id(PK) / USER_ID(FK) / Comment_id(FK) / createdAt / modifiedAt

엔티티 명세

User
Id(PK) / username / password / email / userRole
Post
Id(PK) / username / password / email / userRole
Comment
Id(PK) / user / post / contents
PostLike
Id(PK) / USER_ID(FK) / Post_id(FK)
CommentLike
Id(PK) / USER_ID(FK) / Comment_id(FK)
Timestamped
createdAt / modifiedAt

개발 진행에 따른 기록

코드 스타일 규칙(01/02 )

1 . 메서드 간 엔터 한 줄
2 . 탭은 띄어쓰기 4칸이 한칸

추가사항(01/03)

💡
더 나아가기: 과제가 일찍 마무리 되었다면 아래의 내용도 진행해보세요.

  • 회원탈퇴(기능추가), 게시글 삭제, 댓글 삭제 시 연관된 데이터 모두 삭제될 수 있도록 구현해 보세요! - 완료
  • 대댓글 기능을 만들어 보세요! - 완료
  • 댓글 조회 시 대댓글도 함께 조회하기
  • 게시글과 댓글 조회할 때 페이징, 정렬 기능을 추가해 보세요! - 완료
  • 게시글 카테고리 만들어 보세요!
    게시글을 분류하는 카테고리를 만들어서 게시글을 작성할 때 카테고리 정보도 함께 저장하기
  • 카테고리 별로 게시글을 조회하는 기능 추가하기
  • AccessToken, RefreshToken에 대해 구글링해 보고 RefreshToken을 적용해 보세요! - 완료
  • 프로젝트에 swagger 를 구글링해 보고 적용해 보세요!
    swagger란? Open Api Specification(OAS)를 위한 프레임워크 입니다. API들이 가지고 있는 스펙(spec)을 명세, 관리할 수 있으며, 백엔드와 프론트엔드가 협업할 때 사용할 수 있습니다!

히스토리

01/03 포스트맨 에서 토큰 자동 생성하는 방법 알게 됨, 적용 및 다른 팀에 전파
01/04 각자 필수 요구사항과 추가적인 요구사항 코드 합치기
01/05 발표 자료 준비

🎈시연 영상
https://www.youtube.com/watch?v=KqO2IG3SAvs&feature=youtu.be

프로젝트 구조

코드설명

  • 태이
    문제 - 사용자가 없을 시 api 에 접근하면 UsernameNotFoundException에 의해 500에러가 남

    시도 - 해당 에러를 ControllerAdvice를 사용해 처리하려고 함

    결과 - 안됨
    찾아보니 UsernameNotFoundException은 시큐리티 계층에서 일어나는 에러이고, 시큐리티 레이어는 컨트롤러나 @ControllerAdvice 이전에 발생하기 때문에 @ControllerAdvice로 처리할 수 없다는 것이었다. 그래서 아래와 같이 해당 에러가 발생하는 부분에 try-catch 한 후 response에 json객체를 넣어 해결했다.
    시큐리티 부분은 컨트롤러 전에 동작한다는걸 이해하게 되었다.
@Slf4j
@RequiredArgsConstructor
public class JwtAuthFilter extends GenericFilter {

    private final JwtUtil jwtUtil;


    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            String token = jwtUtil.resolveToken((HttpServletRequest) request);

            if (token != null && jwtUtil.validateTokenExceptExpiration(token)) {
                Claims info = jwtUtil.getUserInfoFromToken(token);
                Authentication authentication = jwtUtil.createAuthentication(info.getSubject());
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }

            chain.doFilter(request, response);
        } catch (UsernameNotFoundException exception) {
						// 해결 부분
            HttpServletResponse realResponse = (HttpServletResponse) response;
            log.error("e = {}", exception.getMessage());
            realResponse.setContentType("application/json;charset=UTF-8");
            realResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);

            JSONObject responseJson = new JSONObject();

            responseJson.put("message", exception.getMessage());
            responseJson.put("code", 400);

            realResponse.getWriter().print(responseJson);
        }
    }
}
  • 준혁
@Transactional
    public MsgResponseDto savePostLike(Long postId, User user) {
        Post post = postRepository.findById(postId).orElseThrow(
                () -> new IllegalArgumentException("찾는 게시글이 없습니다.")
        );
        if (!checkPostLike(postId, user)) {
            postLikeRepository.saveAndFlush(new PostLike(post, user));
            return new MsgResponseDto("좋아요 완료", HttpStatus.OK.value());
        } else {
            postLikeRepository.deleteByPostIdAndUserId(postId, Long.valueOf(user.getId()));
            return new MsgResponseDto("좋아요 취소", HttpStatus.OK.value());
        }
    } 

등록된 유저가 게시글에 좋아요 완료 / 취소를 구현하는 코드입니다.
고른 이유는 등록된 유저가 좋아요 완료 / 취소가 되는 부분에서 saveAndFlush(완료)와deleteByPostIdAndUserId(취소)를 사용하면 실행이 되는 부분이 인상 깊어서 고르게 되었습니다.

  • 혜원
    User파트로 크게 어려웠던 부분이 없어서 가장 인상 깊은 코드를 가지고 왔습니다.

    태이님이 작성하신 코드 중에
    accessToken과 RefreshToken을 담는 TokenRequestDto 로 User를 찾는 부분입니다.
    RefreshToken에는 사용자 정보가 없지만 accessToken에 있는 사용자 정보를 사용하여 User를 가지고 오는 부분이 인상 깊었습니다.

  • 승엽
    대댓글 구현

    대댓글을 구현하기 위해 댓글 사이에서도 연관 관계가 필요하여 부모와 자식 관계로 설정하였습니다.

    문제: 대댓글이 부모 댓글 아래에만 나와야 하는데 중복되어 게시되는 문제 발생


    시도1: 대댓글의 경우 게시글과의 연관 관계를 끊어 부모 댓글과만 연관되도록 수정



    결과: 중복 조회 문제는 해결 but post를 null로 받는 것 때문에 부모 댓글과 자식 댓글이 동일한 게시글 아래 포함되어 있는지 확인하는 로직이 작동하지 않음

    시도2: 부모 자식의 게시글의 동일한 게시글로 묶여있는지 확인하기 위해 mainPostId라는 인스턴스를 부모 자식 댓글에 각각 추가


    결과: 대댓글에 post를 입력하지 않고도 부모 댓글과 자식 댓글이 동일한 게시글에 연관되어 있는지 확인이 가능



    위 방법이 정답이라고 할 수는 없지만 위 기능을 구현하는 과정을 통해서 연관 관계를 앞으로 어떻게 활용하면 좋을지에 대해서 생각해보고 익숙해질 수 있는 과정이었습니다. 다만 과제를 마치고 생각해보니 처음부터 댓글과 대댓글의 API를 분리하여 작성하면 더 객체지향적으로 좋았을 것 같습니다.

  • 학윤

    승엽님이 작성하신 코드 중 대댓글 기능을 구현한 코드를 선택하였습니다.
    여러 부분을 건드리지 않고 Service 부분과 다른 일부분을 수정 하여 대댓글을 구현한 코드라서 인상
    깊었습니다.

소감

  • 태이 : 사실 시큐리티에 대해 이해하지 못했지만 프로젝트를 위해 공부하며 조금 깨닫게 되었습니다. 어려운 부분이라도 공부하면 이해할 수 있다고 생각하게 되었습니다.

  • 혜원 : 시큐리티가 어려웠지만 몰입하고 싶은 매력적인 파트였고 , 같은 것을 공부 하면서 의견을 공유 하면서 성장할 수 있었던 시간이라 너무 좋았습니다.

  • 승엽 : 시간이 된다면 모든 코드를 스스로 다 짜보는 것이 가장 좋겠지만 정해진 기간 내에 제가 모르는 부분을 해결해주시고 설명해주신 팀원 분들께 진심으로 감사의 말씀을 전합니다.

  • 학윤 : 이해 하지 못 한 부분이 상당 수이지만, 많은 도움을 받아 해결할 수 있는 좋은 시간이었습니다.

  • 준혁 : 처음에는 프로젝트가 어렵게 느껴졌지만 좋은 팀원들을 만나서 쉽고 즐겁게 했습니다.

깃허브 ( 최종코드)

https://github.com/2h5i/blog-project.git

시연연상

https://www.youtube.com/watch?v=KqO2IG3SAvs

profile
개발자꿈나무

0개의 댓글