오늘은 팀프로젝트 3일 차이다. 오늘 진행한 내용은 다음과 같다.
1. Post 영속성 전이 오류
2. Like Entity 생성 및 CRUD 구성
3. 모든 기능을 Merge 후 테스트 진행
1. 어제 밤늦게까지 프로젝트를 작성하면서 Post의 Response를 Entity로 반환할 때 에러가 발생했다 에러의 내용을 아래 사진과 같다.
이 에러는 컨트롤러까지 영속성이 적용되지 않은 상태에서 Response를 거쳐서 Controller에서 Entity 객체에 접근하여 get메서드를 사용하여 DB에 접근하려고 할 때 발생하는 오류이다. 즉 Entity의 연관관계를 설정할 때 OnetoMany에서 보통은 LAZE로 FetchType이 LAZY로 설정되어 요청즉시 데이터를 반환하는데 문제는 Entity안에 있는 데이터는 객체상태이기 때문에 렙핑이 돼있다. 따라서 받은 객체의 데이터가 넘어오는 것이 아니라 감싸진 주소하나가 오는 것이다. 그래서 Response를 타고 올라가서 Controller에서 JSON으로 변환하면서 객체 안에 있는 내용물 즉 데이터를 오픈할 때 get메서드를 통해 DB에 접근하는데 이때 이미 컨트롤러까지 넘어온 렙핑 된 객체는 영속성이 적용돼있지 않기 때문에 DB에 접근할 수 없어서 발생한다.
위의 상황을 해결하는 방법은 Fetch type LAZE를 EAGER로 변경하거나 아니면 해당하는 객체의 Response를 하나 더 생성하여 객체내부에 받을 데이터들을 필드에 하나하나 생성하여 영속성이 있을 때 get 메서드를 사용하여 데이터를 다 넣어주고 다시 감싸서 Controller에 넘겨주는 것이다.
위 문제를 해결할 때 나는 후자의 방법을 선택했다. EAGER로 변경하는 것은 댓가가 따를뿐더러 별로 권하지 않는 방법이라고 알고 있다.
2. Like Entity생성하면서 Like와 Post의 연관관계를 입력하는 과정에서 고민이 있었다. 고민은 DB에서는 단방향이지만 JAVA에서는 단방향이라는 개념이 없기에 어쩔 수없이 양방향을 설정해야 되는데 이러면 당장은 사용하는 것이 편하지만 찜찜한 부분이 한두 개가 아니어서 배척하고 그냥 단방향으로 설정하여 Like가 Post를 참조하는 방식으로 설정했다. 하지만 양방향이 아니라 단방향이기 때문에 사용하는 거 자체가 많이 불편했다. 단방향으로 사용하려면 Like JPA에서 Query메서드를 사용하여 원하는 메서드를 가져와야 하는데 Query에 자신이 없었다. 다른 방법은 PostService를 LikeService로 가져와서 수동으로 데이터를 넣어주는 방식을 사용하려고 했는데 하다 보니 순환참조가 되면서 이것도 포기했다. 결국 마지막으로 단방향이지만 별개의 API로 만들어 해결했다. 사용할 때는 따로 요청을 해야 한다는 문제가 있지만 어쩔 수 없었다.
3. 현 시간을 기준으로 테스트 중이며 테스트 후 발생한 문제들을 모두 찾아서 해결할 예정이다.
오늘은 추가기능을 구현했지만 구현보다는 오류와 Entity 연관관계 설정에 집중했으며 프로젝트를 하면서 대부분의 시간을 Entity에 할당했지만 아직도 모르는 부분이 많고 쓰는 게 자유롭지 못한 게 아쉽다는 생각이 든다. Entity만 잘 다뤄도 정말 구조 만드는데 시간 얼마 안 걸릴 것 같다.
'내일 배움 캠프' 카테고리의 다른 글
2023-11-27 (0) | 2023.11.28 |
---|---|
2023-11-24 (1) | 2023.11.25 |
2023-11-22 (1) | 2023.11.22 |
2023-11-21 (0) | 2023.11.21 |
2023-11-20 (0) | 2023.11.20 |