# 2024.03.25 트렐로 구현 / 팀 프로젝트

[팀 프로젝트 GitHub Link](https://github.com/ThreeIpeople/TrelloWithThreeIpeople)

트렐로를 구현하는 프로젝트를 진행 했다. 중간에 틈틈히 공부도 했지만 TIL을 작성 할 수 없었다..

왜냐하면 너무 바빴기 때문 ..

하지만 GitHub에 많이 익숙해졌고 협업스킬이 좋아지는 것 같다.

* 이쁘게 말하기
    
* 상대방의 코드를 존중하면서 의견 제시하기
    
* 팀원들이 작성한 코드도 이해하기
    

느낀점은 많지만 소통을 더 잘하려면 더 많은 팀 프로젝트를 해봐야겠다고 생각이 든다.

### 내가 맡은 파트 : Card Domain

1. 간단한 CRUD는 예전과 다르게 이젠 수월하게 구현 할 수 있게 되었다.
    
2. 쿼리 개선을 진행하면서 3개의 방법으로 n+1의 문제를 해결하면서 성능을 테스트 해봤다.
    
    **1.Controller에서 Service를 호출하여 Repository에서 데이터를 가져오는 방식(findAll( )사용)**
    
    ```jsx
    //Controller
        @GetMapping("/cards")  
        public ResponseEntity<List<CardResponse>> getAllCards() {  
            List<CardResponse> cardList = cardService.getAllCards();  
            return ResponseEntity.ok().body(cardList);
        }
    //Service
        public List<CardResponse> getAllCards() {  
          List<CardResponse> cardList = cardRepository.findAll()  
               .stream().map(CardResponse::new).toList();  
            return cardList;  
        }
        
    List com.sparta.trellowiththreeipeople.card.service.CardService.getAllCards() executed in 12ms
    ```
    
    **2.데이터베이스로부터 카드 정보를 조회하고, 이를 CardDTO 객체로 매핑하는 방식**
    
    ```jsx
    //Controller
    @GetMapping("/cards")  
    public ResponseEntity<List<CardDTO>> getAllCards() {  
        List<CardDTO> cardList = cardService.getAllCards();  
        return ResponseEntity.ok().body(cardList);  
    }
    //Service
    public List<CardDTO> getAllCards() {  
        List<CardDTO> cardList = cardRepository.findAllCardsWithDTO();  
        return cardList;  
    }
    //Repository
    @Query("SELECT new com.sparta.trellowiththreeipeople.card.dto.CardDTO(c.id, c.title, c.content, c.deadline) FROM Card c")  
    List<CardDTO> findAllCardsWithDTO();
    
    List com.sparta.trellowiththreeipeople.card.service.CardService.getAllCards() executed in 2ms
    ```
    
    **3.Fetch,Join을 사용한 방식**
    
    ```jsx
    //Repository
    @Query("SELECT DISTINCT c FROM Card c JOIN FETCH c.user u JOIN FETCH c.bar b WHERE c.deletedAt IS NULL")  
    List<Card> findAllWithUserAndBar();
    
    List com.sparta.trellowiththreeipeople.card.service.CardService.getAllCards() executed in 7ms
    ```
    
    추가적인 변환 과정 없이 바로 DTO 객체로 매핑하기 때문에 가장 실행시간이 빠르다.
