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

rhkrwldus16님의 프로필 이미지

작성한 질문수

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

일대일 [1:1]

1:1맵핑에서 주인이 아닌 객체의 set함수를 처리할 방법이 없을까요?

23.08.11 10:55 작성

·

294

·

수정됨

0

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

[질문 내용]
예를들어

Locker와 Member가있다고 하면

Member가 주인이라고 했을때 Member에서 연관관계메소드로 settingLocker(Locker locker)이 있다고 하면 해당 함수 내용이

this. Locker = locker;

locker.setMember(this);

가 되는 거잖아요?

하지만 저는 mappedby 로 되어있는 Locker에서 set을 해봤자 실제 Db에는 적용되지 않기때문에 다른 개발자가 실수로라도 locker.setMember()함수를 사용하지 못하게 하고싶은데 이런경우에는 어떻게 해야하는지 알 수 있을까요?

답변 2

0

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

2023. 08. 16. 16:15

혹시라도 제 질문의 내용이 모호하다면 알려주시면 감사하겠습니다..!

0

인프런 AI 인턴님의 프로필 이미지

2023. 08. 13. 11:01

안녕하세요, 인프런 AI 인턴이에요. 주인이 아닌 객체의 set 함수를 처리하는 방법에 대해 여쭤보셨군요.

1:1 매핑에서는 일반적으로 주인 객체가 관계의 주체가 되어 매핑을 설정하게 됩니다. 그렇기 때문에 주인이 아닌 객체의 set 함수를 통해 연관 관계를 설정하더라도 DB에는 적용되지 않습니다.

만약 주인이 아닌 객체의 set 함수를 사용하지 못하게 하고 싶다면, 다른 방법을 사용해야 합니다. 여러 가지 방법이 있을 수 있지만, 그 중 하나는 연관 관계를 설정하는 메소드를 private으로 선언하고, 해당 메소드를 통해서만 연관 관계를 설정하도록 하는 것입니다. 이렇게 하면 외부에서 set 함수를 통한 연관 관계 설정을 막을 수 있습니다.

예를들어, Member 클래스에서 Locker와의 연관 관계 설정 메소드 setLocker(Locker locker)를 private으로 선언하고, 해당 메소드 내에서 this.Locker = locker;와 locker.setMember(this);를 호출하게 됩니다. 이렇게 하면 주인이 아닌 객체에서 setLocker 함수를 호출할 수 없으므로 원하는 대로 동작할 수 있습니다.

하지만 이 방법은 Java와 같은 언어에서만 가능하며, 객체 간의 연관 관계를 설정하는 다른 방법이나 프레임워크에서 제공하는 기능을 사용해야 할 수도 있습니다. 따라서 사용하시는 언어나 프레임워크에 따라 해당하는 방법을 찾아 적용하시면 될 것 같아요.

더 자세한 내용이나 다른 도움이 필요하신 경우, 언제든지 물어보세요!

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

2023. 08. 14. 09:47

앗. 제 질문은 저의 예시에서 Member가 주인인 상태이기 때문에 Member와 Locker의 연관관계 메소드는 Member안에 있게되는데, 그럼 함수 내부의 내용은

this. Locker = locker;

locker.setMember(this);

이런식으로 되게 되지요?

그럼 이때 어쩔 수 없이 Locker 클래스에서의 setMember 함수는 public으로 밖에 할 수 없는데, 그럼 다른 개발자가 실수로라도 Locker의 setMember함수를 사용할수도 있으니 이를 방지하고 싶었다는 뜻이에요.(Locker에서 member의 정보를 바꿔봤자 이는 DB에 적용이 안되니까요)

그래서 주인클래스(예시에서는 Member)에서만 set할 수 있고, 참조당하는 클래스(예시에서는 Locker)에서는 실수로라도 set할 수 없게끔 하는 방법이 있을까요? 라는 질문이에요!