SpringBoot 프로젝트

Spring Boot - 리뷰 CRUD기능 구현하기 (1)

orin602 2024. 11. 18. 13:30

1. Review 클래스 생성

package com.demo.domain;

import java.util.Date;
import java.util.List;

import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;

import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@DynamicInsert
@DynamicUpdate
public class Review {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "reviewseq")
	@SequenceGenerator(name = "reviewseq", sequenceName = "reviewseq", allocationSize = 1)
	private int review_seq;

	private String title;
	private String content;
	private int viewCount; // 조회수
	private int recoCount; // 추천수
	private int checkCount; // 즐겨찾기수

	// 이미지 URL을 저장하기 위한 필드
	private String coverImageUrl;

	// 추가된 필드: 이미지 업로드를 위한 필드
	// 여러 이미지를 업로드할 수 있도록 List<String> 형태로 정의
	@ElementCollection
	private List<String> uploadedImages;

	@ManyToOne
	@JoinColumn(name = "id")
	private Member member; // member테이블 조회

	@Temporal(value = TemporalType.TIMESTAMP)
	@ColumnDefault("sysdate")
	private Date review_date; // 게시글작성 시간 저장(sysdate)
}

 

  • @Entity : 해당 클래스가 JPA 엔티티임을 나타냄 (용도: Review 클래스가 데이터베이스 테이블과 매핑되어 데이터를 처리하도록 설정)
  • @Getter & @Setter : Lombok 라이브러리에서 제공하는 애노테이션으로 자동으로 getter와 setter 메서드를 생성 (용도: 필드 접근을 위한 메서드를 자동으로 생성해 코드 간결화)
  • @ToString : Lombok의 애노테이션으로, toString() 메서드를 자동으로 생성 (용도: 객체를 문자열로 출력할 때 필드를 자동으로 문자열로 변환해 출력)
  • @Builder : Lombok 애노테이션으로, 빌더 패턴을 적용할 수 있게 해줌 (용도: 객체 생성 시 필드 값 설정을 체이닝 방식으로 간편하게 처리)
  • @NoArgsConstructor & @AllArgsConstructor : Lombok 애노테이션으로 기본 생성자와 모든 필드를 초기화하는 생성자를 자동으로 생성 (용도: 객체 생성 시 필요한 생성자들을 자동으로 생성)
  • @DynamicInsert & @DynamicUpdate : Hibernate 애노테이션으로 동적 SQL 삽입 및 갱신을 활성화 (용도: 불필요한 SQL 쿼리 수행을 방지하고 성능을 최적화)
  • @Id : JPA에서 엔티티의 기본 키를 지정하는 애노테이션 (용도: review_seq 필드를 Review 엔티티의 기본 키로 설정)
  • @GeneratedValue : 기본 키의 생성 전략을 설정하는 애노테이션 (용도: GenerationType.SEQUENCE를 사용하여 시퀀스를 기반으로 기본 키 값을 자동 생성)
  • @SequenceGenerator : 시퀀스를 사용해 기본 키 값을 생성할 때 사용하는 애노테이션 (용도: reviewseq 시퀀스를 사용하여 기본 키 값을 생성)
  • @ManyToOne : Review 엔티티와 Member 엔티티 간의 다대일 관계를 정의하는 애노테이션 (용도: 여러 리뷰가 하나의 회원에 속하는 구조로 Member를 참조)
  • @JoinColumn : 두 테이블 간의 조인을 정의하는 애노테이션으로, 외래 키를 설정 (용도: Review 테이블에서 Member 테이블을 참조하기 위한 외래 키 설정)
  • @Temporal : 날짜와 시간 관련 필드에 사용되는 애노테이션으로, TemporalType.TIMESTAMP는 날짜와 시간 정보를 모두 저장 (용도: review_date 필드에 날짜와 시간을 저장)
  • @ColumnDefault : 컬럼의 기본값을 설정하는 애노테이션 (용도: review_date 필드에 기본값으로 sysdate를 설정)
  • @ElementCollection : 컬렉션 타입의 필드를 매핑할 때 사용하는 애노테이션 (용도: 여러 개의 이미지 URL을 저장하기 위해 uploadedImages 필드에 사용)

2. Repository 생성

package com.demo.persistence;

 

import org.springframework.data.jpa.repository.JpaRepository;

import com.demo.domain.Review;

public interface ReviewRepository extends JpaRepository<Review, Integer> {

          // 여기서는 CRUD 기능을 사용하기 위해 다른 쿼리문 지웠어요..

          // 추가로 글을 작성하다 필요한 쿼리문은 같이 작성하고 설명하겠습니다.

}

 

  • CRUD는 데이터베이스 애플리케이션에서 기본적인 작업을 나타내는 약어입니다.
    • Create (생성): 새로운 데이터를 생성하는 작업. save() 메서드 사용.
    • Read (읽기): 기존 데이터를 조회하는 작업. findById(), findAll() 메서드 사용.
    • Update (수정): 기존 데이터를 수정하는 작업. save() 또는 @Modifying 애노테이션을 사용한 쿼리로 수행.
    • Delete (삭제): 기존 데이터를 삭제하는 작업. deleteById() 메서드 사용.
  • CRUD는 데이터베이스에서의 핵심적인 작업으로, JpaRepository는 이러한 작업을 자동으로 처리하여 개발자가 복잡한 SQL을 작성하지 않아도 되게 합니다.

 

3. Service 생성

// 리뷰 작성

@Override

public void insertReview(Review vo) {

     reviewRepo.save(vo);

}

 

// 리뷰 수정

@Override

public void updateReview(Review vo) {

     // 특정 리뷰 조회

     Review update_review = reviewRepo.getReviewBySeq(vo.getReview_seq());

      vo.setReview_seq(update_review.getReview_seq()); // 게시글 고유 번호 유지

      vo.setReview_date(update_review.getReview_date()); // 작성 시간 유지

      vo.setMember(update_review.getMember()); // 작성자 유지

 

      reviewRepo.save(vo);

}

 

// 리뷰 삭제

@Override

public void deleteReview(Review vo) {

      reviewRepo.delete(vo);

 

}

 

// 전체 리뷰 조회

@Override

public List<Review> getAllReview() {

      return reviewRepo.findAll();

}