옥스턴님의 면접 결과

30

총점

3

질문 수

0

좋아요

4

조회수

종합 평가

양방향 연관관계의 주인 개념, 주인이 아닌 쪽에서의 변경이 무시된다는 JPA 동작 원리, 그리고 1차 캐시로 인한 데이터 불일치 가능성까지 전체 흐름을 일관되게 파악하고 있습니다. 각 개념의 방향은 맞지만 "왜 그렇게 동작하는가"에 대한 메커니즘 설명이 전반적으로 부족합니다. 예를 들어 1차 캐시 불일치의 경우 in-memory 객체 상태와 flush 타이밍의 관계까지 설명할 수 있어야 합니다. JPA 영속성 컨텍스트의 생명주기(persist → flush → commit)와 1차 캐시의 동작 원리를 정리한 뒤, 양방향 연관관계에서 편의 메서드(연관관계 편의 메서드)를 왜 작성해야 하는지 그 이유를 flush 타이밍과 in-memory 객체 상태 관점에서 설명하는 연습으로 확장해 보세요.

질문별 상세 분석

커뮤니티 공개
Q1B

JPA에서 양방향 연관관계를 맺을 경우 주의해야 할 점을 설명해주세요.

응답 내용

의존관계의 주인이 누구인지 정하는 것이 중요합니다. 이것이 잘못 설정되면 join table 생성이나 예기치 못한 문제가 발생할 수 있습니다. 그리고 의존관계의 주인이 아닌 곳에서 값을 업데이트 하고 저장하지 않도록 주의합니다. Jpa는 관계의 주인이 아닌 곳에서 변경이 일어난 것은 무시합니다.

AI 피드백

연관관계의 주인(mappedBy) 개념을 정확히 짚고, 주인이 아닌 쪽의 변경이 무시된다는 핵심 동작 원리까지 언급하신 점이 좋습니다. 다만 "join table 생성"이 어떤 상황에서 왜 발생하는지 조금 더 구체적으로 설명하셨다면 더욱 완성도 있는 답변이 됐을 것입니다(예: 양쪽 모두 @JoinColumn 없이 설정하면 JPA가 중간 조인 테이블을 자동 생성하는 문제). 한 가지 추가로 짚어드리자면, 양방향 관계에서는 주인 쪽에서만 DB에 반영되더라도 1차 캐시(영속성 컨텍스트)에는 반대편 객체가 갱신되지 않아 같은 트랜잭션 내에서 데이터 불일치가 생길 수 있으므로, 편의 메서드(연관관계 편의 메서드)를 통해 양쪽 객체를 동시에 세팅하는 패턴도 함께 언급해 두시면 실무 깊이를 보여줄 수 있습니다.

Q2B

연관관계 주인 쪽에만 값을 설정하고 반대쪽 객체에는 값을 설정하지 않았을 때 어떤 문제가 발생할 수 있나요?

응답 내용

헤당 트랜젝션이 끝나기 전에 주인이 아닌 쪽에서 해당 객체를 조회하고자 할 때 데이터 불일치가 발생할 수 있습니다.

AI 피드백

1차 캐시와 영속성 컨텍스트의 동작 원리를 연결해 핵심을 정확히 짚으셨습니다. 같은 트랜잭션 내에서 DB를 거치지 않고 1차 캐시에 올라온 객체를 그대로 참조하기 때문에, 연관관계 주인 쪽에만 값을 설정하면 반대쪽 컬렉션이 비어 있는 채로 조회된다는 점이 핵심인데, 그 맥락을 잘 파악하고 계신 것 같습니다. 한 단계 더 나아가자면, 이 문제를 해결하기 위해 양쪽 모두에 값을 설정하는 '연관관계 편의 메서드(convenience method)'를 엔티티 내부에 두는 패턴을 언급하면 실무적인 깊이를 보여줄 수 있습니다. 예를 들어 "이를 방지하기 위해 연관관계 편의 메서드를 정의해 양쪽 객체를 동시에 설정하도록 캡슐화합니다"처럼 답변을 보완해 보시면 더욱 완성도 높은 답변이 될 것입니다.

Q3B

같은 트랜잭션 내에서 그 데이터 불일치가 발생하는 이유를 JPA 1차 캐시 관점에서 설명해주세요?

응답 내용

Jpa는 1차 캐시를 이용하기 때문에 해당 트랜젝션이 끝나기 전에 조회를 시도하면 캐시에는 여전히 빈 값이 들어 있으므로 조회가 제대로 이루어지지 않습니다.

AI 피드백

1차 캐시가 빈 값을 반환한다는 핵심 방향은 정확히 짚으셨습니다. 다만 "왜 캐시에 빈 값이 있는가"에 대한 설명이 빠져 있어 아쉽습니다. 핵심은 연관관계 주인 쪽에만 값을 설정하면 이미 영속성 컨텍스트(persistence context)에 로드된 반대쪽 엔티티 객체의 컬렉션 필드가 메모리상에서 갱신되지 않기 때문입니다. JPA는 flush 시점에 DB에 반영하지만, 그 전에 같은 트랜잭션 내에서 해당 엔티티를 조회하면 DB가 아닌 1차 캐시의 in-memory 객체를 그대로 반환하므로 컬렉션이 비어 있는 상태로 보이는 것입니다. 예를 들어 "Team 엔티티가 이미 캐시에 로드된 상태에서 member.setTeam(team)만 호출하고 team.getMembers().add(member)를 호출하지 않으면, 같은 트랜잭션 내에서 team.getMembers()를 조회할 때 빈 리스트가 반환된다"고 설명하면 훨씬 명확합니다.

커뮤니티 공유 안내

• 이 결과는 AI가 분석한 내용이며, 학습 목적으로 커뮤니티에 공유됩니다.

• 좋아요를 눌러 유용한 답변에 반응을 남겨보세요.

• 개인정보는 포함되지 않으며, 면접 연습 개선을 위한 참고 자료로 활용됩니다.