인프런 커뮤니티 질문&답변

dionisos198님의 프로필 이미지
dionisos198

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

영속성 전이(CASCADE)와 고아 객체

스프링 cascade 활용도 측면에서 궁금한 것이 있습니다. 영한님

작성

·

216

0


[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
여기에 질문 내용을 남겨주세요.

cascadeType.all! 일단 저장할때 자식 객체를 다 담은 후 이후 부모 를 repository.save(부모) 하면 자식도 함께 저장되는 것을 강의 내용을 통해서 확인했습니다.

 

그러면 혹시 이 과정에 대해서는 어떻게 생각하시나요

 

 Program program = programRepository.findById(reviewSaveDto.getProgramId())
            .orElseThrow(() -> new NotFoundException(ErrorCode.PROGRAM_NOT_FOUND));

 Review review = Review.builder()
            .content(reviewSaveDto.getContents())
            .user(user)
            .program(program)
            .rating(reviewSaveDto.getRating())
            .genre(usersFirstGenre.getName())
            .build();
program.addReview(review);

 

보시면 program 을 리포지토리에서 찾아와서 Review 를 직접 생성한 후 addReview(review) 를 통해서 저장합니다.

 

 @OneToMany(mappedBy = "program", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Review> reviewList = new ArrayList<>();

    public void addReview(Review review) {
        this.reviewList.add(review);

당연히 cascade가 발라져있고요!.

 

이러면 코드는 정상동작합니다.

저는 뭔가 ReviewRepository에서 program 세팅하고 이러는 것 보다 위 방법이 더 뭐랄까 직관적이다?(프로그램.addReview가 직관적이라는 느낌) 이라서 이 것을 애용했는데 성능 상의 문제점이라던가 이런게 있을지 궁금합니다. addReview 를 한다고 바로 저장되지 않고 트랜잭션이 끝날때 변경 감지를 통해서 실행되는것 같은데(뇌피셜입니다) . 이렇게 해도 괜찮을지 궁금해요!!! 영한님!!!

 

 

 

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. dionisos198님

다음과 같은 이유로 이 코드는 좋은 코드가 아닙니다. 🙂

https://www.inflearn.com/questions/31969

감사합니다.

dionisos198님의 프로필 이미지
dionisos198
질문자

답변 너무 감사하지만 아직 의문점이 남아있습니다! 죄송합니다 ㅠ

1) 프로그램 - 리뷰 - 유저 의 다대다 관계에서 리뷰가 프로그램에만 종속되지 않고 User 에도 종속되기 때문에 cascade Type 을 쓰지 마시라는 의미인지

2) 혹은 제가 아직 이해하지 못한 다른 의미가 있는 것인지

 

만약 1번이 문제라는 의미시라면 만약 자식이 부모에 종속되는 상황이 오면(review 가 program에만 온전히 종속된다고 가정할게요!)

단순 부모(program)를 저장할 때 함께 자식(review)을 저장하는 것이 아닌(=>영한님이 설명하셨던 함께 저장이 편리했던 강의 내용)

부모(program)를 repository 에서 꺼내와서 cascade 를 통해 자식(review)을 저장해도 되는 것인지 (위에 제가 질문했던 코드) 궁금합니다.

 

김영한님의 프로필 이미지
김영한
지식공유자

네 1번 이유입니다 🙂

강의에서도 말씀드린 것 처럼 단일 소유일 때만 사용하는 것을 권장드립니다.

감사합니다.

dionisos198님의 프로필 이미지
dionisos198
질문자

그 정말 항상 너무 감사하고 고마운데 마지막 부분에 대한 답변이 빠졌네욤..

 

만약 1번이 문제라는 의미시라면 만약 자식이 부모에 종속되는 상황이 오면(review 가 program에만 온전히 종속된다고 가정할게요!)

단순 부모(program)를 저장할 때 함께 자식(review)을 저장하는 것이 아닌(=>영한님이 설명하셨던 함께 cascade를 통해 저장이 편리했던 강의 내용)

부모(program)를 repository 에서 꺼내와서 cascade 를 통해 자식(review)을 저장해도 되는 것인지 (위에 제가 질문했던 코드) 궁금합니다.

이 부분이 사실 궁금했습니다. 자꾸 귀찮게 해서 죄송합니다 ㅠ

김영한님의 프로필 이미지
김영한
지식공유자

dionisos198님 말씀하신 데로 진행해도 괜찮습니다 🙂

dionisos198님의 프로필 이미지
dionisos198

작성한 질문수

질문하기