자료구조는 데이터를 저장하고 관리하는 방법입니다. 궁극적인 목표는 데이터를 빠르고 안정적으로 처리하는 것입니다. 알고리즘은 어떠한 문제를 해결하기 위해 정해진 절차로 특정 문제를 효율적이고 빠르게 해결하는 것을 목표로 합니다.
🔥꼬리질문🔥
< >
2. 주소창에 “www.google.com” 쳤을때 일어나는 일을 설명해주세요.
첫째 DNS 조회를 합니다.입력받은 주소를 DNS서버에 보내 해당 도메인 IP주소로 변환합니다. 둘째 서버 연결을 합니다. 받은 IP주소로 해당 서버에 연결을 시도합니다. 셋째 서버에 HTTP요청을 합니다. 넷째 서버는 요청받은 값에 대한 응답을 생성합니다. 다섯째 응답받은 값을 렌더링합니다. 여섯째 렌더링 된 값을 웹페이지에 표시합니다.
TypeORM은 Node.js에서 관계형 데이터베이스를 사용하는 데 사용되는 ORM입니다. ORM은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 매핑을 제공하는 소프트웨어 도구입니다. Query Builder는 TypeORM의 기능 중 하나로 SQL 쿼리에 대한 깊은 이해없이 데이터베이스에 대한 복잡한 쿼리를 작성할 수 있습니다.
🔥꼬리질문🔥
< N+1 문제에 대해 설명해주세요. >
N+1 문제는 데이터베이스 쿼리 성능 문제로, 1번의 쿼리로 N건의 데이터를 가져왔는데, 관련 컬럼을 얻기 위해 쿼리를 N번 추가로 수행하는 문제를 말합니다. 이 문제는 쿼리결과 건수마다 참조 정보를 얻기 위해 건수만큼 반복해서 쿼리를 수행하게 되는 경우 발생합니다.
N+1 문제는 성능에 큰 영향을 줄 수 있기 때문에 해결하는 것이 중요합니다. 해결 방법은 연관된 데이터를 한 번에 조회하는 방법입니다. 예를 들어 게시물 엔티티를 조회할 때, 댓글 엔티티를 조인하여 한 번에 조회하는 방식으로 구현할 수 있습니다. 다른방법으로는 Fetch Join은 엔티티를 조회할 때 연관된 엔티티를 미리 조회하는 방법입니다.
2. JWT와 세션과 쿠키의 차이점을 설명해주세요.
쿠키는 클라이언트에 저장되는 작은 데이터 파일입니다. 서버가 클라이언트에게 쿠키를 전송하면, 클라이언트는 이후 요청 시 쿠키를 함께 전송하여 서버가 클라이언트를 식별할 수 있도록 합니다.
세션은 서버에서 클라이언트의 상태 정보를 저장하는 기술입니다. 세션은 쿠키와 달리 서버에 저장되며, 클라이언트는 세션 ID를 쿠키에 저장하여 서버와 통신합니다. 서버는 세션 ID를 통해 클라이언트의 상태 정보를 식별합니다.
JWT는 토큰 기반 인증 방식으로, 서버가 클라이언트에게 토큰을 발급하고 클라이언트는 이후 요청 시 토큰을 함께 전송하여 서버가 클라이언트를 식별할 수 있도록 합니다. JWT는 헤더, 페이로드, 서명으로 구성되며, 페이로드에는 클라이언트의 정보가 포함될 수 있습니다.
세 가지 방식의 차이점은 저장 위치와 보안성에 있습니다. 쿠키는 클라이언트에 저장되며 보안성이 낮습니다. 세션은 서버에 저장되며 보안성이 높습니다. JWT는 클라이언트에 저장되지만, 서명을 통해 보안성을 유지합니다..
🔥꼬리질문🔥
< 엑세스토큰과 리프레쉬 토큰에 대해 간략하게 설명해주세요. >
액세스 토큰은 서버에 대한 일시적인 액세스 권한을 부여하는 데 사용됩니다. 서버에 리소스에 대한 액세스를 요청할 때마다 클라이언트는 액세스 토큰을 전송합니다. 서버는 토큰을 확인한 다음 요청을 승인하거나 거부합니다.
리프레시 토큰은 새 액세스 토큰을 요청하는 데 사용됩니다. 액세스 토큰이 만료되면 클라이언트는 리프레시 토큰을 사용하여 새 액세스 토큰을 요청할 수 있습니다. 서버는 토큰을 확인한 다음 새 액세스 토큰을 발급합니다.
액세스 토큰은 짧은 시간 동안만 유효하고 리프레시 토큰은 더 오랜 시간 동안 유효합니다. 이를 통해 클라이언트는 서버에 리소스에 대한 지속적인 액세스 권한을 유지하면서 액세스 토큰을 자주 새로 고칠 필요가 없도록 할 수 있습니다.
Redis와 Memcached는 모두 키-값 저장소이지만 몇 가지 주요 차이점이 있습니다. Redis는 Memcached보다 더 광범위한 데이터 유형을 지원합니다. Redis는 정수, 문자열, 목록 및 해시와 같은 다양한 데이터 유형을 저장할 수 있는 반면 Memcached는 문자열만 저장할 수 있습니다. Redis는 Memcached보다 더 많은 기능을 제공합니다. Redis는 스트림, 큐 및 세션을 포함한 다양한 기능을 제공하는 반면 Memcached는 이러한 기능을 제공하지 않습니다. Redis는 Memcached보다 확장성이 뛰어납니다. Redis는 분산된 방식으로 실행할 수 있는 반면 Memcached는 분산된 방식으로 실행할 수 없습니다. 전반적으로 Redis는 Memcached보다 더 기능적이고 확장성이 뛰어나고 다양한 데이터 유형을 지원하는 더 광범위한 데이터베이스입니다. 그러나 Memcached는 Redis보다 단순하고 사용하기 쉬우며 더 빠릅니다.
🔥꼬리질문🔥
< >
2. XSS와 CSRF에 대해 설명해주세요.
XSS는 공격자가 악성 스크립트를 웹 페이지에 삽입하여 사용자가 악성 스크립트를 실행하도록 유도하는 공격입니다. 공격자가 사용자의 쿠키나 세션 정보를 훔치거나 사용자를 다른 웹사이트로 리디렉션하는 데 사용할 수 있습니다. CSRF는 공격자가 사용자가 웹 애플리케이션에 요청을 보내도록 유도하여 의도하지 않은 작업을 수행하는 공격입니다. 공격자는 사용자의 계정을 제어하거나 돈을 훔치거나 기타 피해를 입히는 데 사용할 수 있습니다.
RDBMS는 관계형 데이터베이스로 데이터를 테이블에 저장하는 데이터베이스입니다. 엔티티 간의 관계를 정의하고 스키마를 엄격하게 관리합니다. 반면 NoSQL은 키-값, JSON문서, 그래프 등의 다양한 방법으로 데이터를 저장하는 데이터베이스입니다. 일관성이 낮은 대량의 데이터를 저장하는 애플리케이션에 적합합니다.
<데이터 모델>
RDBMS는 데이터를 테이블에 저장하는 관계형 데이터 모델을 사용합니다.
NoSQL 데이터베이스는 JSON 문서, 키-값 쌍 또는 그래프와 같은 다양한 방법으로 데이터를 저장할 수 있습니다.
<일관성>
RDBMS는 데이터가 항상 일관되게 유지되도록 하는 ACID 속성을 지원합니다.
NoSQL 데이터베이스는 일관성 속성을 지원하지 않을 수 있습니다.
<확장성>
RDBMS는 일반적으로 수직 확장(성능업)을 통해 확장됩니다.
NoSQL 데이터베이스는 일반적으로 수평 확장(서버 추가)을 통해 확장됩니다.
<사용>
RDBMS는 일반적으로 OLTP(온라인 트랜잭션 처리) 애플리케이션에 사용됩니다.
NoSQL 데이터베이스는 일반적으로 OLAP(온라인 분석 처리) 애플리케이션 및 대량 데이터 애플리케이션에 사용됩니다.
🔥꼬리질문 : 관계형 데이터베이스는 왜 관계형이란 이름이 붙을까요?🔥 관계형 데이터베이스는 데이터가 서로 관련된 방식으로 테이블에 저장되기 때문에 관계형이라고 합니다. 테이블은 행과 열로 구성되며 행은 데이터 레코드이고 열은 데이터 필드입니다. 테이블은 관계를 통해 함께 연결할 수 있으며 관계는 데이터의 논리적 관계를 나타냅니다. 예를 들어 고객 테이블과 주문 테이블은 고객 ID 열을 통해 연결될 수 있습니다. 즉, 특정 고객 ID에 대한 모든 주문을 검색할 수 있습니다.
🔥꼬리질문 : 프로젝트에서 RDBMS를 사용한 이유는?🔥 저희 최종프로젝트의 주제는 맛집SNS였습니다. 팔로워와 팔로잉간의 관계, 게시물의 좋아요와 댓글 등 다양한 데이터들이 서로 관계가 있기 때문에 NoSQL보다는 RDBMS에 적합하다 생각하여 RDBMS를 채택하게 되었습니다.
🔥꼬리질문 : NoSQL를 사용하는 이유는 무엇일까요?🔥 NoSQL을 사용하는 이유는 다양합니다.
첫째, RDBMS보다 많은 리소스가 필요하지 않기 때문에 대량의 데이터를 저장할 수 있습니다.
둘째, 수직확장(기능업)하는 RDBMS보다 NoSQL의 수평확장(서버추가)이 확장하기 용이합니다.
셋째, NoSQL은 복잡한 쿼리문을 사용하지 않기 때문에 사용하기가 편합니다.
그래서 NoSQL은 로그기록과 같이 데이터 일관성이 낮은 대량의 데이터를 처리할때 적합합니다.
🔥꼬리질문 : 트랜젝션에 대해 설명해주세요.🔥 트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다. 트랜잭션의 주요 목적은 데이터의 무결성과 일관성을 보장하는 것입니다. 여러 작업을 단일 트랜잭션으로 그룹화하여 트랜잭션 내의 모든 작업이 성공적으로 실행되거나 아무 것도 실행되지 않도록 할 수 있습니다.
트랜잭션은 신뢰할 수 있고 일관된 데이터 처리를 보장하는 ACID속성을 따릅니다.
트랜잭션은 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 지속성(Durability)의 4가지 특징을 가집니다.
원자성은 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것을 의미합니다. 일관성은 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것을 의미합니다. 독립성은 둘 이상 트랜잭션이 동시 실행시 어떤 트랜젝션이라도 다른 트랜잭션 연산에 끼어들 수 없다는 점을 의미합니다. 지속성은 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다는 점입니다.
2. REST API에 대해 설명해주세요.
RESTful API란 REST 아키텍처 스타일을 따르는 API입니다. 웹 서비스에서 자원을 정의하고 HTTP 메소드를 사용하여 CRUD작업을 수행합니다. REST의 핵심은 요청의 목적을 명시적으로 드러내도록 작성하는 것 입니다.
🔥꼬리질문 : URL과 URI 차이점을 설명해주세요.🔥
URL과 URI는 모두 자원을 식별하는데 사용되지만 의미가 다릅니다. URL은 네트워크에서 자원을 식별하는데 사용되는 URI의 일종입니다. 예를 들어 http naver.com의 url은 웹사이트의 기본페이지인 index.html 파일이 있는 위치를 식별합니다.
URI는 네트워크에서 자원을 식별하는 것에 사용되는 URI의 일종입니다. URL, URN 및 기타 자원 식별자를 포함하는 포괄적인 용어입니다. 따라서 모든 URL은 URI지만, 모든 URI는 URL은 아닙니다. URI는 파일, 웹 사이트, 이메일 메시지 또는 기타 네트워크 리소스를 식별하는 데 사용할 수 있습니다. URL은 네트워크에서 자원의 위치를 식별하는 데만 사용할 수 있습니다.
결론적으로는 URL은 자료의 위치, URI는 자료의 식별자라고 보시면 됩니다.
🔥꼬리질문 : HTTP와 HTTPS 차이점을 설명해주세요.🔥 HTTP와 HTTPS의 주요 차이점은 데이터가 전송되는 방식, 즉 SSL의 유무입니다. HTTPS는 HTTP 프로토콜에 보안 기능을 추가한 것으로, 이 보안 기능은 매우 중요합니다. HTTP는 데이터를 평문으로 전송하는 반면 HTTPS는 암호화된 연결을 사용하여 데이터를 전송합니다. 즉, HTTPS는 HTTP보다 안전합니다.
SSL(Secure Sockets Layer)은 웹 서버와 클라이언트 간에 보안 연결을 설정하는 데 사용되는 암호화 프로토콜입니다. 보안강화하는 방법으로는 암호화, 인증, 무결성이 있습니다.
🔥꼬리질문 :Stateless Protocol에 대해 설명해주세요.🔥 Stateless Protocol은 서버가 클라이언트에 대한 정보를 저장하지 않는 프로토콜입니다.
즉, 각 요청은 독립적으로 처리되고 서버는 이전 요청이나 다음 요청에 대한 정보를 저장하지 않습니다.
Stateless Protocol에는 다음과 같은 장점이 있습니다. 1. 확장성: 클라이언트 수가 많더라도 확장하기 쉽습니다. 서버는 클라이언트에 대한 정보를 저장할 필요가 없으므로 확장할 때 더 많은 컴퓨팅 리소스가 필요하지 않습니다. 2. 효율성: 서버는 클라이언트에 대한 정보를 저장할 필요가 없으므로 각 요청을 처리하는 데 더 적은 리소스가 필요합니다. 3. 보안: 서버는 클라이언트에 대한 정보를 저장할 필요가 없으므로 공격자가 클라이언트에 대한 정보를 훔칠 가능성이 줄어듭니다.
상태가 없는 프로토콜에는 다음과 같은 단점도 있습니다. 1. 추적하기 어려움: 서버는 클라이언트에 대한 정보를 저장할 필요가 없으므로 각 요청을 추적하기가 어렵습니다. 2. 낮은 사용자 경험: 예를 들어, 로그인한 상태를 유지하려면 서버는 클라이언트에 대한 정보를 저장해야 합니다.
전반적으로 상태가 없는 프로토콜은 확장성, 효율성 및 보안성을 제공합니다. 그러나 추적하기 어렵고 사용자 경험이 떨어질 수 있습니다.
자바스크립트는 동적타입의 인터프리터 언어로 런타임에서 오류를 발견할 수 있습니다. 반면 타입스크립트는 정적타입의 컴파일언어로 컴파일타임에 오류를 발견할 수 있습니다. 주요 차이점은 타입시스템의 유무입니다. 자바스크립트는 빠른 코드 작성과 작고 간단한 프로젝트에는 적합하지만, 타입스크립트는 대규모 프로젝트와 유지보수가 필요한 프로젝트에는 더욱 적합합니다.
<동적타입 vs 정적타입>
동적타입은 변수의 타입이 실행 시간에 결정되는 것을 의미합니다. 즉, 변수를 선언할 때 타입을 지정하지 않습니다.
반면 정적타입은 변수의 타입을 컴파일 시간에 결정하는 것을 의미합니다. 즉 변수를 선언할 때 반드시 타입을 지정해야 합니다.
<인터프리터 언어 vs 컴파일 언어>
인터프리터 언어는 컴파일 과정 없이 코드를 한 줄씩 읽어가며 실행하는 언어를 의미합니다.
반면 컴파일 언어는 코드가 실행되기 전에 컴파일러에 의해 기계어로 번역되는 언어를 의미합니다.
<런타임 vs 컴파일>
런타임은 프로그램이 실행되는 시간을 의미합니다.
반면에 컴파일은 작성된 코드를 컴퓨터가 실행하는 기계어로 변환하는 과정을 의미합니다.
🔥꼬리질문 : 타입스크립트는 어떠한 과정을 통해 자바스크립트로 변환되는 걸까요?🔥 타입스크립트는 타입스크립트 컴파일러에 의해 자바스크립트로 변환됩니다. 이 과정은 다음과 같은 단계로 이루어집니다.
1. 타입스크립트 컴파일러는 타입스크립트 소스 코드를 읽어들입니다. 2. 컴파일러는 소스 코드의 문법을 검사하고, 타입 검사를 수행합니다. 이 과정에서 오류가 발견되면 컴파일러는 오류 메시지를 출력합니다. 3. 문법 검사와 타입 검사가 성공적으로 완료되면, 컴파일러는 타입스크립트 소스 코드를 자바스크립트 코드로 변환합니다. 4. 변환된 자바스크립트 코드는 실행 파일 형태로 저장됩니다.
이렇게 타입스크립트는 컴파일 과정을 거쳐 자바스크립트로 변환되며,
변환된 자바스크립트 코드는 일반적인 자바스크립트 코드처럼 실행됩니다.
🔥꼬리질문 : ?🔥 아직 작성중
2. Var, Let, Const의 차이점을 설명해주세요.
Var는 동일한 이름으로 중복해서 변수 선언이 가능합니다. 이와 같은 경우 마지막에 할당된 값이 변수에 저장되어 에러없이 각자 다른 값이 출력됩니다. let과 const는 var의 중복선언을 보완하기 위해 등장했습니다. let은 중복 선언은 가능하지만 값의 재할당은 불가능합니다. const는 중복 선언과 값의 재할당 모두 불가능합니다. 그래서 주로 const는 상수를 선언하는 키워드로 사용됩니다.
var = 재선언O, 재할당O let = 재선언X, 재할당O const = 재선언X, 재할당X
var는 var로 선언한 변수는 동일한 이름으로 여러 번 중복해서 선언이 가능합니다. 이와 같은 경우, 마지막에 할당된 값이 변수에 저장되며 중복으로 사용될 경우 에러 없이 각기 다른 값이 출력 됩니다.
let과 const는 var의 중복으로 선언하는 것을 보완하기 위해 등장 했습니다.
let은 중복 선언은 불가능하지만 값을 재할당하는 것은 가능합니다.
const는 let과 마찬가지로 중복 선언은 불가능하고 값 재할당 또한 불가능하다는 특징이 있습니다.
그래서 주로 const는 상수를 선언하는 키워드로 사용됩니다.
🔥꼬리질문 : TDZ와 호이스팅에 대해 설명해주세요.🔥 TDZ(Temporal Dead Zone)는 let과 const로 선언된 변수가 초기화되기 전까지의 시간을 의미합니다.
TDZ 내에서 해당 변수에 접근하려고 하면 ReferenceError가 발생합니다.
예를 들어, 다음 코드를 살펴보겠습니다.
console.log(x); // ReferenceError: x is not defined
let x = 10;
해당 코드에서 x는 let으로 선언되었지만 초기화되기 전에 접근하려고 하므로 ReferenceError가 발생합니다.
호이스팅(hoisting)은 변수와 함수 선언이 해당 스코프의 최상단으로 끌어올려지는 현상을 의미합니다.
호이스팅은 var로 선언된 변수와 함수 선언문에서 발생합니다.
예를 들어, 다음 코드를 살펴보겠습니다.
console.log(x); // undefined
var x = 10;
위 코드에서 x는 var로 선언되었으므로 호이스팅이 발생하여 변수 선언이 스코프의 최상단으로 끌어올려집니다.
PCB(Process Control Block)은 운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료구조를 말합니다. 컨텍스트 스위칭을 할때 기존 프로세스의 상태를 알아야 다음에 작업을 이어나갈 수 있습니다. 즉, PCB는 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보를 저장하는 임시저장소입니다. PC(Program Counter)는 CPU의 레지스터 중 하나로, 다음에 실행할 명령어의 주소를 저장합니다. 캐시 메모리는 CPU와 주기억장치 사이에 위치한 고속 메모리입니다. 캐시 메모리는 주기억장치에서 자주 사용되는 데이터를 저장하여 CPU가 데이터에 빠르게 접근할 수 있도록 합니다.
🔥꼬리질문🔥
< >
2. Hash Function, HashTable에 대해 설명해주세요.
해시 함수는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수입니다. 해시 함수는 일반적으로 해시 테이블에서 키 값을 인덱스로 변환하는 데 사용됩니다. 해시 테이블은 키-값 쌍을 저장하는 자료구조입니다. 해시 테이블은 해시 함수를 이용하여 키 값을 인덱스로 변환하고, 이 인덱스를 이용하여 값을 저장하거나 검색합니다. 해시 테이블은 평균적으로 O(1)의 시간 복잡도로 데이터의 저장, 검색, 삭제가 가능합니다.
클로저는함수 안에 또 다른 함수가 있을 때, 안쪽의 함수가 바깥쪽의 함수의 변수에 접근할 수 있도록 해주는 기능입니다. 이를 통해 안쪽의 함수는 바깥쪽의 함수가 끝나고 사라진 후에도 그 변수를 계속 사용할 수 있습니다.
이렇게클로저를 사용하면변수를 보호하거나 데이터를 숨기는 등의 기능을 구현할 수 있습니다.
클로저에 의해 참조된 변수를자유변수라고 합니다.
🔥꼬리질문🔥
< 요즘에는 클로저를 쓰는 경우가 거의 없는데 그 이유는 무엇이며, 클로저를 대신하는 건 뭐가 있나요? >
클로저는 JavaScript에서 강력한 도구가 될 수 있지만 복잡할 수도 있습니다. 클로저는 함수가 종료된 후에도 외부 변수에 액세스할 수 있으므로 메모리 누수의 원인이 될 수 있습니다. 클로저는 또한 코드를 복잡하게 만들 수 있으므로 이해하고 유지 관리하기 어려울 수 있습니다. 이러한 이유로 최근에는 클로저를 사용하지 않는 경우가 많습니다. 클로저를 대신하여 클로저의 이점을 제공하지만 복잡하거나 메모리 누수의 원인이 되지 않는 다른 기술이 사용됩니다. 이러한 기술에는 객체 지향 프로그래밍, 모듈 시스템 및 고차 함수가 포함됩니다. 객체 지향 프로그래밍은 개체를 사용하여 데이터와 기능을 그룹화하는 방법입니다. 객체는 클로저 없이 데이터를 유지하는 데 사용할 수 있으며 클로저의 메모리 누수 위험을 제거할 수도 있습니다. 모듈 시스템은 코드를 독립적인 단위로 구성하는 방법입니다. 모듈은 클로저 없이 코드를 모듈화하고 재사용 가능하게 만드는 데 사용할 수 있습니다. 고차 함수는 다른 함수를 인수로 취하거나 함수를 반환하는 함수입니다. 고차 함수는 클로저 없이 코드를 더 간결하고 효율적으로 만드는 데 사용할 수 있습니다.
< 클로저 사용시 주의해야 할 점은 무엇인가요? >
의도하지 않은 변수 참조: 클로저는 외부 함수 내의 변수에 액세스할 수 있습니다. 따라서 클로저를 사용하지 않을 때는 의도하지 않은 변수에 액세스하지 않도록 주의하는 것이 중요합니다. 메모리 누수: 클로저는 함수가 종료된 후에도 외부 변수에 액세스할 수 있습니다. 따라서 클로저를 사용하지 않을 때는 외부 변수를 해제하는 것이 중요합니다. 복잡성: 클로저는 코드를 복잡하게 만들 수 있습니다. 따라서 클로저를 사용하는 경우 코드가 이해하고 유지 관리하기 쉬운지 확인하는 것이 중요합니다.
< 클로저를 사용하는 것이 어떤 이점이 있나요? >
콜백 함수: 클로저는 콜백 함수를 만드는 데 사용할 수 있습니다. 콜백 함수는 나중에 호출될 함수입니다. 클로저는 이벤트 핸들러, 타이머 및 기타 비동기 작업과 같은 콜백 함수를 만드는 데 사용할 수 있습니다. 상태 유지: 클로저는 함수가 종료된 후에도 데이터를 유지하는 데 사용할 수 있습니다. 이것은 타이머, 로깅 및 기타 데이터를 추적해야 하는 애플리케이션에 유용할 수 있습니다. 고차 함수: 클로저는 고차 함수를 만드는 데 사용할 수 있습니다. 고차 함수는 다른 함수를 인수로 취하거나 함수를 반환하는 함수입니다. 고차 함수는 코드를 더 모듈화되고 재사용 가능하게 만드는 데 사용할 수 있습니다. 동적 기능: 클로저는 동적 기능을 만드는 데 사용할 수 있습니다. 동적 기능은 호출될 때까지 정의되지 않는 함수입니다. 클로저는 템플릿 엔진, 데이터 바인딩 및 기타 동적 기능을 만드는 데 사용할 수 있습니다.