• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

1 : N 필드 `memberRole` 에 @OneToMany 옵션 cascade 미사용, 컬랙션 null 초기화 에 대한 질문입니다.

23.10.05 21:30 작성 23.10.05 22:14 수정 조회수 252

0

class Member(
    ...
) {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "member") ⬅️Q1:"cascade 없음 이유"
    val memberRole: List<MemberRole>? = null ⬅️Q2: "null 초기화"(mutableListOf() 누락)
}

 

Q1:

cascade 미사용:
강의 컨샙에 맞춰 쉬운 예제 구성을 목적으로 컬랙션 필드에 Cascade 설정을 안하신게 아닐까 추측했지만, 한편으로 다른 구현방법에 대한 다른이유가 있으신 것인지 강의에 언급되지 않은 부분을 여쭤보고 싶었습니다.

Q2:

컬랙션 null 초기화:
일반적인 JPA 예제에서는 JpaEntity 의 1:N 관계 필드는 Collection 초기화를 하더라구요. null 로 초기화 할 때의 장점 이라던지, 다른 이유가 있는지 궁금해서 남기게 되었습니다.

 

읽어주셔서 감사합니다.

답변 2

·

답변을 작성해보세요.

0

안녕하세요. Truestar님 질문 남겨주셔서 감사합니다.

두가지 질문에 답변을 같이 남기자면
해당 강의가 초보자를 대상으로 Spring Security와 JWT를 한번 사용해보는 강의여서
예제가 그렇게 되었습니다.

Q1. cascade 미사용

=> cascade 를 사용하면서 설명을 하려면 영속성 컨텍스트를 같이 설명을 해야해서

해당 부분은 제외하고 서비스에서 바로 넣어주는 코드를 작성하였습니다.

다른 이유는 없고 이렇게 하는게 초보자분들이 이해하시는데 쉬울 것으로 판단했습니다.

 

Q2. 컬렉션 null 초기화

=> 이것도 내용은 동일합니다.

@OneToMany(fetch = FetchType.LAZY, mappedBy = "member")
val memberRole: List<MemberRole>? = null

해당 예제에서 memberRole을 권한 확인시 조회용으로만 쓰려고 했습니다.

회원가입시 DB에 바로 저장만 하고 끝나기에

memberRoleRepository를 사용해서 memberRole을 저장하면서 member 엔티티에 연결해주지 않았습니다.

그래서 빈 리스트로 미리 초기화할 필요가 없어서 null로 넣었습니다.

 

실제 개발을 할때는 여러가지를 고려해서 개발을 진행하지만

해당 강의는 초보자가 쉽게 따라할 수 있는 강의를 만드는데 포커싱을 두고있어서 보실때 이상한 예제가 있을 수 있을 것 같습니다.

 

다음번에는 좀 더 확실하고 쉬운 예제로 찾아뵙도록 하겠습니다.

 

감사합니다 :)

 

Truestar님의 프로필

Truestar

질문자

2023.11.08

답변 감사합니다!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.10.07

안녕하세요, 인프런 AI 인턴이에요.

Q1: cascade 미사용에 대해 여쭤보셨는데요, cascade는 연관된 엔티티의 영속성 상태 변화를 관리하는 옵션입니다. cascade를 사용하면 부모 엔티티의 상태가 변경되었을 때 연관된 자식 엔티티도 일괄적으로 상태를 변경할 수 있습니다. 예를 들어, 부모 엔티티를 삭제할 때 연관된 자식 엔티티도 함께 삭제하고 싶다면 cascade를 사용하면 됩니다. 하지만 해당 예제에서 cascade가 사용되지 않은 이유는 강의 컨셉에 맞춰 간단한 예제를 구성하기 위함일 수 있습니다. 그러나 강의에서 특별한 이유가 언급되지 않았다면 여럿의 구현 방법 중 하나를 선택한 것이라고 추측할 수 있습니다.

Q2: 컬렉션 null 초기화에 대해 여쭤보셨는데요, 일반적으로 JPA 예제에서는 1:N 관계 필드를 Collection으로 초기화하는 경우가 많습니다. 이는 null 대신 빈 컬렉션을 초기값으로 설정하는 것이 보편적인 관례입니다. 이렇게 하면 자식 엔티티를 추가할 때 null 체크를 할 필요가 없어서 편리하다는 장점이 있습니다. 하지만 예제에서 null로 초기화한 이유는 명확하게 언급되지 않았으므로, 해당 예제 작성자의 의도에 따라 null로 초기화하는 것이라고 추측할 수 있습니다.

저희가 작성한 답변이 도움이 되셨기를 바랄게요. 추가로 궁금한 점이 있으시면 언제든지 질문해주세요. 좋은 하루 되세요!