본문 바로가기

TIL

231206_TIL

오늘한일

  • 팀 과제 시작(백 오피스 프로그램 만들기)
  • 나는 댓글 구현을 맡았다.

CommentController

package com.example.backoffice.domain.comment.controller;

import com.example.backoffice.domain.comment.dto.CommentRequestDto;
import com.example.backoffice.domain.comment.dto.CommentResponseDto;
import com.example.backoffice.domain.comment.service.CommentService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api")
public class CommentController {

    private final CommentService commentService;

    // CommentController 생성자
    public CommentController(CommentService commentService) {
        this.commentService = commentService;
    }

    // 댓글 생성
    @PostMapping("/comments")
    public CommentResponseDto createComment(@RequestBody CommentRequestDto requestDto) {
        return commentService.createComment(requestDto);
    }

    // 모든 댓글 조회
    @GetMapping("/comments")
    public List<CommentResponseDto> getComments() {
        return commentService.getComments();
    }

    // 댓글 수정
    @PutMapping("/comments/{comment_id}")
    public Long updateComment(@PathVariable Long comment_id, @RequestBody CommentRequestDto requestDto) {
        return commentService.updateComment(comment_id, requestDto);
    }

    // 댓글 삭제
    @DeleteMapping("/comments/{comment_id}")
    public Long deleteComment(@PathVariable Long comment_id) {
        return commentService.deleteComment(comment_id);
    }
}

 

CommentRequestDto

package com.example.backoffice.domain.comment.dto;

import lombok.Getter;

@Getter
public class CommentRequestDto {
    private Long comment_like_count;  // 댓글 좋아요 수
    private String texts;              // 댓글 내용
}

 

 CommentResponseDto

package com.example.backoffice.domain.comment.dto;

import com.example.backoffice.domain.comment.entity.Comment;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
public class CommentResponseDto {
    private Long id;                     // 댓글 ID
    private Long comment_like_count;     // 댓글 좋아요 수
    private String contents;             // 댓글 내용
    private LocalDateTime createdAt;    // 댓글 생성일시
    private LocalDateTime modifiedAt;   // 댓글 수정일시

    // Comment 엔티티를 기반으로 하는 CommentResponseDto 생성자
    public CommentResponseDto(Comment comment) {
        this.id = comment.getComment_id();
        this.comment_like_count = comment.getCommentLikeCount();
        this.contents = comment.getTexts();
        this.createdAt = comment.getCreatedAt();
        this.modifiedAt = comment.getModifiedAt();
    }
}

 

Comment   (Entity) 

package com.example.backoffice.domain.comment.entity;

import com.example.backoffice.domain.comment.dto.CommentRequestDto;
import com.example.backoffice.domain.commentLike.entity.Likes;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Getter
@Setter
@Table(name = "comment") // 매핑할 테이블의 이름을 지정
@NoArgsConstructor
public class Comment extends Timestamped {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long comment_id;  // 댓글 식별자

    private Long commentLikeCount;  // 댓글 좋아요 수

    @Column(name = "texts", nullable = false, length = 500)
    private String texts;  // 댓글 내용

    @OneToMany(mappedBy = "comment", cascade = CascadeType.REMOVE)
    List<Likes> likesList = new ArrayList<>();  // 댓글에 연결된 좋아요 목록

    // 생성자: CommentRequestDto를 통해 댓글을 생성할 때 사용
    public Comment(CommentRequestDto requestDto) {
        this.commentLikeCount = 0L;
        this.texts = requestDto.getTexts();
    }

    // 댓글 내용을 갱신하는 메서드
    public void update(CommentRequestDto requestDto) {
        this.texts = requestDto.getTexts();
    }

    // 좋아요 갯수를 갱신하는 메서드
    public void updateLikeCount(Boolean updated) {
        if (updated) {
            this.commentLikeCount++;
            return;
        }
        this.commentLikeCount--;
    }
}

 

Timestamped

package com.example.backoffice.domain.comment.entity;




import jakarta.persistence.*;

import lombok.Getter;

import org.springframework.data.annotation.CreatedDate;

import org.springframework.data.annotation.LastModifiedDate;

import org.springframework.data.jpa.domain.support.AuditingEntityListener;




import java.time.LocalDateTime;




@Getter

@MappedSuperclass

@EntityListeners(AuditingEntityListener.class)

public abstract class Timestamped {




    @CreatedDate  // 생성일자를 나타내는 어노테이션

    @Column(updatable = false)  // 업데이트 시에는 변경되지 않도록 설정

    @Temporal(TemporalType.TIMESTAMP)  // 데이터베이스에 저장되는 시간 형식 설정

    private LocalDateTime createdAt;  // 생성일자




    @LastModifiedDate  // 최종 수정일자를 나타내는 어노테이션

    @Column  // 기본적으로는 업데이트 시에 변경됨

    @Temporal(TemporalType.TIMESTAMP)  // 데이터베이스에 저장되는 시간 형식 설정

    private LocalDateTime modifiedAt;  // 최종 수정일자

}

 

CommentRepository

package com.example.backoffice.domain.comment.repository;

import com.example.backoffice.domain.comment.entity.Comment;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface CommentRepository extends JpaRepository<Comment, Long> {

    // 댓글을 좋아요 수를 기준으로 내림차순으로 정렬하여 모든 댓글을 가져옵니다.

    List<Comment> findAllByOrderByCommentLikeCountDesc();
}

 

CommentService

package com.example.backoffice.domain.comment.service;

import com.example.backoffice.domain.comment.dto.CommentRequestDto;
import com.example.backoffice.domain.comment.dto.CommentResponseDto;
import com.example.backoffice.domain.comment.entity.Comment;
import com.example.backoffice.domain.comment.repository.CommentRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class CommentService {

    private final CommentRepository commentRepository;

    public CommentService(CommentRepository commentRepository) {
        this.commentRepository = commentRepository;
    }

    // 댓글 생성
    public CommentResponseDto createComment(CommentRequestDto requestDto) {
        // RequestDto -> Entity
        Comment comment = new Comment(requestDto);

        // DB 저장
        Comment save = commentRepository.save(comment);

        // Entity -> ResponseDto
        CommentResponseDto commentResponseDto = new CommentResponseDto(save);

        return commentResponseDto;
    }

    //모든 댓글 조회 서비스 (좋아요 수 기준 내림차순 정렬)
    public List<CommentResponseDto> getComments() {
        // DB 조회
        return commentRepository.findAllByOrderByCommentLikeCountDesc().stream()
                .map(CommentResponseDto::new)
                .toList();
    }

    //댓글 업데이트
    @Transactional
    public Long updateComment(Long comment_id, CommentRequestDto requestDto) {
        // 해당 댓글이 DB에 존재하는지 확인
        Comment comment = findComment(comment_id);

        // 댓글 내용 수정
        comment.update(requestDto);

        return comment_id;
    }

    // 댓글 삭제
    public Long deleteComment(Long comment_id) {
        // 해당 댓글이 DB에 존재하는지 확인
        Comment comment = findComment(comment_id);

        // 댓글 삭제
        commentRepository.delete(comment);

        return comment_id;
    }

    // 댓글 조회
    public Comment findComment(Long comment_id) {
        return commentRepository.findById(comment_id)
                .orElseThrow(() -> new IllegalArgumentException("선택한 댓글은 존재하지 않습니다."));
    }
}

 

느낀점

  • 열심히 해야겠다

'TIL' 카테고리의 다른 글

231211_TIL  (0) 2023.12.13
231208_TIL  (0) 2023.12.11
231130_TIL  (0) 2023.12.01
231129_TIL  (0) 2023.11.29
231128_TIL  (1) 2023.11.28