묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
Spring JPA 다대다 관계 테이블 질문드립니다.
2개의 다대다 관계의 엔티티를 연결테이블을 이용해서 총 3개의 엔티티로 구성했습니다.Companion 엔티티@Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Builder @AllArgsConstructor public class Companion { // Companion 엔티티는 동반 여행에 참여하는 개별 동반자의 정보를 나타냅니다. // 회원들과의 다대다 관계를 통해 여러 회원과 연결될 수 있으며, 동반 여행의 세부 정보를 저장합니다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 동반자 엔티티의 고유 식별자 private String name; // 동반자의 이름 private String code; // 동반자를 구분하는 코드 정보 private Boolean isStart; // 동반 여행의 시작 여부 private Boolean isEnd; // 동반 여행의 종료 여부 private String tendency; // 동반자의 특성 정보 private String mate; // 동반자에 대한 추가 정보 private LocalDateTime startTime; // 동반 여행의 시작 시간 private LocalDateTime endTime; // 동반 여행의 종료 시간 @OneToMany(mappedBy = "companion") private List<MemberCompanion> companionMembers = new ArrayList<>(); }Member 엔티티@Entity @Getter @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class Member { // Member 엔티티는 시스템 사용자를 나타내며, 동반자와의 다대다 관계를 허용합니다. // 각 회원은 여러 개의 동반자와 연결될 수 있으며, 동반자 정보를 관리합니다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 회원 엔티티의 고유 식별자 @Column(unique = true) private String email; // 회원의 고유한 이메일 주소 private String nickname; // 회원의 사용자명 private String snsType; // 소셜 로그인 종류 private String originalId; // 고유 아이디 @OneToMany(mappedBy = "member") private List<MemberCompanion> myCompanions = new ArrayList<>(); }Companion과 Member를 연결하는 Entity@Entity @Getter @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class MemberCompanion { // MemberCompanion 엔티티는 회원과 동반자 간의 관계를 정의하는 엔티티입니다. // 회원과 동반자를 관련시키며, 회원-동반자 관계의 역할 정보를 포함합니다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 회원-동반자 관계 엔티티의 고유 식별자 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; // 회원 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "companion_id") private Companion companion; // 그룹 @Enumerated(value = EnumType.STRING) private Role role; // 회원-동반자 관계 역할 (예: 리더, 구성원) } 문제가 발생한 것은, Companion을 build하고 생성된 Companion과 Member를 통해서 MemberCompanion을 생성한 후, 생성된 MemberCompanion을 다시 Companion의 companionMembers에 넣으려고하면 순환 참조 오류가 터집니다. Dto를 사용해봤지만 잘 해결이 안되어서 질문 올립니다./** * 그룹 등록을 처리하는 메서드 * * @param companionAddRequestDto 그룹 등록 요청 DTO * @return ResponseEntity 객체를 반환하여 등록 성공 또는 실패 응답을 전송 */ @Transactional public ResponseEntity registCompanion(CompanionAddRequestDto companionAddRequestDto) { Member member = memberRepository.findById(companionAddRequestDto.getMemberId()) .orElseThrow(() -> new EntityNotFoundException("회원을 찾을 수 없습니다.")); Companion companion = Companion.builder() .name(companionAddRequestDto.getName()) .code(generateRandomCode()) .isStart(companionAddRequestDto.getIsStart()) .isEnd(companionAddRequestDto.getIsEnd()) .tendency(companionAddRequestDto.getTendency()) .mate(companionAddRequestDto.getMate()) .startTime(companionAddRequestDto.getStartTime()) .endTime(companionAddRequestDto.getEndTime()) .companionMembers(new ArrayList<>()) .build(); companionRepository.save(companion); // MemberCompanion 엔티티를 생성 MemberCompanion memberCompanion = MemberCompanion.builder() .member(member) .companion(companion) .role(Role.LEADER) .build(); memberCompanionRepository.save(memberCompanion); // 등록 성공 응답을 생성하고 반환 return ResponseEntity.ok() .body(new SuccessResponseDto(true, "그룹 등록이 완료되었습니다.", companion)); }해당 코드에서memberCompanionRepository.save(memberCompanion);이후 companion.getCompanionMembers.add(memberCompanion)시 getCompanionMembers값이 null이라 나오고 다른 방법을 사용하면 순환참조가 발생합니다.해결 방법이 있을까요..?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
회원과 쿠폰의 관계는 특정 쿠폰이 아니라면 다대다 관계가 맞을까요?
[질문 내용]특정 회원에게만 발급되는 쿠폰은 회원과 쿠폰이 다대일 관계를 가질 수 있을것 같지만, 회원이 여러 개의 쿠폰을 가질 수 있고, 쿠폰역시 여러 회원에게 발급이 가능하다고 하면 불가피 하게 다대다 관계로 설정하는게 맞을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대다, 다대다 Entity 설계 관련 질문드립니다.
안녕하세요, 선생님. 강의를 듣고 이제 첫 실전에 jpa를 사용하는데 Entity 설계 과정에 어려움이 있어서 질문드립니다. 다름이 아니라 제가 스프링 시큐리와 같이 회원과 권한의 테이블을 설계하려고 해서 조사를 해보니 https://github.com/zidol/springsecurity_jwt_mysql/blob/main/src/main/java/co/kr/nakdong/entity/author/User.java https://github.com/zidol/springsecurity_jwt_mysql/blob/main/src/main/java/co/kr/nakdong/entity/author/Authority.java 와 같은 구조 혹은 @ManyToMany(cascade=CascadeType.ALL) @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) private Set<Role> roles; 다대다 구조를 많이 사용하더라구요.. 위 코드의 User 와 Authority는 일대다 구조인데 강의때 배울때 연관관계 주인 설정이나 fetch 타입 설정이 다르고 일대다는 권장 하지 않으셔서 조금 혼동이 오더라구요.. 지 양하라는 말씀을 그대로 쓰는코드들도 꽤 있더라구요. 그래서 최대한 강의때 배운데로 해보려고 아래 스샷처럼 변경 해보았습니다. 위 ERD 이미지 처럼 Entity를 변경해보았습니다.(테이블명은 작업중이라 안맞습니다.) 로그인 시 User객체를 조회 하여 불러오는데 test 코드에서 UserRepository를 통해서 User를 불러오면 데이터를 잘 조회 합니다. 제가 로그인을 UsernamePasswordAuthenticationFilter를 상속받아 attemptAuthentication메소드를 재구현했는데 리턴하는 부분에서 could not initialize proxy - no Session 에러가발생하네요.. @SneakyThrows@Overridepublic Authentication attemptAuthentication( HttpServletRequest request, HttpServletResponse response) throws AuthenticationException{ UserLoginDto userLogin = objectMapper.readValue(request.getInputStream(), UserLoginDto.class); String requestURI = request.getRequestURI(); if(userLogin.getRefreshToken() == null) { UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( userLogin.getUsername(), userLogin.getPassword(), null ); // 에러 발생부분 return authenticationManager.authenticate(token);} 제가 뭘 잘못하고 있는지, 어떤걸 참고해야 하는지 알려주시면 알될까요?? 감사합니다. 좋은 하루되세요
-
미해결데이터베이스 중급(Modeling)
강사님 다대다 관계에 관해서 질문이 있습니다.
다대다 관계를 보면 개별적인 객체간에 비즈니스가 끼어들면서 중간에 테이블을 생성하고 일대다 다대일 형식으로 풀어줘야 되는 것으로 알고있습니다. 궁금한점이 개념적으로는 객체 A가 객체 B를 포함하거나 소유하는 개념이 아닐 때 객체 A와 객체 B간에 관계를 맺어주어야 한다면 도저히 객체 A와 객체 B간의 다대다 관계가 안보여도 개별적인 객체간의 관계를 위해 중간 테이블을 생성하는 게 맞는건지요. 그리고 설명해주신 버스와 좌석처럼 has-a 관계, 포함관계일 때만 일대다 관계가 성립하는게 맞는건가요 ?