알통 지식정보공유

알록달록

ChevronLeft

컴/폰

React word book app

FileX

양재문

2023-02-06 15:00

조회수 : 13

리엑트를 공부해보다 직접 앱을 하나 만들어보며 배우면 기억에 더 남겠다는 생각이 들었다.

 

사용할 핵심 기술은 useState, useEffect, useRef, scss, rest api 등 이다.

 

Extension 은 prettier 와 es-lint 를 사용했다

 

구조는

  • src
  • components
  • CreateDays.js
  • CreateWords.js
  • DayList.js
  • Days.js
  • Header.js
  • Word.js
  • LinkError.js
  • data
  • hooks
  • img
  • App.js
  • App.scss
  • index.js
  • ...

로 간단하게 구성했다. styled components 를 사용해 볼까 했지만 scss 문법을 연습중이기에 css는 App.scss 파일하나로 작업을 진행했다.

App.js 코드다. 배포까지 마친 후의 코드라서 path 경로에 /react 가 붙어있다.

리엑트 18.2.0 버전을 사용해 Switch 문법이 Routes 으로 바뀐걸 볼 수 있다.

Route 안의 컴포넌트를 element 속성에 직접 입력해 코드가 간결해져서 보기가 좋다.

 

컴포넌트 부분은 위에서부터

메인 로고와 router 의 Link 를 담당할 header component

저장한 단어들을 날짜별(day)로 확인할 수 있는 DayList component

json-server 를 이용한 가상 Rest api 에 POST 할 기능을 가진 CreateWord, CreateDay component ( 이부분에서 애를 좀 먹었다 )

단어들을 각각의 day 에 출력할 Days components

실제 저장한 단어들과 jsx 를 포함하고있는 Words components 로 구성되어있다

 

hooks 디렉토리에는 reset api 를 자주 호출하게 될 예정이라 불러오기 쉽게 custom hook 을 제작해두었다.

DayList component

custom hook 으로 rest api 를 호출하고 jsx 문법으로 data의 day 길이만금 리스트를 출력했다.

Dayscomponent

Days 의 경우 각각의 주소를 가지고 있어야해서 router-dom 에서 제공하는 useParams 를 사용해 url 의 값을 가져왔다

App.js 의 Routes 의 일부분이다.

path 경로를 확인해보면 :day 부분이 있는데 이렇게되면 /react/day/ 경로 뒤에오는 값을 day 변수에 저장하게 된다.

다시 Days 로 돌아가 useParams 를 사용해 url의 day 변수를 가져온 뒤

custom hook 을 이용해 day값이 일치하는 데이터들을 word 에 담아 map 함수를 이용해 데이터를 출력했다.

 

다음은 문제의 Word 컴포넌트

이부분에서 문제가 생겼다.

 

해당코드를 json-server 를 사용해 localhost 의 가상 rest api 로만 작동할 생각이었다면 문제가 생기지 않지만.

https://my-json-server.typicode.com/

 

My JSON Server - Fake online REST server for teams

my-json-server.typicode.com/user/repo/posts/1 { "id": 1, "title": "hello" }

my-json-server.typicode.com

모름지기 모든 프로젝트는 서버에 올린 후에도 남들도 정상적으로 사용 할 수있어야 하지 않겠는가.

만약 json-server 만 사용해서 build 를 하게되면 다른 pc에서는 내 pc 의 localhost에 접속할 수 있는 방법이 없으니 데이터를 받아올 수 있는 방법이 없었다.

 

이에대한 해결책으로 구글링 끝에 json-server 를 사용한 데이터를 빌드 배포후에도 잘 사용되도록 해주는 Heroku 라는 서비스를 찾아냈지만 그마저도 유료화에 들어가서 사용이 불가능했다.

 

https://www.heroku.com/home

 

Cloud Application Platform | Heroku

Heroku is a platform as a service (PaaS) that enables developers to build, run, and operate applications entirely in the cloud.

www.heroku.com

 

서버를 직접 구축할 방법이야 다양하지만 필자가 사용할줄 아는 유일한 서버는 MySQL 이 전부.. 코드를 전부 갈아 엎어야하는 지경이다.

 

이부분은 좀더 공부를 해보며 수정해나갈 예정이다.

 

다음으로 CreateWord 와 CreateDay 컴포넌트

마찬가지로 rest api 를 사용해 CRUD 로 data를 다루기에 localhost 에서만 정상 작동하는 중이다..

custom hook 으로 데이터를 불러오고 연습중인 날짜를 length 로 표현해주었다.

날짜 추가를 위해 fetch api 의 POST method 를 사용했고 데이터는 날짜만 다룰것이기에 day 에 day.length +1 로 추가할때마다 날짜가 늘어나도록 설정해주었다.

 

다음은 CreateWords 컴포넌트

CRUD 부분은 Days 컴포넌트와 같지만 사용자에게 직접 입력받은 값을 컨트롤 해야해서 useRef 를 사용해서 DOM 에 접근후

current 속성을 가진 객체로 value 를 rest api 에 POST 해주었다.

 

실제화면

SCSS 코드는 따로 다룰 예정이기에 포스팅은 여기서 마친다.

 

내가만든 data.json 파일을 어떤식으로 서버에 올려서 컨트롤해야 다른 사람의 pc에서도 잘 다룰수 있는지 공부해온 뒤 다시 포스팅 해야겠다..

2,000

7

댓글

  • leeym1220 님이 감사의 마음으로 양재문님께 0알을 증정했어요!

  • 브폴로 님이 감사의 마음으로 양재문님께 0알을 증정했어요!