728x90

RESTful API란?

 

두 컴퓨터 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위해 사용하는 인터페이스입니다.


REST란 무엇인가요?

Representational State Transfer(REST)는 API 작동 방식에 대한 조건을 부과하는 소프트웨어 아키텍처입니다.

 

REST는 처음에 인터넷과 같은 복잡한 네트워크에서 통신을 관리하기 위한 지침으로 만들어졌습니다.

REST 기반 아키텍처를 사용하여 대규모의 고성능 통신을 안정적으로 지원할 수 있습니다.

쉽게 구현하고 수정할 수 있어 모든 API 시스템을 파악하고 여러 플랫폼에서 사용할 수 있습니다.

균일한 인터페이스

균일한 인터페이스는 모든 RESTful 웹 서비스 디자인의 기본입니다. 이는 서버가 표준 형식으로 정보를 전송함을 나타냅니다. 형식이 지정된 리소스를 REST에서 표현이라고 부릅니다. 이 형식은 서버 애플리케이션에 있는 리소스의 내부 표현과 다를 수 있습니다. 예를 들어, 서버는 데이터를 텍스트로 저장하되, HTML 표현 형식으로 전송할 수 있습니다.

균일한 인터페이스에는 4가지 아키텍처 제약 조건이 있습니다.

  1. 요청은 리소스를 식별해야 합니다. 이를 위해 균일한 리소스 식별자를 사용합니다.
  2. 클라이언트는 원하는 경우 리소스를 수정하거나 삭제하기에 충분한 정보를 리소스 표현에서 가지고 있습니다. 서버는 리소스를 자세히 설명하는 메타데이터를 전송하여 이 조건을 충족합니다.
  3. 클라이언트는 표현을 추가로 처리하는 방법에 대한 정보를 수신합니다. 이를 위해 서버는 클라이언트가 리소스를 적절하게 사용할 수 있는 방법에 대한 메타데이터가 포함된 명확한 메시지를 전송합니다.
  4. 클라이언트는 작업을 완료하는 데 필요한 다른 모든 관련 리소스에 대한 정보를 수신합니다. 이를 위해 서버는 클라이언트가 더 많은 리소스를 동적으로 검색할 수 있도록 표현에 하이퍼링크를 넣어 전송합니다.

무상태

REST 아키텍처에서 무상태는 서버가 이전의 모든 요청과 독립적으로 모든 클라이언트 요청을 완료하는 통신 방법을 나타냅니다. 클라이언트는 임의의 순서로 리소스를 요청할 수 있으며 모든 요청은 무상태이거나 다른 요청과 분리됩니다. 이 REST API 설계 제약 조건은 서버가 매번 요청을 완전히 이해해서 이행할 수 있음을 의미합니다. 

계층화 시스템

계층화된 시스템 아키텍처에서 클라이언트는 클라이언트와 서버 사이의 다른 승인된 중개자에게 연결할 수 있으며 여전히 서버로부터도 응답을 받습니다. 서버는 요청을 다른 서버로 전달할 수도 있습니다. 클라이언트 요청을 이행하기 위해 함께 작동하는 보안, 애플리케이션 및 비즈니스 로직과 같은 여러 계층으로 여러 서버에서 실행되도록 RESTful 웹 서비스를 설계할 수 있습니다. 이러한 계층은 클라이언트에 보이지 않는 상태로 유지됩니다.

캐시 가능성

RESTful 웹 서비스는 서버 응답 시간을 개선하기 위해 클라이언트 또는 중개자에 일부 응답을 저장하는 프로세스인 캐싱을 지원합니다. 예를 들어 모든 페이지에 공통 머리글 및 바닥글 이미지가 있는 웹 사이트를 방문한다고 가정해 보겠습니다. 새로운 웹 사이트 페이지를 방문할 때마다 서버는 동일한 이미지를 다시 전송해야 합니다. 이를 피하기 위해 클라이언트는 첫 번째 응답 후에 해당 이미지를 캐싱하거나 저장한 다음 캐시에서 직접 이미지를 사용합니다. RESTful 웹 서비스는 캐시 가능 또는 캐시 불가능으로 정의되는 API 응답을 사용하여 캐싱을 제어합니다.

온디맨드 코드

REST 아키텍처 스타일에서 서버는 소프트웨어 프로그래밍 코드를 클라이언트에 전송하여 클라이언트 기능을 일시적으로 확장하거나 사용자 지정할 수 있습니다. 예를 들어, 웹 사이트에서 등록 양식을 작성하면 브라우저는 잘못된 전화번호와 같은 실수를 즉시 강조 표시합니다. 서버에서 전송한 코드로 인해 이 작업을 수행할 수 있습니다.


API란 무엇인가요?

애플리케이션 프로그래밍 인터페이스(API)는 다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙을 정의합니다. 개발자는 다른 애플리케이션이 프로그래밍 방식으로 애플리케이션과 통신할 수 있도록 API를 표시하거나 생성합니다. 예를 들어, 근무 시간 기록 애플리케이션은 직원의 전체 이름과 날짜 범위를 요청하는 API를 표시합니다. 이 정보가 수신되면 내부적으로 직원의 근무 시간 기록을 처리하고 해당 날짜 범위에서 근무한 시간을 반환합니다.

웹 API는 클라이언트와 웹 리소스 사이의 게이트웨이라고 생각할 수 있습니다.

클라이언트

클라이언트는 웹에서 정보에 액세스하려는 사용자입니다. 클라이언트는 API를 사용하는 사람이거나 소프트웨어 시스템일 수 있습니다. 예를 들어 개발자는 날씨 시스템에서 날씨 데이터에 액세스하는 프로그램을 작성할 수 있습니다. 또는 사용자가 날씨 웹 사이트를 직접 방문할 때 브라우저에서 동일한 데이터에 액세스할 수 있습니다.

리소스

리소스는 다양한 애플리케이션이 클라이언트에게 제공하는 정보입니다. 리소스는 이미지, 동영상, 텍스트, 숫자 또는 모든 유형의 데이터일 수 있습니다. 클라이언트에 리소스를 제공하는 시스템을 서버라고도 합니다. 조직은 API를 사용하여 리소스를 공유하고 보안, 제어 및 인증을 유지하면서 웹 서비스를 제공합니다. 또한 API는 특정 내부 리소스에 액세스할 수 있는 클라이언트를 결정하는 데 도움이 됩니다.


RESTful API를 사용하면 어떤 이점이 있나요?

RESTful API에는 다음과 같은 이점이 있습니다.

확장성

REST API를 구현하는 시스템은 REST가 클라이언트-서버 상호 작용을 최적화하기 때문에 효율적으로 크기 조정할 수 있습니다. 무상태는 서버가 과거 클라이언트 요청 정보를 유지할 필요가 없기 때문에 서버 로드를 제거합니다. 잘 관리된 캐싱은 일부 클라이언트-서버 상호 작용을 부분적으로 또는 완전히 제거합니다. 이러한 모든 기능은 성능을 저하시키는 통신 병목 현상을 일으키지 않으면서 확장성을 지원합니다.

유연성

RESTful 웹 서비스는 완전한 클라이언트-서버 분리를 지원합니다. 각 부분이 독립적으로 발전할 수 있도록 다양한 서버 구성 요소를 단순화하고 분리합니다. 서버 애플리케이션의 플랫폼 또는 기술 변경은 클라이언트 애플리케이션에 영향을 주지 않습니다. 애플리케이션 함수를 계층화하는 기능은 유연성을 더욱 향상시킵니다. 예를 들어, 개발자는 애플리케이션 로직을 다시 작성하지 않고도 데이터베이스 계층을 변경할 수 있습니다.

독립성

REST API는 사용되는 기술과 독립적입니다. API 설계에 영향을 주지 않고 다양한 프로그래밍 언어로 클라이언트 및 서버 애플리케이션을 모두 작성할 수 있습니다. 또한 통신에 영향을 주지 않고 양쪽의 기본 기술을 변경할 수 있습니다.


 

RESTful API는 어떻게 작동하나요?

RESTful API의 기본 기능은 인터넷 브라우징과 동일합니다. 클라이언트는 리소스가 필요할 때 API를 사용하여 서버에 접속합니다. API 개발자는 서버 애플리케이션 API 문서에서 클라이언트가 REST API를 어떻게 사용해야 하는지 설명합니다. 다음은 모든 REST API 호출에 대한 일반 단계입니다.

  1. 클라이언트가 서버에 요청을 전송합니다. 클라이언트가 API 문서에 따라 서버가 이해하는 방식으로 요청 형식을 지정합니다.
  2. 서버가 클라이언트를 인증하고 해당 요청을 수행할 수 있는 권한이 클라이언트에 있는지 확인합니다.
  3. 서버가 요청을 수신하고 내부적으로 처리합니다.
  4. 서버가 클라이언트에 응답을 반환합니다. 응답에는 요청이 성공했는지 여부를 클라이언트에 알려주는 정보가 포함됩니다. 응답에는 클라이언트가 요청한 모든 정보도 포함됩니다.

REST API 요청 및 응답 세부 정보는 API 개발자가 API를 설계하는 방식에 따라 약간씩 다릅니다.


RESTful API 클라이언트 요청에는 무엇이 포함되어 있나요?

RESTful API에는 다음과 같은 주요 구성요소를 포함하는 요청이 필요합니다.

고유 리소스 식별자

서버는 고유한 리소스 식별자로 각 리소스를 식별합니다. REST 서비스의 경우 서버는 일반적으로 URL(Uniform Resource Locator)을 사용하여 리소스 식별을 수행합니다. URL은 리소스에 대한 경로를 지정합니다. URL은 웹페이지를 방문하기 위해 브라우저에 입력하는 웹 사이트 주소와 유사합니다. URL은 요청 엔드포인트라고도 하며 클라이언트가 요구하는 사항을 서버에 명확하게 지정합니다.

메서드

개발자는 종종 Hypertext Transfer Protocol(HTTP)을 사용하여 RESTful API를 구현합니다. HTTP 메서드는 리소스에 수행해야 하는 작업을 서버에 알려줍니다. 다음은 4가지의 일반적인 HTTP 메서드입니다.

GET

클라이언트는 GET을 사용하여 서버의 지정된 URL에 있는 리소스에 액세스합니다. GET 요청을 캐싱하고 RESTful API 요청에 파라미터를 넣어 전송하여 전송 전에 데이터를 필터링하도록 서버에 지시할 수 있습니다.

POST

클라이언트는 POST를 사용하여 서버에 데이터를 전송합니다. 여기에는 요청과 함께 데이터 표현이 포함됩니다. 동일한 POST 요청을 여러 번 전송하면 동일한 리소스를 여러 번 생성하는 부작용이 있습니다.

PUT

클라이언트는 PUT을 사용하여 서버의 기존 리소스를 업데이트합니다. POST와 달리, RESTful 웹 서비스에서 동일한 PUT 요청을 여러 번 전송해도 결과는 동일합니다.

DELETE

클라이언트는 DELETE 요청을 사용하여 리소스를 제거합니다. DELETE 요청은 서버 상태를 변경할 수 있습니다. 하지만 사용자에게 적절한 인증이 없으면 요청은 실패합니다.

HTTP 헤더

요청 헤더는 클라이언트와 서버 간에 교환되는 메타데이터입니다. 예를 들어, 요청 헤더는 요청 및 응답의 형식을 나타내고 요청 상태 등에 대한 정보를 제공합니다.

데이터

REST API 요청에는 POST, PUT 및 기타 HTTP 메서드가 성공적으로 작동하기 위한 데이터가 포함될 수 있습니다.

파라미터

RESTful API 요청에는 수행해야 할 작업에 대한 자세한 정보를 서버에 제공하는 파라미터가 포함될 수 있습니다. 다음은 몇 가지 파라미터 유형입니다.

  • URL 세부정보를 지정하는 경로 파라미터.
  • 리소스에 대한 추가 정보를 요청하는 쿼리 파라미터.
  • 클라이언트를 빠르게 인증하는 쿠키 파라미터.
728x90
반응형
728x90

React 공부를 위해서 최신 버전에 Node.js를 깔고 진행하던 중

프로젝트를 위해 Node.js 다운그레이드를 해야하는 상황이 생겼다. 

 

사용해야 하는 프로젝트 모듈에서 현재의 node.js 버전이 지원하지 않아서 서버가 안 열리는 현상이 있을 수 있다.

 


여기는 Node.js 현재 버전을 받을 수 있는 곳이며, 클릭하면 node.js 페이지로 바로 가서 다운이 가능하다.

 


지금부터는 기존의 깔려있는 node.js 버전을 변경하는 방법.

 

https://github.com/coreybutler/nvm-windows/releases

 

Releases · coreybutler/nvm-windows

A node.js version management utility for Windows. Ironically written in Go. - coreybutler/nvm-windows

github.com

 

먼저 해당 페이지로 들어간 후

nvm-setup.zip을 다운 받는다.

 

zip 압축을 풀고 setup 파일 실행

 

 

동의만 해주고 계속 next를 눌러 기본설정으로 설치해주시면 됩니다.

 

여기서 기존에 설치되어있던 node는 삭제되고 재설치 됩니다.

 

(노드를 설치할 때 기본 경로 C:\Program Files\nodejs 가 아닌 다른 곳에 설치했다면 nvm 설치 중에 경로를 따로 설정해야할 것 같습니다.)

 

설치후 cmd를 관리자권한으로 실행합니다. 다음 명령어로 노드의 버전을 변경합니다.

 

> node -v // 노드 현재버전 확인
> nvm install <노드 버전> // 변경할 버전을 설치
> nvm use <노드 버전> // 설치한 버전으로 변경
> node -v // 변경된 노드 버전 확인

 

 

728x90
반응형

'console.log("What ? " + Cord); > 개발 공부' 카테고리의 다른 글

RESTful API란?  (0) 2023.10.04
코드(Code), ID(Identifier), OID(Object IDentifier) 란?  (0) 2023.09.08
EAI란 무엇인가?  (0) 2023.06.30
jQuery란 무엇인가?  (0) 2023.06.27
728x90

데이터베이스 및 시스템 디자인에서 사용되는 식별자 및 키(key)와 관련된 용어입니다.


- 코드(Code) : 

  • 코드는 주로 비즈니스 또는 사용자가 이해하고 기억하기 쉬운 형태의 식별자입니다.
  • 코드는 일반적으로 문자열 또는 숫자로 표현되며, 보통 외부 업무 또는 사용자 요구사항과 관련이 있습니다.
  • 코드는 데이터를 검색하고 표시하는 데 사용되며, 종종 사용자 친화적인 형태로 나타납니다.

 

ex)

  • 예를 들어, 온라인 쇼핑 웹사이트에서 제품을 식별하기 위해 사용되는 제품 코드를 생각해보세요.
  • 제품 코드: "ABC123"
  • 이 코드는 고객이 제품을 검색하거나 주문할 때 사용됩니다. 사용자가 이해하기 쉽고 기억하기 쉬운 형태의 식별자입니다.

- ID(Identifier) : 

  • ID(식별자)는 일반적으로 데이터베이스 내에서 레코드를 고유하게 식별하는 데 사용되는 고유한 값입니다.
  • 주로 숫자 또는 내부적으로 생성된 값으로 표현됩니다.
  • ID는 데이터베이스 레코드 간의 관계를 설정하고 검색하는 데 사용됩니다. 데이터베이스 시스템은 이 값을 자동으로 생성하며 관리합니다.

ex)

  • 데이터베이스 내에서 레코드를 고유하게 식별하기 위한 ID를 생각해보세요.
  • 데이터베이스의 사용자 테이블에서 각 사용자에게 할당된 ID를 고려해 봅니다.
  • 사용자 ID: 1001, 1002, 1003
  • 이러한 ID 값은 데이터베이스에서 사용자 레코드를 식별하고 관계를 설정하는 데 사용됩니다.

- OID(Object IDentifier) : 

  • OID(객체 식별자)는 객체 지향 프로그래밍 또는 객체 지향 데이터베이스에서 사용되는 개념입니다.
  • OID는 객체를 식별하고 관리하는 데 사용되며, 객체 지향 데이터베이스에서는 객체를 저장하고 검색할 때 중요한 역할을 합니다.
  • 객체 지향 데이터베이스에서 OID는 일반적으로 숫자 또는 내부적으로 생성된 값으로 표현되며, 데이터베이스 내에서 객체를 고유하게 식별합니다.

ex)

  • 객체 지향 데이터베이스에서 객체를 식별하기 위한 OID를 생각해보세요.
  • 예를 들어, 간단한 객체 지향 데이터베이스에서 학생 객체를 고려해 봅니다.
  • 학생 OID: 101, 102, 103
  • 이러한 OID 값은 데이터베이스 내에서 학생 객체를 식별하고 관계를 설정하는 데 사용됩니다.

코드는 비즈니스나 사용자 관점에서 이해하기 쉬운 식별자이고,

ID는 데이터베이스에서 레코드를 고유하게 식별하는 데 사용되는 값이며,

OID는 객체 지향 데이터베이스에서 객체를 식별하는 데 사용되는 값입니다.

 

데이터 모델링 및 시스템 아키텍처에 따라 다를 수 있으며, 사용되는 컨텍스트에 따라 의미가 달라질 수 있습니다.

728x90
반응형
728x90

EAI는 (Enterprise Application Integration) 약자이다.

 

즉, 기업 내 필요한 여러 어플리케이션(채널)이 있을텐데 이런 각종 애플리케이션 간에 상호 연동이 가능하도록 통합하는 솔루션이라고 생각하면 된다.

 

◆ EAI는 왜 필요한가?

 

전통적인 비즈니스 환경에서 애플리케이션들은 별도의 비즈니스 단위 혹은 기능 내에서 서로 독립적으로 동작하고 사용하는 데이터를 잘 공유하지 않았다. 따라서 이러한 방식은 비즈니스 간의 상호연동이 쉽지 않고 많은 시간이 걸리며 오류가 발생하기 쉬웠다.

 

그러나 EAI를 통해 애플리케이션들을 통합하면 수동적인 개입 없이 비즈니스 프로세스가 더 빨리 실행되고 오류를 줄일 수 있다. 또한 다양한 애플리케이션의 서비스를 결합하여 더 정확한 최신 뷰를 제공할 수 있다. 

 

이처럼 EAI는 기존 비즈니스 환경을 개선하기 위해 등장하였다.

 

◆ EAI의 이점

 

EAI는 비즈니스에 다음과 같은 다양한 이점을 제공한다.

 

1. 비즈니스에서 기회에 더 빠르게 대응

EAI를 통해 비즈니스 프로세스가 자동화되어 다른 부분에 더 집중할 수 있게 된다. EAI에 대한 API 중심 및 이벤트 기반 접근 방식을 사용하면 특별한 기술 없이도 디지털 환경을 빠르게 연결 및 재연결 할 수 있어 비즈니스 효율성과 유연성을 모두 높일 수 있다.

 

 

2. 몰입적인 사용자경험 제공

EAI를 통해 고객에게 비즈니스의 힘을 제공할 수 있다. 고객을 위한 통합되고 생산성이 높은 디지털 환경에 다양한 애플리케이션을 통합할 수 있다. 이를 통해 고객 충성도를 높이고 새로운 유형의 서비스를 쉽게 제공할 수 있다.

 

3. 생산성 향상

 

비즈니스 조직 전반에 걸친 통합 플랫폼의 제한 없는 특성으로 인해 조직 내외부 모든 사용자가 기본 호스팅 플랫폼에 대한 기술적 기능이 없이도 필요한 데이터에 쉽게 접근할 수 있다. 또한 온프레미스(On-premise), 클라우드 등 어디에 배포되어 있든지 쉽게 접근할 수 있다. 

 

4. 새로운 기술로 쉽게 전환 가능

 

API 중심의 통합 및 이벤트 기반 아키텍처를 사용함으로써 시간이 지남에 따라 새로운 기술을 보다 쉽게 수용할 수 있다.

 

 

◆ EAI 접근방식

 

EAI 프로젝트를 성공적으로 수행하기 위해서는 다음과 같은 4가지 사항을 고려해야 한다.

 

Business Requirement

기업에서 EAI 시스템이 가져야할 요구사항이다. 어떤 시스템과 인터페이스를 할것인지, 거래에 대한 추적과 장애 처리를 어떻게 할것인지, 목표 성능은 어느정도 인지 그리고 어떤 시나리오에 따라 시스템들이 통신을 할것인지와 같이 EAI 시스템이 실제 가져야하는 기능적/비기능적 요구 사항들이다

 

Architecture

EAI가 모두 똑같은 설계와 아키텍쳐를 가지는 것은 아니다. 요구 사항에 따라서 아키텍쳐가 변경된다. 아키텍쳐는 EAI 시스템의 요구사항을 구현에 반영하는 중요한 청사진이 된다

 

Process

EAI 프로젝트의 가장 큰 특징중 하나는, EAI의 기본 목적이라는 게 다른 시스템과의 연동이기 때문에, 타 팀과의 커뮤니케이션이 매우 많다는 것이다. 인터페이스 연계에 대한 요건을 맞추고, 테스트를 하고 변경 사항을 반영해야 하는 일이 많고 인터페이스의 수도 보통 300~400개는 넘기 때문에,  인터페이스에 대한 연계 방식을 협의하고 개발 및 배포하는 프로세스를 관리하는 것이 중요하다

 

Development / Production Environment

마지막으로 개발 및 운영 환경에 대한 고려가 필요한데, 앞서 설명했듯이, 타팀과의 인터페이스가 중요하기 때문에 개발에서 완료된 인터페이스 EAI와 연동하는 시스템을 개발하는 팀이 자유롭게 사용할 수 있어야 한다. EAI 자체의 개발환경과 타 팀을 위한 개발 환경이 존재해야 하고, 특히나 대외거래(B2B)의 경우 물리적으로 폐쇄망 (X.25와 같이 기업과 기업을 연결하는 독립적인 회선)이 존재하기 때문에, 개발 및 운영 환경을 어떻게 설계하고 환경간의 이행을 어떻게 해야 하는 가에 대한 고려가 필요하게 된다

728x90
반응형
728x90

jQuery클라이언트 측 HTML 스크립팅을 간소화하기 위해 고안된 크로스 플랫폼 자바스크립트 라이브러리입니다.


1) HTML 문서 탐색

 

브라우저가 웹 페이지를 렌더링할 때 웹 페이지는 DOM(문서 객체 모델)이라는 시각적 표현이 됩니다.

이 모델은 개념적으로 루트와 리프가 있는 특정 노드로 구성된 트리 자료구조로 모델링될 수 있습니다.

 

예를 들어, Web Step Book에서 제공하는 그림 입니다.

 

 

jQuery를 이용하면 DOM의 내용을 쉽게 탐색함으로써 검색할 노드나 요소, 값에 접근하거나 찾을 수 있습니다.

 

즉, 고유 ID를 가진 div 요소의 텍스트를 찾고 있다면 다음과 같이 손쉽게 할 수 있습니다.

 

$( 'div#my-unique-element' ).hide();

span 요소를 모두 순회하는 경우에도 다음과 같이 처리할 수 있습니다.

$( 'span' ).each(function() {
    // Process the span element here 
});

2) HTML 문서 조작

 

이러한 함수 가운데 어떤 함수는 페이지가 로드될 때마다 표시되지 않는 요소를 표시(show)하거나 숨길(hide) 수 있게 하는 것과 같이 간단합니다.

 

또 어떤 함수는 새로운 요소를 생성하고 기존 요소 끝에 덧붙이거나(append) 전체 리스트 앞에 추가(prepend)할 수 있게 해줍니다.

 

class 속성을 추가하기 위해 모든 span 요소를 순회하려고 한다면 다음과 같이 할 수 있습니다.

$( 'span' ).each(function() {
    $( this ).addClass( 'my-custom-class' );
});

3) 이벤트 처리

 

즉, 사용자가 요소를 클릭하거나, 키 입력을 하거나, 마우스를 클릭하면 브라우저는 발생한 이벤트에 해당하는 신호를 발생시킵니다.

 

이를 통해 사용자와 브라우저의 상호작용을 이용할 수 있습니다.

 


jQuery 장점 

◆ 문법의 간결성 = js의 문법을 단순화하고 축약된 형태로 제공하여 가독성을 향상시킨다.

 

◆ 크로스 브라우징 = 다양한 브라우저에서 일관된 동작을 제공하므로 크로스 브라우징에 대한 문제 해결

 

◆ DOM 조작의 편의성 = 다양한 메서드를 제공하여 개발자가 간편하게 DOM 조작을 수행 가능하다.

 

◆ Ajax 처리의 용이성 = 비동기 통신을 쉽게 처리할 수 있다.

 

◆ 풍부한 플러그인 생태계 = 다양한 플러그인이 개발되어 다양한 기능을 추가할 수 있다.

 

jQuery 단점 

◆ 성능 저하 = 라이브러리 파일을 로드해야 하므로 초기 페이지 로딩 시간이 느려질 수 있다.

728x90
반응형

+ Recent posts

728x90
반응형
728x90
반응형