오늘은 팀프로젝트 3일차이다. 오늘 구현한 기능은 다음과 같다.
1. 어제 고민했던 내용 해결
2. Card Service 및 CardRepository 기능 구현 완료
1. 어제 고민했던 내용이였던 복합기 저장에 대한 고민을 해결했다. 생각을 해보니 CardEntity에 아래와 같이 설정을 했었는데 이러면 Save하기전에 Card Entity에 Worker를 등록만 시켜주면 cascade설정을 통해 영속성 처리가 끝나기전 임시 ID가 Worker에도 등록된다
@OneToMany(mappedBy = "card",cascade = CascadeType.ALL , orphanRemoval = true)
private List<Worker> worker
public void createWorker(User user){
Worker worker = new Worker(this, user);
this.worker.add(worker);
}
따라서 영속성 처리가 끝나는 즉 save처리를 하고 @Transactional처리가 끝나면 자동으로 Worker에 등록돼있던 임시 ID가 실제 ID 값으로 등록이 된다.
@Transactional
public CardResponseDto createCard(Long boardId, Long columnId, CardRequestDto cardRequestDto, User user) {
...
// solution : 케스케이드 설정이 돼있기 때문에 worker를 만들어 등록만 시켜주면 알아서 영속성이 끝나기전에 임시로 받은 ID값이 worker로 들어가 저장된다.
card.createWorker(user);
Card saveCard = cardRepository.save(card);
return new CardResponseDto(saveCard);
}
2. CardService기능을 구현하면서 제일 많이했던 고민이 Trello 기능을 구현할때 카드를 동일칼럼에서 위치를 왔다갔다 할수 있고 다른 칼럼으로 옮길수 있다는 점이다. 그러면 순서를 옮기는 과정에서 어떤 방식을 처리할것인지 고민했다.
처음에는 단순하게 순번을 사용해서 구현을 하려고 했으나 카드를 생성할때는 JPA 사용하는 과정이 단순하지만 카드 위치를 수정하는 과정에서 카드를 옮기면 해당 칼럼의 순번과 옮기기전 칼럼의 순번을 전부 다 조정을 해야되기 때문에 JPA 자원 낭비가 심하다는 결론이였다. 따라서 고민을 거듭하고 회의를 거듭한 결과 JPA자원을 최소한으로 사용하면서 효율이 제일 좋은 방법인 가중치를 부과하여 순번을 정하기로 했다.
가중치를 적용하는 과정을 간단하게 설명하면 다음과 같다. 카드가 1, 2, 3, 4, 5 가있을때 가중치도 1, 2, 3, 4, 5를 사용한다고 한다면 카드 2번을 4번과 5번 사이에 넣는다고 했을때 ( 4+5 )/2 = 4.5 값을 부여하는 것이다. 그러면 순서가 가중치 기준으로 1, 3, 4, 4.5, 5가 되며 가중치 기준으로 카드 순번을 정렬하면 1, 3, 4, 2, 5가 된다. 이런 방식으로 순번을 적용하는 원리인데 장점은 JPA에서 카드 위치를 변경할때 여러번의 자원을 소모할 필요없이 한번만 하면 된다는 장점이 있다.
이러한 방식으로 Service 기능을 구현했으며 테스트를 마치는대로 정리할 예정이다.
'내일 배움 캠프' 카테고리의 다른 글
2024-01-02 (2) | 2024.01.03 |
---|---|
2023-12-29 (0) | 2023.12.29 |
2023-12-27 (0) | 2023.12.27 |
2023-12-26 (0) | 2023.12.27 |
2023-12-25 (0) | 2023.12.27 |