CLIEN

본문 바로가기 메뉴 바로가기 보기설정 테마설정
톺아보기 공감글
커뮤니티 커뮤니티전체 C 모두의광장 F 모두의공원 I 사진게시판 Q 아무거나질문 D 정보와자료 N 새로운소식 T 유용한사이트 P 자료실 E 강좌/사용기 L 팁과강좌 U 사용기 · 체험단사용기 W 사고팔고 J 알뜰구매 S 회원중고장터 B 직접홍보 · 보험상담실 H 클리앙홈
소모임 소모임전체 ·굴러간당 ·주식한당 ·아이포니앙 ·MaClien ·일본산당 ·방탄소년당 ·자전거당 ·개발한당 ·이륜차당 ·안드로메당 ·소시당 ·나스당 ·골프당 ·디아블로당 ·육아당 ·AI당 ·가상화폐당 ·영화본당 ·클다방 ·리눅서당 ·소셜게임한당 ·걸그룹당 ·젬워한당 ·노젓는당 ·사과시계당 ·야구당 ·패스오브엑자일당 ·IoT당 ·창업한당 ·캠핑간당 ·패셔니앙 ·라즈베리파이당 ·맛있겠당 ·물고기당 ·노키앙 ·바다건너당 ·여행을떠난당 ·3D메이킹 ·X세대당 ·ADHD당 ·AI그림당 ·날아간당 ·배드민턴당 ·농구당 ·블랙베리당 ·곰돌이당 ·비어있당 ·FM당구당 ·블록체인당 ·보드게임당 ·활자중독당 ·볼링친당 ·냐옹이당 ·문명하셨당 ·클래시앙 ·콘솔한당 ·요리한당 ·쿠키런당 ·대구당 ·DANGER당 ·뚝딱뚝당 ·개판이당 ·동숲한당 ·날아올랑 ·전기자전거당 ·e북본당 ·갖고다닌당 ·이브한당 ·도시어부당 ·FM한당 ·포뮬러당 ·안경쓴당 ·차턴당 ·총쏜당 ·땀흘린당 ·하스스톤한당 ·히어로즈한당 ·인스타한당 ·KARA당 ·키보드당 ·꼬들한당 ·덕질한당 ·어학당 ·가죽당 ·레고당 ·LOLien ·Mabinogien ·임시소모임 ·미드당 ·밀리터리당 ·땅판당 ·헌팅한당 ·오른당 ·MTG한당 ·소리당 ·적는당 ·방송한당 ·PC튜닝한당 ·찰칵찍당 ·그림그린당 ·소풍간당 ·심는당 ·품앱이당 ·리듬탄당 ·달린당 ·Sea마당 ·SimSim하당 ·심야식당 ·윈태블릿당 ·미끄러진당 ·축구당 ·나혼자산당 ·스타한당 ·스팀한당 ·파도탄당 ·퐁당퐁당 ·테니스친당 ·테스트당 ·빨콩이당 ·공대시계당 ·터치패드당 ·트윗당 ·VR당 ·시계찬당 ·WebOs당 ·위스키당 ·와인마신당 ·WOW당 ·윈폰이당
임시소모임
고객지원
  • 게시물 삭제 요청
  • 불법촬영물등 신고
  • 쪽지 신고
  • 닉네임 신고
  • 제보 및 기타 제안
© CLIEN.NET
공지[점검] 잠시후 서비스 점검을 위해 약 30분간 접속이 차단됩니다. (금일 18:15 ~ 18:45)

팁과강좌

기타 가장 현대적인 웹을 만들자 2편 (Next.js) 8

13
2018-08-14 23:05:14 수정일 : 2018-08-15 10:45:39 121.♡.197.222
UWHA

원 글 : https://medium.com/@kiyeopyang/%EA%B0%80%EC%9E%A5-%ED%98%84%EB%8C%80%EC%A0%81%EC%9D%B8-%EC%9B%B9%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%9E%90-2%ED%8E%B8-next-js-7d2e38a274


  • 웹 개발에 대한 전반적인 배경 지식이 필요합니다.
  • 가장 현대적인 웹 구조 중 하나인 Node.js, React, GraphQL, Apollo, Prisma, Next.js에 대해 소개합니다. 개발 강의는 아닙니다.
  • 이 단원은 동형 렌더링(Isomorphic Rendering) 또는 유니버설 웹이라 불리는 것에 대해 소개하는 것이 목적입니다.
  • http://noooob.xyz:7000/ 예제 페이지 첨부

웹 페이지를 전달하는 방식은 2가지 방식이 있다. 서버에서 렌더링(서버사이드 렌더링)을 끝내고 전달하는 방식, 그리고 클라리언트에서 렌더링(클라이언트사이드 렌더링)을 할 수 있도록 전달하는 방식이다.

먼저 서버사이드 렌더링은 각 페이지별로 서버에서 렌더링해서 페이지를 보여준다.

클라이언트 사이드 렌더링은 클라이언트 쪽에서 페이지를 변경해주는 것이다. 서버에서는 필요한 데이터만 전송을 받는다. (서버 렌더링에서 페이지 전체를 보내는 것과는 달리)

각 방법은 장단이 있는데 그건 다음과 같다.

서버사이드 렌더링

[장점]

웹 페이지 첫 접속이 빠름

완성된 html을 보내기 때문에 검색엔진에서 검색되기 용이

[단점]

웹 내에서 페이지 이동 시, 계속해서 페이지 전체를 새로 내려받음(느림)

전체적으로 웹 페이지 사용이 느릴 수 밖에 없음


클라이언트사이드 렌더링

[장점]

웹 내에서 페이지 이동 시, 페이지가 아닌 필요 데이터만 주고 받기 때문에 속도가 빠름

전체적인 웹 페이지 사용이 빠름

[단점]

처음 접속 시, 다른 페이지의 내용도 한번에 받기 때문에 로딩이 느림

검색엔진에 검색되기 용이하지 않음


대개 오래된 웹은 전부 서버사이드 렌더링이였고 클라이언트사이드 렌더링 위주의 웹은 최근에서야 많이 나오고 있다. 다만 여전히 검색엔진과 관련된 문제, 첫 접속 시 로딩이 길다는 문제는 클라이언트사이드 렌더링에서 큰 이슈였다.


이를 해결하는 방안으로 나온 것이 동형 렌더링(Isomorphic Rendering 또는 Universal Web) 방식이다. (이 글에서는 Lazy Rendering을 포함한다)이는 서버사이드 렌더링과 클라이언트 사이드 렌더링을 적절히 조합한 것으로 두 방식의 장점을 모두 가진다. 이는 첫 접속은 서버사이드 렌더링으로 이뤄지되, 그 이후에는 클라이언트 사이드 렌더링을 사용하는 것이다.


즉, 다음과 같은 장점을 가진다.

첫 접속 시, 필요한 페이지의 내용만 받기 때문에 로딩이 빠르다.

검색엔진에 검색되기 용이하다.

페이지 이동이 빠르다.

전체적으로 개별적인 상황에 맞춰 데이터를 수신하기 때문에 속도가 빠르다.

http://www.acuriousanimal.com/2016/08/10/universal-applications.html

동형 웹 개념을 기존 기술(JAVA, JSP)로 적용하는 것은 굉장히 어려웠다. 서버 내에서 자바스크립트 코드를 실행해서 렌더링을 할 수 있어야 하는데 이를 적용하는 것이 여간 만만치 않기 때문이다. 체계적으로 구현하는 것이 Python, Java로는 거의 불가능에 가깝다. (유일하게 확인할 수 있었던 Java 기반 React Isomorphic Web도 내부에선 node.js를 사용했다.) 서버에서 js를 실행할 수 있도록 별도의 작업이 필요한데 이게 여간 만만한 작업이 아니다.

다만 이를 Node.js를 사용하면 어느정도 수월하게 할 수 있다. js 인터프리터가 별도로 필요하지도 않고 클라이언트 페이지에서나 서버에서나 같은 코드를 공유할 수 있어, 구현과 설계가 용이해지기 때문이다. Node.js에서 React를 위한 동형 렌더링을 위해 탄생한 것이 Next.js라는 라이브러리다. (Vue에선 Nuxt라는 것이 있다.)

Next.js는 정말로 간단하게 동형 웹을 구현할 수 있도록 도운다. 개인적으로 Node, React 조합으로 사용 시, 서버 렌더링은 굉장히 번거로운 문제였다. 이것을 제일 잘 해결해주는 서비스는 유료 서비스였다.(https://prerender.io/) 이런 나에게 Next.js는 가히 혁명적으로 편리하고 좋은 도구였다. (구체적인 라이브러리 사용법은 본 글의 목적이 아니므로 넘깁니다.)

http://noooob.xyz:7000/ 로 접속하면 간단한 예제 웹 페이지를 확인할 수 있다. nodejs, react, next로 만든 간단한 리스트 페이지이다.

페이지 구조

3가지의 케이스를 보며 알아보겠다.

  1. List Page -> Space 1 -> List Page
  2. Space 1 -> List Page -> Space 2
  3. Space 2 -> List Page -> Space 1
  • 모든 페이지는 첫 접속 시, 서버 사이드 렌더링으로 제공된다.
  • 컨텐츠 데이터는 하드코딩 되어 있으며 ajax는 페이지 구조, 써드파티모듈 로드 시 사용된다.
  1. List Page -> Space 1 -> List Page

스페이스 1은 react-highlight라는 코드 그리는 모듈이 활용 되었다. 이 모듈은 리스트 로딩 시에 로드될 필요가 없기 때문에 페이지에 접속 시에만 모듈이 로딩이 된다. 이에 따라 모듈이 사용되지 않는 곳에서의 페이지 로딩이 빨라진다.

리스트로 돌아왔을 때, 페이지 구조는 이미 처음에 다 로드하였다. 그래서 어떤 네트워킹 과정 없이 바로 페이지 변환이 일어난다.

2. Space 1 -> List Page -> Space 2

스페이스 1을 처음 접속 시, highlight 모듈과 컨텐츠 페이지 구조(space.js)가 로딩 되었다.

리스트로 돌아갔을 땐, 리스트 구조만 별도로 로딩된다.

스페이스 2를 접속했을 때, 페이지 구조는 이미 로딩되어 있기 때문에 바로 이동된다.

3. Space 2 -> List Page -> Space 1

스페이스 2를 로딩하며 컨텐츠 페이지 구조를 로딩한다.

리스트로 돌아오며 리스트 페이지 구조를 로딩한다.

스페이스 1을 로딩 시, 컨텐츠 페이지 구조를 뺀, highlight 모듈만 로드한다.

위와 같은 결과들을 종합해보면,

  1. 처음 로딩 시, 필요한 부분만 로딩한다.
  2. 웹 페이지를 이동 시, 필요한 부분만 로딩한다.
  3. 방문한 페이지를 다시 방문 시, 로딩된 부분은 로딩하지 않는다.

또한, 기본적으로 첫 페이지 로딩은 전부 서버사이드 렌더링으로 제공된다.

그리하여 이러한 동형 렌더링(Isomorphic, Universal) 개념은 기존의 웹의 속도를 혁신적으로 빠르게 할 수 있는 현대적인 개념이라고 본다. (클라이언트 사이드 렌더링의 한계를 극복하는)

UWHA 님의 게시글 댓글
  • 주소복사
  • Facebook
  • X(Twitter)
댓글 • [8]
베타고
IP 210.♡.41.89
08-16 2018-08-16 13:26:55
·
일단 무슨 말인지 잘 모르겠지만ㅜ.ㅜ 흥미가 느껴지는 글이네요. (저도 개발자인데 분야가 워낙 달라서..) 감사합니다.
JINX
IP 211.♡.57.2
08-16 2018-08-16 15:53:43
·
감사합니다. 잘 보고있습니다!!
팜뽀이
IP 125.♡.66.138
08-16 2018-08-16 19:17:25
·
2편 기다리고 있었습니다. 공부 열심히 해볼께요~ 3편도 있는거죠?
사람답게세상
IP 175.♡.33.221
08-17 2018-08-17 07:58:46
·
아오 리엑트 겨우 배우고있는데 또 신기술나오네요 나중에 배워야 하네요
아놔키스트
IP 203.♡.142.11
08-17 2018-08-17 20:58:02
·
좋은 예제 잘 봤습니다. 정말 궁금한 점이요~
"리스트로 돌아왔을 때, 페이지 구조는 이미 처음에 다 로드하였다. 그래서 어떤 네트워킹 과정 없이 바로 페이지 변환이 일어난다. "
리스트가 바뀌기 전까지는 새로운 DATA 요청 없이 이미 로딩된 데이터를 보여주는거로 이해했는데요.
그렇다면 리스트가 그사이에 바뀌게 되면 그때 새로운 리스트 data를 요청해서 받게 되는거죠?
publish/subscribe 구조를 활용하는건지 궁금합니다.

그리고 이건 좀 다른 질문인데요. 위의 상황을 모든 유저에 대해서 대입해보면요.
리스트 data가 바뀌기 전에는 모든 유저가 리스트 요청시, 실제로 DB 갔다오지 않고 캐시처럼 가지고 있다가 내려줄 수 있을까요?
접속자가 굉장히 많은 환경에서는 이런 방식이 DB 부하를 줄이는데 굉장히 유리할것 같아서요.
UWHA
IP 110.♡.27.114
08-17 2018-08-17 22:32:28
·
Pub sub와는 관련이 없구요. 리스트 데이터는 단순함을 위해 하드코딩 했습니다.
Redis는 혹시 어떨까요?
아놔키스트
IP 203.♡.142.11
08-20 2018-08-20 12:39:27
·
음 그러면 리스트 데이터 변경시 어떻게 client에는 언제 어떻게 반영이 되나요?
유저가 새로고침을 해야하나요
UWHA
IP 183.♡.164.84
08-20 2018-08-20 14:12:08
·
새로고침 없구요. ajax 요청을 합니다.
새로운 댓글이 없습니다.
이미지 최대 업로드 용량 15 MB / 업로드 가능 확장자 jpg,gif,png,jpeg,webp
지나치게 큰 이미지의 크기는 조정될 수 있습니다.
목록으로
글쓰기
글쓰기
목록으로 댓글보기 이전글 다음글
아이디  ·  비밀번호 찾기 회원가입
이용규칙 운영알림판 운영소통 재검토요청 도움말 버그신고
개인정보처리방침 이용약관 책임의 한계와 법적고지 청소년 보호정책
©   •  CLIEN.NET
보안 강화를 위한 이메일 인증
안전한 서비스 이용을 위해 이메일 인증을 완료해 주세요. 현재 회원님은 이메일 인증이 완료되지 않은 상태입니다.
최근 급증하는 해킹 및 도용 시도로부터 계정을 보호하기 위해 인증 절차가 강화되었습니다.

  • 이메일 미인증 시 글쓰기, 댓글 작성 등 게시판 활동이 제한됩니다.
  • 이후 새로운 기기에서 로그인할 때마다 반드시 이메일 인증을 거쳐야 합니다.
  • 2단계 인증 사용 회원도 최초 1회는 반드시 인증하여야 합니다.
  • 개인정보에서도 이메일 인증을 할 수 있습니다.
지금 이메일 인증하기
등록된 이메일 주소를 확인하고 인증번호를 입력하여
인증을 완료해 주세요.