UMC 1주차 미션은 클론코딩이었다.
클론코딩은 유튜브 강의로 유튜브 클론코딩만 따라서 해본 적 밖에 없어서 어떻게 해야 할지 약간 막막했지만… 이틀동안 열심히 만들어봤다..!
react나 vue는 사용하지 않고 그냥 만드는 거라… 컴포넌트의 존재가 새삼 최고였다는 것을… 깨닫게 되었다…
한 파일에 만드니까 뭔가 헷갈린다고 해야 하나..? 정리가 안된 느낌..
그리고 css는… 차마 하나하나 따로 치기에는 너무 헷갈리고 힘든 미래가 보여서 scss를 사용했다. 간단히 scss 사용하는 방법은 다른 글에 작성하기로…
이틀동안 만드느라 시간이 부족해서 자바스크립트는 사용하지 않았다. 페이지 자동으로 변환되거나.. 시간 움직이기 등을 했어야 했는데.. 시간이 없는 관계로 선택과 집중을 했다.
그리고 버튼이나 링크 하나 하나 신경써서 하기에는 시간도 없고.. 복잡(?)하므로 쿨하게 패스하고 다 모양만 만들어줬다.
내가 만든 마켓컬리 클론코딩 페이지!
어려웠던 점
클론코딩을 하면서 어려운 점은.. 기존에 코드를 참고해서 하는데, 해당 코드를 바탕으로 새롭게 나만의 코드 만드는게 처음이라 애를 좀 먹었다. 어떻게 해야 할 지 감을 잡는데 조금 걸렸달까? 그래도 여러번 반복되니 이제 대략 코드들도 이해가 되고 버려도 되는 코드를 금방 파악할 수 있어서 후반부에 갈 수록 코드 작성하는 시간은 적게 걸렸다.
그런 점 말고는… 딱히…?
그저.. vue나 react를 사용하지 않으니까 정리가 안된 느낌이라 답답했다는 것?! 정도?
후반부에는 react를 사용하게 될 거니까 괜찮을 것이다.
종합 소감
클론코딩… 결코 만만하지 않은 것이었다..
TIL!!
object-fit
<img>나 <video> 요소의 크기를 어떤 방식에 맞출 것인지 지정한다.
contain
대체 콘텐츠의 가로 세로비를 유지하면서, 요소의 콘텐츠 박스 내부에 들어가도록 크기를 맞춤 조절한다.
cover
대체 콘텐츠의 가로 세로비를 유지하면서, 요소 콘텐츠 박스를 가득 채운다. 가로 세러비가 일치하지 않으면 객체 일부가 잘려나간다.
fill
콘텐츠 박스 크기에 맞춰 대체 콘텐츠의 크기를 조절한다. 콘텐츠가 박스를 가득 채운다. 가로세로비가 일치하지 않으면 콘텐츠가 늘어난다.
여기서 --watch는 우리가 scss파일에 작성한 코드를 저장하면 자동으로 css 파일로 변환해줘~ 라는 명령어다.
해당 명령어를 작성하지 않으면 scss 파일을 저장하고, cmd 창에서 수동으로 변환 명령어를 계속 입력해야 한다. 매번 그러기에는 귀찮으니 다음 명령어를 꼭 같이 넣어도록 하자.
참고로 더이상 변환을 시키고 싶지 않다면, cmd 창에서 control+C를 통해 프로세스를 종료시키도록 하자.
HOC는 컴포넌트 로직을 재사용하기 위한 React의 기술이다. 컴포넌트를 가져와서 개로운 컴포넌트로 반환하는 함수이다.
HOC는 입력된 컴포넌트를 수정하지 않으며 상속을 사용하여 복사하지도 않는다. 원본 컴포넌트를 컨테이너 컴포넌트로 포장하여 조합한다. 즉, 사이드 이펙트가 없는 순수 함수이다!
훅(hook)으로 인해 hoc의 사용량이 줄어들어 중요도가 다소 낮아졌다.
react-router-dom은 페이스북 공식 패키지가 아니지만 가장 대표적인 라우팅 패키지이다.
Router Component
<BrowserRouter>
브라우저 History API를 사용해 현재 위치의 URL을 저장해주는 역할이다.
웹에 HTML5 History API를 사용하여 페이지를 새로고침 하지 않아도 주소를 변경하고, 현재 주소에 관련된 정보를 props로 쉽게 조회하거나 사용할 수 있도록 한다.
와 컴포넌트가 함께 유기적으로 동작할 수 있도록 묶어주는데 사용한다.
<Route>
컴포넌트의 속성에 설정된 URL과 현재 경로가 일치하면 해당하는 컴포넌트, 함수를 렌더링 한다.
path를 통해 URL을 분기시킨다. 중첩이 가능하다.
exact는 path 속성에 넣은 경로값이 정확히 일치해야 랜더링되도록 한다. exact를 사용하지 않으면 “/profile”경로가 “/”경로에도 반응하게 된다.
<Link>
HTML의 <a>태그와 유사한 기능을 한다.
to 속성에 설정된 링크로 이동한다.
react router에서는 <a>태그를 사용할 수 없기에 해당 컴포넌트를 사용한다. <a>태그는 모두 새로 가져오기 때문에 해당 태그는 사용할 수가 없다.
Link를 통해 페이지를 전환하면 새로운 페이지를 부르지 않아도 애플리케이션은 그대로 유지한 채, HTML5 History API를 사용하여 페이지의 주소만 변경한다.
<NavLink>
activeClassName, activeStyle 처럼 active 상태에 대한 스타일 지정이 가능하다.
Route의 path처럼 동작하기 때문에 exact가 있다.
<Switch>
자식 컴포넌트 또는 중 매치되는 첫번째 요소를 렌더링한다. 작성할때 순서는 좁은 범위 ~ 넓은 범위로 작성한다. (순서가 중요하니 유의하도록 하자)
Switch를 사용하면 BrowserRouter만 사용할 때와 다르게 **하나**의 매칭되는 요소만 렌더링한다.
Switch로 감싸고 있기 때문에 Route가 중복되는 것이 있으면 첫번째 요소만 렌더링한다.
가장 마지막에 어느 path에도 맞지 않으면 보여지는 컴포넌트를 설정해서 “Not Found” 페이지를 만들 수 있다.
<Redirect>
<Redirect>가 렌더링되면 to가 가리키는 링크로 바로 연결된다.
Router 적용 순서
BrowserRouter 연결 → 페이지 컴포넌트 만들기 → Route path 연결 → Link 컴포넌트 연결
HTML에서 shadow DOM을 이용하여 오염될 수 없도록 만들어준다.
HTML안에 본래의 HTML과 영향을 주지 않는 별도의 HTML 덩어리를 의미한다. 리액트에서 컴포넌트를 사용할 때, 컴포넌트가 스타일이 오염되는 문제가 있다. 이런 문제를 해결하고자 css 모듈, 스타일 컴포넌트가 나왔다.
shadow DOM은 HTML에서 shadow DOM을 이용하여 오염될 수 없도록 만들어준다.
설치
react-shadow 라이브러리 설치
npm i react-shadow
<root.div> 안의 태그들만 별도의 스타일 속성을 지정한다.
단점
공통적인 스타일인 경우에도 반복적으로 추가해야 하는 번거로움이 있다.
외부와 내부가 차단되어 있어 document에 지정되어 있는 값을 상대적으로 표현할 때 제약이 발생한다.