Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[4주차] 김동혁 미션 제출합니다. #14

Open
wants to merge 48 commits into
base: main
Choose a base branch
from

Conversation

ddhelop
Copy link
Member

@ddhelop ddhelop commented May 3, 2024

🔗 링크

배포 링크

📌 피그마 링크

피그마 링크


📄 Key Questions

1. Rouing 이란?

라우팅(Routing)은 여러 페이지 또는 뷰 간의 전환을 관리하는 프로세스를 의미합니다. 일반적으로 React 애플리케이션은 단일 페이지 애플리케이션(Single Page Application, SPA)으로 개발되며, 이러한 애플리케이션에서는 전체 페이지의 새로고침 없이도 동적으로 콘텐츠를 업데이트하고 화면을 전환할 수 있습니다. 이를 가능하게 하는 것이 바로 라우팅입니다.
리액트에서 라우팅을 구현하기 위해서는 주로 react-router-dom라는 라이브러리를 사용합니다. react-router-dom는 React 애플리케이션에서 라우팅을 간단하게 관리할 수 있도록 도와주는 라이브러리로, URL과 컴포넌트를 매핑하고, 사용자의 요청에 따라 적절한 컴포넌트를 렌더링합니다.

import { Link } from 'react-router-dom';

function Navbar() {
  return (
    <nav>
      <ul>
        <li><Link to="/">Home</Link></li>
        <li><Link to="/about">About</Link></li>
        <li><Link to="/contact">Contact</Link></li>
      </ul>
    </nav>
  );
}

2. SPA란?

SPA는 "Single Page Application"의 약자로, 단일 페이지 애플리케이션을 의미합니다. 이는 웹 애플리케이션의 구조를 말하는데, 전통적인 웹 애플리케이션과는 다르게 페이지를 새로 불러오지 않고 동적으로 콘텐츠를 업데이트합니다. SPA는 초기 로딩 시에 모든 필요한 코드, 자원, HTML을 한 번에 불러온 뒤, 이후에는 필요한 데이터만 서버로부터 가져와서 동적으로 화면을 업데이트합니다.

SPA 특징
SPA를 개발할 때는 주로 React, Angular, Vue.js 등의 프레임워크나 라이브러리를 사용합니다.
SPA는 최초 한 번의 페이지 로드 후에는 페이지 전체를 다시 로드하지 않고 애플리케이션의 다양한 부분을 업데이트합니다. 이로써 사용자 경험이 향상되고, 빠른 반응성이 제공됩니다.
초기 로딩 이후에는 필요한 데이터만 서버로부터 받아오기 때문에 빠른 성능을 제공


3. 상태관리란?

상태 관리는 애플리케이션의 상태를 관리하고 업데이트하는 과정을 의미합니다. react는 컴포넌트 기반의 라이브러리로, 컴포넌트 간의 데이터 흐름을 관리해야 합니다. 이를 위해 상태(state)를 사용하여 컴포넌트의 데이터를 저장하고 관리합니다.

컴포넌트 상태(State)
react에서 상태는 useState 훅 또는 클래스 컴포넌트의 state 속성을 통해 정의
상태는 불변성을 유지해야 하므로 직접 수정하는 것이 아니라 setState 함수를 사용하여 업데이트

외부 상태 관리 라이브러리
React의 내장 상태 관리 기능만으로는 복잡한 상태 관리에 한계가 있습니다. 따라서 Redux, MobX, Context API 등과 같은 외부 상태 관리 라이브러리를 사용


Copy link

@Rose-my Rose-my left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

과제 너무 수고많으셨어요 > <

코드리뷰 보시고 궁금한 것이 있다면 언제든지 물어봐주세요 😆

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indent가 4로 되어있나봐요 !!

그럴 경우 코드가 점점 복잡해지고 tag가 점점 중첩될수록 코드를 읽기 불편해져서 많이들 하는 indent size 2로 하시는 걸 추천드려요오 !!

handleClickChat(chat.id);
}}
>
<Profile src="/icon/ChatProfile.svg" />
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

스크린샷 2024-05-05 오전 3 12 07

저도 여기저기 찾아보고 챗지피티한테도 물어봤는데 svg 불러올때 img태그로 감싸도 상관없다고는 하더라고요! 그런데 동혁님처럼 같은 에러가 났어요...ㅜ 그래서 저는 그냥 이미지 배열 만들어서 불러왔는데 리팩토링하시면서 다양한 방법 찾아보시면 될 것 같아용 > <

Comment on lines +18 to +20
// { id: 2, name: '이수현', message: '안녕하세요!', time: '오전 9:20', unreadCount: 0 },
// { id: 3, name: '박지민', message: '오랜만이에요.', time: '오후 1:45', unreadCount: 1 },
]);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헛 여기 일부러 주석처리하신 걸까요?? 정수완 밖에 안보여요 ..!!

Comment on lines +46 to +51
{chats.map(chat => (
<Chat1
key={chat.id}
onClick={() => {
handleClickChat(chat.id);
}}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

map도 마찬가지로 chat.~ 로 각 프로퍼티에 접근하고 잇는걸 그냥 프로퍼티명으로 바로 접근할 수 있는 구조분해할당 방식도 있다는거 ..! > <

chat.map((chat) => {
     const {id, name, time, message} = chat;
     <Chat1
       key = {id}

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와 저도 배워갑니다...!

</NameSpace>

<NameSpace>
<Message>{chat.message}</Message>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리팩토링하면서 배열에 저장되어있는 기본 텍스트대신 가장 최근에 새로 입력한 메시지를 보이게 하는 기능을 추가해봐도 좋을 것 같아요 ㅎㅎ

import { chatMessagesState } from '../../../context/ChatDataState';
import type { YourFirstMessageProps } from '../../../lib/types';

export default function YourFirstMessage(props: YourFirstMessageProps): JSX.Element {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

props.~ 로 각 프로퍼티에 접근하고 잇는걸 그냥 프로퍼티명으로 바로 접근할 수 있는 구조분해할당 방식이 있다는 점도 있어요 !! 아래 한 줄 만 추가해서 쓰면 되니까 참고하세요 > <

const {isContinuous, sentTime, 등} = props;

Comment on lines +10 to +18
{!props.isContinuous && <Profile src="/ChatRoom/defaultProfile.svg" alt="profile" />}
<TextContainer>
{!props.isContinuous && <ProfileName>{props.name}</ProfileName>}
<Chat>
{props.isContinuous && <div style={{ marginLeft: '48px' }}></div>}
<ChatBox>{props.message}</ChatBox>
{!props.isContinuous && <ChatTail />}
<SentTime>{props.sentTime}</SentTime>
</Chat>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

위에 말한 것처럼 구조분해하면 여기 props.~으로 접근하는 프로퍼티들 싹다 그냥 프로퍼티로 쓸 수 있답니다 ㅎㅎ

Comment on lines +82 to +88
// if (user === me.name) {
// setUser(opposite.name);
// setOppositeChat(me.name);
// } else {
// setUser(me.name);
// setOppositeChat(opposite.name);
// }
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

삼항연산자 쓰신거 너무 좋아요 !! 그럼 불필요한 주석을 지워주세요 ㅎㅎ

Comment on lines +135 to +144
function formatDate(dateString: string): string {
const options: Intl.DateTimeFormatOptions = {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
};
return new Date(dateString).toLocaleDateString('ko-KR', options);
}

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이렇게 날짜를 포맷하는 방법도 있군요 ! 새롭게 배워갑니다 ㅎㅎ

Comment on lines +81 to +84
export const initialChats = [
{ id: 1, opposite: { name: 'Alice' }, messages: [{ text: 'Hello!', sentDate: '2023-01-01' }] },
{ id: 2, opposite: { name: 'Bob' }, messages: [{ text: 'Hi there!', sentDate: '2023-01-02' }] },
];
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

initialChats는 이번에 사용 안하시는 걸까용? 배포에서는 이 부분이 안보이네요 !!

Copy link

@Dahn12 Dahn12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

동혁님 이번 과제도 수고 많으셨습니다! 컴포넌트를 기능과 스타일을 따로 만드신 부분도 좋았던거 같아요! svg 관련 부분도 많이 배워갑니다! 다음 과제도 화이팅 해봐요😁

Comment on lines +70 to +80
svg {
${({ isActive }) =>
isActive
? css`
fill: black;
`
: css`
fill: none;
`}
}
`;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

svg로 불러오면 css를 다르게 줄 수 있어서 좋은거 같아요! 저도 이렇게 구현하고싶었는데 계속 오류가 나서 이번과제에는 적용하지 못했는데 배워갑니당!

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

footer부분은 하나의 파일로 통일시켜도 좋을거 같아요...! 기능이 많지 않아서 하나의 컴포넌트로 줄이는게 유지보수하기에도 좋지 않을까.. 생각해봅니당ㅎㅎ

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

기능 끼리 모아두고 스타일은 따로 두신 것도 깔끔하고 좋은거 같아요!

Comment on lines +46 to +51
{chats.map(chat => (
<Chat1
key={chat.id}
onClick={() => {
handleClickChat(chat.id);
}}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와 저도 배워갑니다...!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants