오늘한일
- 팀 과제 시작(백 오피스 프로그램 만들기)
- 나는 댓글 구현을 맡았다.
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 |