본문 바로가기
프로젝트 - Twogether

23.08.17

by J1-H00N 2023. 8. 17.

이번 프로젝트에서는 3개 이상의 필드를 가지고 있는 dto는 builder 패턴을 사용해보기로 했다. 그 이유는 2개 이하일 때는 builder의 장점을 살리기도 힘들고, 오히려 builder를 적용하는데 드는 비용이 더 크다고 생각했기 때문이다. 또한 entity에서도 필드가 너무 많으면 @Setter 보단 dto를 사용하기로 한다. @Setter는 후에 추적하기 힘들기 때문.

 

덱을 삭제할 때 archived된 덱만 삭제가 가능하도록 만들기로 했기 때문에 서비스에서 해당 기능을 구현할 때 deck.getIsDeleted를 사용하려 했으나 get으로 가져오지 못하는 상황이 발생했다. 다른 필드들은 정상적으로 get으로 가져올 수 있었기에 무엇이 문제인가 했더니, @Getter는 boolean 타입의 필드를 자동으로 is~~ 형식으로 가져올 수 있게 만들어준다고 한다.

 

덱의 순서를 지정하기 위해서 일단 parentId를 사용해보기로 했다. parentId는 덱이 생성될 때 자동으로 조정될 예정이므로, Dto에서 빼기로 했다. 그랬더니 필요한 전달값이 title만 남아서 requestDto 자체를 삭제하게 되었다. 덱의 정렬은 데이터베이스 상이 아닌 parentId만을 가지고 LinkedList를 만들어 그 안에서 조정하기로 했다. 그 이유는 순서를 데이터베이스에 정렬하기에는 순서를 옮길 때마다 데이터베이스를 건드려야 하고, 그 비용이 클 것이라 예상했기 때문이다.

수정 전 코드

// Deck

public Deck(String title) {
        this.title = title;
    }

// DeckService

public void addDeck(String title) {
        deckRepository.save(new Deck(title));
    }

 

수정 후 코드

// Deck

public Deck(String title) {
        this.title = title;
        this.parentId = 0l;
    }
    
// DeckService

public void addDeck(String title) {
        Deck newDeck = new Deck(title);
        deckManager.addDeck(newDeck);

        deckRepository.save(newDeck);
    }
    
// DeckManager

public class DeckManager {
    private LinkedList<Deck> deckList;

    public DeckManager() {
        deckList = new LinkedList<>();
    }

    public void addDeck(Deck newDeck) {
        if (!deckList.isEmpty()) {
            newDeck.setParentId(deckList.getLast().getId());
        }

        deckList.add(newDeck);
    }

}

 

이제 생성할 때 parentId를 자동으로 맞춰주는 작업을 했고, 이제 이 순서를 변경하는 기능을 구현해야 한다.

id와 일치하는 덱(a)의 parentId를 지정한 덱(b)의 id로 수정하고, 원래 그 id가 parentId였던 덱(c)의 parentId를 a의 id로 수정하는 방식으로 구현했다.

여기서 a를 parentId로 가지고 있던 덱이 있었다면, 해당 값을 a의 parentId 값으로 바꿔줘야 한다. 이 기능은 deleteDeck에도 필요하므로, 따로 메서드를 추가해서 둘 모두에 적용할 생각이다.

 

테스트 중 문제가 생겼다. parentId를 자동으로 생성할 때 데이터베이스에 없는 LinkedList를 참조했다는 점 때문에 덱들을 생성했다가 서버를 정지한 후 다시 실행하면 해당 로컬 데이터가 사라져 새로 생성하는 덱의 parentId를 0으로 생성한다.

이를 해결하기 위해선 필드에 있는 LinkedList에 데이터를 매핑하는 방법을 알아야 한다. 이는 내일 이어서 하기로 한다.

'프로젝트 - Twogether' 카테고리의 다른 글

23.08.25  (0) 2023.08.25
23.08.24  (0) 2023.08.24
23.08.23  (0) 2023.08.23
23.08.21  (0) 2023.08.21
23.08.16  (0) 2023.08.16