보드 멤버 업데이트 수정 +a

최수민·2023년 8월 28일
0

TIL

목록 보기
26/41

보드 멤버 업데이트 코드를 수정했다고 리더한테 얘기한 후 테스트를 하는데 자꾸 없는 멤버를 새로 추가하는것은 됐지만 원래 존재했던 멤버가 지워질때 오류가 났습니다.

오류 코드
EntityMetadataNotFoundError: No metadata for "DeleteResult" was found.

EntityMetadataNotFoundError 으로 찾아보니 엔티티 연결 문제라고 나오길래 제가 트랜잭션을 잘못한거같아 typeorm transaction delete로 찾아보았고, 여기서 참고를 해 수정해주었습니다.

  • 수정 전 board-member.service update 부분
//보드 멤버 업데이트
  async UpdateBoardMember(boardId: number, users: string[]) {
    const board = await this.boardsService.GetBoardById(boardId);
    const boardMembers = await this.boardMemberRepository.find({ relations: ['user', 'board'] });
    const boardMember = boardMembers.filter((member) => {
      return boardId == member.board.id;
    });
    const userArray = [];
    for (const i in boardMember) {
      userArray.push(boardMember[i].user.name);
    }
    const deleteUsers = boardMember.filter((x) => !users.includes(x.user.name));
    const updateUsers = users.filter((x) => !userArray.includes(x));

    if (!board) throw new NotFoundException('해당 보드는 존재하지 않습니다.');

    const entityManager = this.boardMemberRepository.manager;
    try {
      await entityManager.transaction(async (transactionEntityManager: EntityManager) => {
        if (updateUsers.length > 0) {
          for (const i in updateUsers) {
            const user = await this.usersService.findUserByName(updateUsers[i]);
            if (!user) throw new NotFoundException('해당 유저는 존재하지 않습니다.');
            const newBoardMembers = this.boardMemberRepository.create({ board, user });
            console.log(newBoardMembers);
            await transactionEntityManager.save(Board_Member, newBoardMembers);
          }
        }
        if (deleteUsers.length > 0) {
          for (const i in deleteUsers) {
            const deleteBoardMember = this.boardMemberRepository.delete({ id: deleteUsers[i].id });
            console.log(deleteBoardMember);
            await transactionEntityManager.remove(deleteBoardMember);
          }
        }
      });
      return { result: true };
    } catch (err) {
      console.error(err);
    }
  }

  • 수정 후 board-member.service update 부분
//보드 멤버 업데이트
  async UpdateBoardMember(boardId: number, users: string[]) {
    const board = await this.boardsService.GetBoardById(boardId);
    const boardMembers = await this.boardMemberRepository.find({ relations: ['user', 'board'] });
    const boardMember = boardMembers.filter((member) => {
      return boardId == member.board.id;
    });
    const userArray = [];
    for (const i in boardMember) {
      userArray.push(boardMember[i].user.name);
    }
    const deleteUsers = boardMember.filter((x) => !users.includes(x.user.name));
    const updateUsers = users.filter((x) => !userArray.includes(x));

    if (!board) throw new NotFoundException('해당 보드는 존재하지 않습니다.');

    const entityManager = this.boardMemberRepository.manager;
    try {
      ...
        if (deleteUsers.length > 0) {
          for (const i in deleteUsers) {
            await transactionEntityManager.delete(Board_Member, { id: deleteUsers[i].id });
          }
        }
      ...
    } catch (err) {
      console.error(err);
    }
  }

수정 후 테스트를 해보니 잘 수정되었습니다.
하지만 포스트맨에 로그인이 된 쿠키를 사용하려는데 좀처럼 잘 되지않아 위 코드를 테스트할때는 로그인 관련여부를 잠시 주석처리하고 테스트해보았습니다.

오늘 6시까지는 cs가 작성이 완료되야 하기때문에 예찬님 코드를 기다릴겸 cs를 마저 작성하려고 합니다.

저번주 cs를 마무리했습니다.

컬럼Done을 미리 생성이 되어야하는데 컬럼에 저장도 되어야해서 고민입니다.
보드 생성시 컬럼도 생성하면 될거같은데 보드 생성시 생성된 보드 아이디를 바로 뽑아오려는데 고민이됩니다.
일단 보드 생성시 컬럼도 같이 생성되게 만들었습니다. 잘 작동되긴 하지만 이렇게 해도 되나 걱정이긴 합니다.

board-column.service 파일에서 boardService를 받아 사용하는데 baord.service에서는 boardColumnRepository를 사용하기 때문입니다.

  • board.serivce.ts / 보드 컬럼 생성 추가.
//보드 생성
  async CreateBoard(workspaceId: number, name: string, description: string) {
    const workspace = await this.workspaceService.getWorkspaceDetail(workspaceId);
    const board = await this.boardRepository.insert({ name, description, workspace });
    const findBoard = await this.boardRepository.findOneBy({ id: board.raw.insertId });
    await this.boardColumnRepository.insert({ name: 'Done', sequence: 1, board: findBoard });
  }

그리고 board-member update부분을 이름 배열로 받아왔는데 같은 이름이 존재하니 userId 배열로 변경했습니다.

  • 변경한 board-member.service.ts / update
//보드 멤버 업데이트
  async UpdateBoardMember(boardId: number, users: number[]) {
    ...
    for (const i in boardMember) {
      userArray.push(boardMember[i].user.id);
    }
    ...
  }

보드 멤버 중 이름으로 멤버를 찾는데 이름이 같은분이 같은 보드에 있을 가능성을 생각해 여기서도 이름을 유저아이디로 변경해주었습니다.

  • 변경 된 board-member.service.ts / get boardMemberName
//보드 멤버 이름 조회
  async GetBoardMemberName(boardId: number, userId: number) {
    const boardMembers = await this.boardMemberRepository.find({ relations: ['board', 'user'] });
    const members = boardMembers.filter((boardMember) => {
      if (boardMember.board.id == boardId && boardMember.user.id == userId) {
        return boardMember;
      }
    });
    return members.map((member) => {
      return {
        boardMemberId: member.id,
        userId: member.user.id,
        name: member.user.name,
        profileUrl: member.user.profile_url,
        phoneNumber: member.user.phone_number,
      };
    });
  }

기술면접 top30
11. DI, IoC에 대해 설명해주세요.
-> DI(Dependency Injection) 의존성 주입은 객체가 다른 객체에 의존할 때 이를 외부에서 주입해주는 방식을 말합니다. 즉 객체가 필요로하는 의존성을 직접 생성하는 것이 아니라 외부에서 생성된 객체를 주입해주는 것입니다. 대표적으로 스프링 프레임워크에서 지원하는 IoC의 형태로 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해줍니다.
IoC(Inversion of Control) 제어의 역전은 스프링 애플리케이션에서는 오브젝트(빈)의 생성과의존 관계 설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 스프링 컨테이너가 담당합니다. 이를 스프링 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있다고 해서 IoC라고 부릅니다.


참고 자료
typeORM transaction delete

프로세스 작업공간

스레드 풀 작업공간

스레드 풀

0개의 댓글