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();
}
'SpringBoot 프로젝트' 카테고리의 다른 글
Spring Boot - 리뷰 CRUD기능 구현하기 (3) (2) | 2024.11.19 |
---|---|
Spring Boot - 리뷰 CRUD기능 구현하기 (2) (0) | 2024.11.19 |
Spring Boot로 간단한 ID와 비밀번호 찾기 기능 구현하기 (0) | 2024.11.18 |
Spring Boot로 회원가입 기능 구현 (2) | 2024.11.18 |
Java와 Spring Boot로 로그인 기능 쉽게 구현하기 (0) | 2024.11.17 |