프로젝트/DevLink

[프로젝트] 설계하기 - ERD 그리기 ( 2023.12.04(월) )

IT록흐 2023. 12. 4. 23:25
반응형
 

작업한 것

- 설계 ( ER 다이어그램 )

 

 

 

 

- 개발 

  • 상대방과 채팅 구현 

 

 

 

  • 채팅 리스트 구현 

대화상대, 최근 대화, 최근 대화 시간, 읽지 않은 메시지 개수 구현 

 

 

배운 것

 

- PK와 FK는 내부 JOIN용이다. 클라이언트용 식별자는 UUID로 만들어 제공해야 한다. 

( https://americanopeople.tistory.com/378 )

 

- null 값 if/else 문 안쓰고 처리하기
Optional.ofNullable(findChatRoom).orElse(new ChatRoom("0"));

 

- @Builder 와 @NoArgsConstructor를 같이 쓰려면 @AllArgsConstructor도 선언하면 됨

 

이슈

- JPA 개념을 많이 잊고 있다
    @OneToMany(mappedBy = "chatRoom") 
    private List<RoomUser> roomUsers = new ArrayList<>();
    
    roomUsers는 JPA가 프록시 엔티티 객체를 생성할때 값을 넣어주기 위한 것이지
    개발자가 직접 호출해서 세팅하는 것이 아니다. 

- org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cohttp://m.example.chattingservice.entity.ChatRoom.roomUsers, could not initialize proxy - no Session

트랜잭션이 종료되어 참조하는 엔티티를 호출하는 경우 발생하는 에러 
findByRoomId 함수로 엔티티를 가져오면 지연로딩 전략을 사용하는 객체는 Transaction이 종료된 뒤 가져오지 못하는 현상 => 페치조인 사용하기 => JPQL 사용 => QueryDSL 사용!


- QueryDSL 테스트 중에 연관관계 엔티티를 가져오지 못하는 현상 발생 
=> em.persist로 영속성 컨테이너만 변경하고 DB는 그대로 두었다. QueryDSL은 JPQL을 실행하는데 JPQL은 영속성 컨테이너를 거치지 않고 바로 DB에 실행한다. DB와 영속성 컨텍스트를 동기화 하지 않으면 원하는 결과를 얻을 수 없다.... 


- Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query


@Transactional 
//프록시로 생성된 Respository 객체는 @Transactional(ReadOnly=true)이므로 update, delete 메소드 작업시 어노테이션을 메소드 위에 정의해주어야 한다. entityManager.flush()로 동기화 하고 entityManager.clear()로 확실히 DB에서 데이터를 가져오면 된다. 

- java.lang.NoSuchMethodException: cohttp://m.example.chattingservice.domain.ChatRoomResponse.<init>()

ModelMapper로 ChatRoom을 ChatRoomResponse로 변환하는 도중 위와 같은 에러 발생. ChatRoomResponse로에 어규먼트가 하나인 생성자를 생성하면서 어규먼트가 없는 생성자가 사라졌기에 발생한 문제
ModelMapper는 Refletion으로 객체를 생성하기에, 어규먼트 없는 생성자가 필요하다. 

@NoArgsConstructor( access = AccessLevel.PROTECTED) 추가해 줌.

 

마무리

조금씩 느껴져 오는 시간의 압박...

SpringCloud를 이용한 MSA 구현이 가능할까?...

 

 

 

 

 
반응형