๊ทธ๋ฃน์Šคํ„ฐ๋””๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” CRUD๊ฒŒ์‹œํŒ ํ”„๋กœ์ ํŠธ์œผ !
์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๋ฆฌ๋ทฐ(๋Œ“๊ธ€)๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. 
๋จผ์ € ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ํŒŒ์ผ๋“ค์„ ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•œ๋‹ค!.

Domain

review.java

package com.example.demo.domain;

import lombok.*;

import javax.persistence.*;

@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Getter
@Entity
@Table(name = "review")
public class Review {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne
    @JoinColumn(name = "health_id")
    private HealthInfo healthInfo;
    private String content;

    public void updateReview(String content){
        this.content=content;
    }

}

ํ…Œ์ด๋ธ”๊ณผ ๋งํฌ๋  ํด๋ž˜์Šค์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” DomainํŒจํ‚ค์ง€์— ReviewํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.
Attribute(์†์„ฑ)๋Š” ์ด 3๊ฐœ์ด๋‹ค.

  • id (๊ธฐ๋ณธํ‚ค)
  • content
  • healthInfo(์™ธ๋ž˜ํ‚ค - healthinfo)

ํ…Œ์ด๋ธ” ์ด๋ฆ„์€ review๋กœ ์„ค์ •ํ•˜์˜€๊ณ  ๊ทธ ๋ฐ–์˜ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค

๊ฒŒ์‹œํŒ๊ณผ ๋‹ฌ๋ผ์ง„ ์ ์€ HealthInfo๊ฐ์ฒด์ธ healthInfo์ด๋‹ค.
๊ฒŒ์‹œํŒ ๊ธ€ 1๊ฐœ์—, ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— review์—์„œ๋Š” healthInfo์— @ManyToOne์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. joinColumn์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ์—์„œ ๋ณด๋‹ค ์ž์„ธํžˆ ์•Œ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค !

HealthInfo.java

package com.example.demo.domain;


import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.*;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Entity
@Table(name = "health_info")
@ToString
@Data
public class HealthInfo {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String brand_name;
        private String land_number;
        private String road_number;
        private String category;
        @Builder.Default
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "healthInfo")
        private List<Review> reviews = new ArrayList<>();
        //๋Œ“๊ธ€์ด ์—†๋Š” ๊ฒฝ์šฐ์— null์—๋Ÿฌ ์˜ˆ์™ธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ์ด๋ ‡๊ฒŒ ์„ ์–ธํ•œ๋‹ค.
        public void modifyHealthinfo(String brand_name,String land_number,String road_number, String category){
                this.brand_name=brand_name;
                this.land_number=land_number;
                this.road_number=road_number;
                this.category=category;
        }


}

๊ด€๊ณ„๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์„ค์ •ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— healthInfoํŒŒ์ผ์—๋„ @OnetoMany ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.
Arraylist๋ฐฉ์‹์œผ๋กœ Review๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜์˜€๋‹ค.

DTO

healthinfo์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ review๋“ค๋„ response, request dtoํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

ReviewRequestDTO.java

package com.example.demo.data.request;

import com.example.demo.domain.HealthInfo;
import com.example.demo.domain.Review;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ReviewRequestDTO {
    Long id;
    String content;
    HealthInfo healthInfo;

    public static Review toEntity(ReviewRequestDTO dto){
        return Review.builder()
                .id(dto.getId())
                .content(dto.getContent())
                .healthInfo(dto.getHealthInfo())
                .build();
    }
}

ReviewResponseDTO.java

package com.example.demo.data.response;

import com.example.demo.data.request.ReviewRequestDTO;
import com.example.demo.domain.HealthInfo;
import com.example.demo.domain.Review;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;


@Getter
public class ReviewResponseDTO {
    Long id;
    String content;
    Long healthid;

    public static Review toEntity(ReviewResponseDTO dto){
        return Review.builder()
                .id(dto.getId())
                .content(dto.getContent())
                .build();
    }

    public ReviewResponseDTO(Review review){
        this.id=review.getId();
        this.content=review.getContent();
        this.healthid=review.getHealthInfo().getId();
    }


}
    public ReviewResponseDTO(Review review){
        this.id=review.getId();
        this.content=review.getContent();
        this.healthid=review.getHealthInfo().getId();

์ด ๋ถ€๋ถ„์—์„œ healthid๋Š” Reviewํด๋ž˜์Šค์— ์ •์˜๋˜์–ด์žˆ๋Š” healthInfo๊ฐ์ฒด๋Š” healthInfo์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์ •๋ณด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๊ทธ ์ค‘์— id๋งŒ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค!

Service

ReviewService.java

package com.example.demo.service;

import com.example.demo.data.request.ReviewRequestDTO;
import com.example.demo.data.response.ReviewResponseDTO;

import java.util.List;

public interface ReviewService {
    public ReviewResponseDTO readReview(Long id);

    public List<ReviewResponseDTO> findReview(Long id);

    public Long saveReview(Long id, ReviewRequestDTO reviewRequestDTO);

    public boolean updateReview(Long id, ReviewRequestDTO reviewRequestDTO);

    public boolean deleteReview(Long id);

}

๊ฒŒ์‹œํŒ ๊ตฌํ˜„ํ–ˆ์„๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค ์ด๋ ‡๊ฒŒ ์ด 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค.
๊ฒŒ์‹œํŒ ๋งŒ๋“ค์—ˆ๋˜ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ฐธ๊ณ ํ•ด์„œ ๊ตฌํ˜„๋ฐฉ๋ฒ•์ด ๊ฑฐ์˜ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฐ€์žฅ ๋‹ค๋ฅธ ์ ์€ ์กฐํšŒ์ด๋‹ค.
์ฒ˜์Œ์— ๊ฒŒ์‹œํŒ๊ณผ ๋˜‘๊ฐ™์ด ์—ฐ๊ด€๊ด€๊ณ„๋งŒ ์„ค์ •ํ•˜๊ณ , review๋ฅผ review_id๋กœ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์—ˆ๋Š”๋ฐ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๊ฒŒ์‹œํŒ์„ ๋ณด๋ฉด ๊ฒŒ์‹œ๊ธ€์•ˆ์— ์žˆ๋Š” ๋Œ“๊ธ€์„ ๋ณด๊ธฐ ๋•Œ๋ฌธ์— findReivew๋ฉ”์„œ๋“œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•˜์˜€๋‹ค !

ReviewServiceImpl.java

package com.example.demo.service.impl;

import com.example.demo.data.request.ReviewRequestDTO;
import com.example.demo.data.response.HealthResponseDTO;
import com.example.demo.data.response.ReviewResponseDTO;
import com.example.demo.domain.HealthInfo;
import com.example.demo.domain.Review;
import com.example.demo.repository.HealthRepository;
import com.example.demo.repository.ReviewRepository;
import com.example.demo.service.ReviewService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class ReviewServiceImpl implements ReviewService {
    private final ReviewRepository reviewRepository;
    private final HealthRepository healthRepository;

    @Override
    public Long saveReview(Long id, ReviewRequestDTO reviewRequestDTO) {
        HealthInfo healthInfo = healthRepository.findById(id).
                orElseThrow(()->new IllegalArgumentException
                        ("๋Œ“๊ธ€ ์“ฐ๊ธฐ ์‹คํŒจ: ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค." + id));
        reviewRequestDTO.setHealthInfo(healthInfo);

        Review review = reviewRequestDTO.toEntity(reviewRequestDTO);
        reviewRepository.save(review);
        return reviewRequestDTO.getId();
    }

    @Override
    public ReviewResponseDTO readReview(Long id){

        Review review=reviewRepository.findById
                (id).orElseThrow(RuntimeException::new);
        return new ReviewResponseDTO(review);

    }

    @Override
    public List<ReviewResponseDTO> findReview(Long id) {
        HealthInfo healthInfo = healthRepository.findById(id).orElseThrow(()->
                new IllegalArgumentException("ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."));
        List<Review> reviews = healthInfo.getReviews();
        return reviews.stream().map(ReviewResponseDTO::new).collect(Collectors.toList());

    }


    public boolean updateReview(Long id, ReviewRequestDTO reviewRequestDTO){
        Review review=reviewRepository.findById(id)
                  .orElseThrow(()-> new IllegalArgumentException("ํ•ด๋‹น ๋Œ“๊ธ€์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "));
        review.updateReview(reviewRequestDTO.getContent());
        reviewRepository.save(review);
        return true;
    }

    public boolean deleteReview(Long id){
        reviewRepository.deleteById(id);
        return true;
    }
}

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์ด๋‹ค.
์ž์„ธํ•˜๊ฒŒ ๊ธฐ๋Šฅ์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค ! ๐Ÿ’ก

๋Œ“๊ธ€๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ์ง€ 2์ฃผ ์กฐ๊ธˆ ์•ˆ๋œ ๊ฒƒ ๊ฐ™์€๋ฐ ์ ์  ๋จธ๋ฆฟ์†์—์„œ ์‚ฌ๋ผ์ง€๊ณ  ์žˆ๋‹ค OMG
๋‚˜ ์™ค์ผ€ ์ž˜๊นŒ๋จน์ง€ใ…œใ…œ ํฌ์ŠคํŒ…ํ•˜๋ฉด์„œ ๋‹ค์‹œ ๋ณต์Šตํ•ด์•ผ๊ฒ ๋Œœ๐Ÿคญ

0๊ฐœ์˜ ๋Œ“๊ธ€