[게시판] 게시글 작성

2023. 1. 25. 14:59프로젝트/라이프 챌린지

728x90
SMALL

본격적인 메인 엑티비티 기능을 만들기 이전에 간단한 게시판 기능 먼저 구현하도록 결정했다.

지금 만드려고 하는 게시판의 경우, 자신이 어떠한 활동을 하였고, 어떠한 보상을 받았는지 유저들 간에 소통을 함으로써 동기를 부여하기 위한 목적을 가지고 있다.

 


PostController

@Slf4j
@RequiredArgsConstructor
@RequestMapping("/lc")
@Controller
public class PostController {

    private final PostService postService;
    private final JwtTokenProvider jwtTokenProvider;

    // 게시글 작성
    @PostMapping("/post/write")
    public ResponseEntity<ResponseBody> postWrite(HttpServletRequest request, @RequestBody PostRequestDto postRequestDto){
        log.info("게시글 작성 - 제목 : {}, 내용 일부분 : {}", postRequestDto.getTitle(), postRequestDto.getContent().substring(0, postRequestDto.getContent().length()/2));

        return postService.postWrite(request, postRequestDto);
    }
}

게시글에 관련된 컨트롤러를 만들어준다.

  • 회원관리 기능과 마찬가지로 RequestMapping을 통해 공통적인 주소는 "/lc" 로 지정해주었다.
  • 게시글을 작성하는 것이니 PostMapping으로 method를 지정했다.
  • Service 단으로 넘길 데이터는 토큰이 담긴 Request, 게시글 작성 정보들이 담겨있는 PostRequestDto 이렇게 두 가지 이다.

 

 

PostService

@RequiredArgsConstructor
@Service
public class PostService {

    private final JwtTokenProvider jwtTokenProvider;
    private final JPAQueryFactory queryFactory;
    private final PostRepository postRepository;
    private final MemberLIkePostRepository memberLIkePostRepository;
    private final EntityManager entityManager;

    // 발급된 토큰 및 계정 유효성 검증
    private Member checkAuthentication(HttpServletRequest request) {

        // 리프레시 토큰 유효성 검사
        if (!jwtTokenProvider.validateToken(request.getHeader("Refresh-Token"))) {
            throw new RuntimeException("유효하지 않은 토큰입니다.");
        }

        // Authentication 유효성 검사
        if (jwtTokenProvider.getMemberFromAuthentication() == null) {
            throw new RuntimeException("존재하지 않는 계정입니다.");
        }

        Member member = jwtTokenProvider.getMemberFromAuthentication();

        return member;
    }


    // 게시글 작성
    public ResponseEntity<ResponseBody> postWrite(HttpServletRequest request, PostRequestDto postRequestDto) {

        // 게시글 작성 유저 정보 불러오기
        Member auth_member = checkAuthentication(request);

        // 게시글 작성 정보는 null일 수 없음.
        if (postRequestDto.getTitle() == null || postRequestDto.getContent() == null) {
            return new ResponseEntity<>(new ResponseBody(StatusCode.NOT_EXIST_POST_INFO.getStatusCode(), StatusCode.NOT_EXIST_POST_INFO.getStatus(), null), HttpStatus.BAD_REQUEST);
        }

        // 게시글 내용 정보들 build
        Post post = Post.builder()
                .title(postRequestDto.getTitle())
                .content(postRequestDto.getContent())
                .viewcnt(0)
                .likecnt(0)
                .member(auth_member)
                .build();

        // 게시글 저장
        postRepository.save(post);

        // 게시글 작성 시 원하는 정보들이 출력될 수 있도록 HashMap으로 형식을 잡아 출력
        HashMap<String, String> postInfoSet = new HashMap<>();

        postInfoSet.put("title", post.getTitle()); // 제목
        postInfoSet.put("content", post.getContent()); // 내용
        postInfoSet.put("viewcnt", post.getViewcnt().toString()); // 조회수
        postInfoSet.put("likecnt", post.getLikecnt().toString()); // 좋아요 수
        postInfoSet.put("nickname", post.getMember().getNickname()); // 게시글 작성자 닉네임
        postInfoSet.put("createdAt", post.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy.MM.dd hh:mm"))); // 게시글 작성일자
        postInfoSet.put("modifiedAt", post.getModifiedAt().format(DateTimeFormatter.ofPattern("yyyy.MM.dd hh:mm"))); // 게시글 수정일자

        return new ResponseEntity<>(new ResponseBody(StatusCode.OK.getStatusCode(), StatusCode.OK.getStatus(), postInfoSet), HttpStatus.OK);
    }

컨트롤러에서 넘어온 정보들을 가지고 게시판에 관련된 서비스 로직을 만들어줄 PostService 이다.

  • 게시글 작성에 앞서 checkAuthentication이라는 유저 검증 메소드를 따로 만들어주었다. 이제 토큰이 필요한 기능들은 해당 메소드를 호출하기만 하면 유효한 토큰이 포함 유저인지 확인 후 유효하다면 Member 객체를 반환받을 것이다.
  • 게시글 작성 메소드 부분에서 checkAuthentication을 통한 유효한 Member 객체를 부여받는다.
  • 게시글 작성 시에 제목과 내용이 공백일 수 없음을 확인시켜주는  에러 처리를 만들어준다.
  • 게시글 작성 정보가 명확히 기입이 되어있다면 Post 객체에 builder를 통해 해당 정보들을 넣어준다. viewcnt 와 likecnt 의 경우, 조회수와 좋아요수를 뜻하는 속성들이다. 초기에는 아무것도 없으므로 0으로 default 값을 지정해주어 저장한다.
  • JPA 의 save() 함수를 통해 게시글을 저장한다.
  • 저장된 Post 객체의 정보를 그대로 반환시키면 이슈가 되기 때문에 HashMap을 통해서 필요한 정보들을 넣고 반환해준다.

 

 

이제 포스트맨으로 확인해보자.

# access token, refresh token을 입력받아 호출한 게시글 작성 api

 

# PostRequestDto에 게시글 작성 정보를 입력하여 호출한 api

 

정상적으로 호출되어 작성한 게시글 정보들이 출력되는 것을 확인하였다.

728x90
반응형
LIST

'프로젝트 > 라이프 챌린지' 카테고리의 다른 글

[게시판] 게시글 삭제  (0) 2023.01.25
[게시판] 게시글 수정  (0) 2023.01.25
[회원관리] 회원탈퇴  (0) 2023.01.21
[회원관리] 로그아웃  (0) 2023.01.21
[회원관리] 로그인  (0) 2023.01.20