강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

mhr님의 프로필 이미지
mhr

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

바뀐 상태 적용하고 eslint 점검하기

Post, Comment, User 및 dispatch 함수 타이핑

작성

·

183

0

안녕하세요. 

리액트-타입스크립트 강좌에서 배운 걸 이 강좌에도 적용하면서 진행중인데요. 우선 Post, Comment, User를 타이핑하면서 궁금한 점이 생겼습니다. 

현재 Post, Comment, User를 위해 아래와 같은 인터페이스를 작성하였는데요. User의 경우 Post에도 들어있고, 구현에 따라 Comment에도 들어있고요. Post의 경우에도 구현에 따라서 Comment 안에도 들어갈 수도 있고, 아니면 그냥 현재처럼 postId라는 속성을 만들어서 사용할 수도 있을 것 같습니다. User 안에 있는 Followings나 Followers 같은 경우에도 현재는 User의 array로 했지만 user들의 id들의 array를 쓸 수도 있을 것 같고요. 

이렇게 서로 다른 타입 간에 관계가 있을 때 타입 설계를 어떤 식으로 하는 게 바람직한지 궁금합니다. 아래처럼 최대한 작성된 인터페이스를 활용하는 경우에는 타입 관리를 하기에는 좋을 것 같지만 불필요하게 많은 데이터를 컴포넌트에 전송하거나 하는 건 아닌가 하는 생각이 들고요. 컴포넌트 내에서 필요한 정보만 간략하게 전달하는 방향으로 작성하면 대신에 타입을 관리하는 게 복잡해지는 것 같습니다. 이런 경우는 어떤 식으로 처리하는 게 좋을까요? 

export interface User {
  id: number;
  nickname: string;
  Posts: Post[];
  Followings: User[];
  Followers: User[];
}

export interface Comment {
  User: User;
  //userId: number;
  content: string;
  postId: number;
}

export interface Post {
  id: number;
  User: User;
  content: string;
  Images: { src: string }[];
  Comments: Comment[];
}

     그리고 dispatch 함수나 redux-saga의 put함수의 경우 동적 액션 함수를 쓰지 않고 액션 객체를 바로 주는 경우에 dispatch<LoginRequestAction>({ type: LOG_IN_REQUEST, data }) 혹은 put<LoginSuccessAction>({ type: LOG_IN_SUCCESS, data: action.data }) 이런 식으로 작성하였는데 이런 식으로 하면 괜찮은 것인가요? 

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

일단 디스패치의 경우는 저렇게 제네릭으로 하시면 됩니다.

서버로부터 오는 데이터에 대한 인터페이스의 경우는 좀 애매합니다. 서버에서 데이터를 넣어줄 때도 있고 안 넣어줄 때도 있어서 정확하게 만들려면 인터페이스를 여러개 써야 합니다. 그게 귀찮다면 하나로 만들어서 가능한 속성을 다 넣고 ? 처리를 해야하고요. 이 부분은 선택해야 하는 사항입니다.

mhr님의 프로필 이미지
mhr
질문자

답변 감사합니다. 저 그럼 서버 설계까지 고려했을 때는 어떤 식으로 하는 게 바람직한가요? 아직 서버 구현까지는 진도가 안 나가서 이 강의에서 어떤 식으로 진행이 되는지는 모르겠는데, 이 강의에서나 혹은 현업에서는 이런 경우에 어떤 식으로 처리하는지도 궁금하네요. 항상 빠르고 정확한 답변 감사합니다. 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

제가 언급한 두 방법 다 쓰입니다. 타입은 어차피 타입일 뿐이라서 실제 코드 동작에는 영향을 주지 않으니 크게 상관은 없습니다만 시간적 여유가 있다면 각 요청별로 타입을 다르게 최대한 정확하게 만들어주는게 좋습니다.

mhr님의 프로필 이미지
mhr

작성한 질문수

질문하기