모듈이란 관련 코드를 단일 코드 단위로 캡슐화하는 것입니다. Node.js에서 모듈을 사용하는 방법은 require() 함수를 사용하여 모듈을 가져오는 것입니다. require() 함수를 사용하여 다른 파일의 exports 객체를 가져와서 사용할 수 있습니다.
2.테스트에 대해 어떤 것을 알고 있나요?
테스트는 소프트웨어 개발의 중요한 부분입니다. 프로그래머가 알아야 할 테스트의 종류로는 단위 테스트(Unit Test), 통합 테스트(Integration Test), 시스템 테스트(System Test), 인수 테스트(Acceptance Test) 등이 있습니다.
단위 테스트는 응용 프로그램에서 테스트 가능한 가장 작은 소프트웨어를 실행하여 예상대로 동작하는지 확인하는 테스트입니다. 일반적으로 클래스 또는 메소드 수준으로 정해집니다.
통합 테스트는 단위 테스트보다 더 큰 동작을 달성하기 위해 여러 모듈들을 모아 이들이 의도대로 협력하는지 확인하는 테스트입니다. 통합 테스트는 단위 테스트와 달리 개발자가 변경할 수 없는 부분 (ex. 외부 라이브러리)까지 묶어 검증할 때 사용합니다.
시스템 테스트는 전체 시스템이 요구사항을 충족하는지 확인하는 테스트입니다. 시스템의 기능, 성능, 안정성 등을 검증합니다.
인수 테스트는 사용자 스토리 (시나리오)에 맞춰 수행하는 테스트입니다. 앞선 두 테스트들과 달리 비즈니스 쪽에 초점을 둡니다. 프로젝트에 참여하는 사람들 (ex. 기획자, 클라이언트 대표, 개발자 등)이 토의해서 시나리오를 만들고, 개발자는 이에 의거해서 코드를 작성합니다.
프로미스(Promise)는 비동기 처리를 위한 것이고 async/await는 프로미스를 좀 더 간결하게 사용되기 위한 문법입니다. async 키워드는 함수 앞에 붙는 키워드로, 해당 함수가 비동기 함수임을 의미합니다. async함수는 항상 Promise를 리턴하죠. await 키워드는 async 함수 내부에서만 사용 할 수 있으며, Promise가 resolved 또는 reject될 때까지 기다립니다.
에러핸들링의 차이점으로 프로미스를 활용할 때는 .catch ()문을 통해 에러를 핸들링 하지만 async await는 에러핸들링을 따로 하지 않고 try-catch문을 활용해야 합니다. 코드의 가독성 차이도 있습니다. 프로미스는 콜백지옥은 벗어났지만 .then의 지옥에 빠지는 가능성이 있습니다. 또한 코드가 길어질수록 async/await를 활용한 코드가 가독성이 좋습니다.async/await는 비동기 코드를 동기처럼 읽히게 해줍니다.
2. 스코프와 클로저란 무엇인가요?
스코프
스코프란 변수에 접근하거나 참조할 수 있는 위치를 의미합니다.
자바스크립트에서는 전역스포크와 지역스코프가 있습니다.
엘라의 Scope & Closure - 우아한 테크톡
엘라의 Scope & Closure - 우아한 테크톡
클로저
클로저는 함수 안에 또 다른 함수가 있을 때, 안쪽의 함수가 바깥쪽의 함수의 변수에 접근할 수 있도록 해주는 기능입니다. 이를 통해 안쪽의 함수는 바깥쪽의 함수가 끝나고 사라진 후에도 그 변수를 계속 사용할 수 있습니다.
이렇게 클로저를 사용하면 변수를 보호하거나 데이터를 숨기는 등의 기능을 구현할 수 있습니다.
클로저에 의해 참조된 변수를 자유변수라고 합니다.
<클로저 예제>
const x = 1;
function outer() {
const x = 10;
const inner = function () {
console.log(x);
};
return inner;
}
const ella = outer();
ella(); //10
ella라는 함수에 outer를 집어넣으면서 실행 컨텍스트 스택에서 x = 10;은 사라진 것으로 보입니다.
SQL 인젝션 공격을 방지하기 위해서는 다음과 같은 방법들이 있습니다: Prepared Statement: Prepared Statement를 사용하여 쿼리를 생성하고 실행합니다.
Prepared Statement는 쿼리 템플릿과 변수값을 분리하여 처리하므로, SQL 인젝션 공격이 불가능합니다. 입력값 검증: 사용자로부터 입력받은 값에 대해 검증 및 필터링을 수행합니다.
정규식 등의 기술을 사용하여 입력값이 유효한지 확인하고, 유효하지 않은 경우 에러 메시지를 반환합니다.
XSS (Cross-Site Scripting): 악의적인 스크립트가 실행되지 않도록 입력값을 검증하고 필터링해야 합니다. 이를 위해 입력값을 검증하는 정규식과 같은 기술을 사용하여 입력값을 필터링하고, 출력 시에는 HTML 인코딩과 같은 기술을 사용하여 스크립트가 실행되지 않도록 합니다.
XSS 공격을 방지하기 위해서는 다음과 같은 방법들이 있습니다: 출력값 인코딩: 사용자로부터 입력받은 값을 출력할 때 HTML 인코딩을 수행합니다.
이를 통해 <, >, & 등의 문자가 HTML 태그로 해석되지 않도록 합니다. 입력값 검증: 사용자로부터 입력받은 값에 대해 검증 및 필터링을 수행합니다.
정규식 등의 기술을 사용하여 입력값이 유효한지 확인하고, 유효하지 않은 경우 에러 메시지를 반환합니다.
CSRF (Cross-Site Request Forgery): 사용자가 의도하지 않은 요청이 전송되지 않도록 CSRF 토큰 등의 방법을 사용하여 요청을 검증해야 합니다. 이를 위해 CSRF 토큰을 생성하여 폼에 포함시키고, 요청 시에는 CSRF 토큰 값을 검증하여 유효한 요청인지 확인합니다.
CSRF 공격을 방지하기 위해서는 다음과 같은 방법들이 있습니다: CSRF 토큰: CSRF 토큰을 생성하여 폼에 포함시킵니다. 요청 시 CSRF 토큰 값을 검증하여 유효한 요청인지 확인. Referrer 검증: 요청의 Referer 헤더 값을 검증하여 요청이 유효한 페이지에서 전송되었는지 확인합니다.
2. 개발 방법론 (Development Methodology)에 대해 설명해보세요.
개발 방법론(Development Methodology)은 소프트웨어 개발 프로젝트를 수행하는 데 사용되는 일련의 프로세스와 절차를 말합니다. 이는 프로젝트의 일정, 예산, 품질 등을 관리하고 효율적으로 개발을 진행하기 위해 사용됩니다.
개발 방법론에는 여러 종류가 있습니다. 대표적인 예로는 다음과 같습니다:
Waterfall: 전통적인 개발 방법론으로, 각 단계가 순차적으로 진행됩니다. 요구사항 분석, 설계, 구현, 테스트, 유지보수 등의 단계로 구성됩니다.
장점: 각 단계가 명확하게 구분되어 있어 일정 관리가 용이하고, 문서화가 철저하여 프로젝트의 전체적인 흐름을 파악하기 쉽습니다. 단점: 각 단계가 순차적으로 진행되므로 유연성이 떨어지고, 고객의 요구사항 변화에 대응하기 어렵습니다. 또한 테스트 단계가 마지막에 위치하여 결함이 늦게 발견될 수 있습니다
Agile: 유연한 개발 방법론으로, 고객의 요구사항 변화에 빠르게 대응할 수 있도록 개발 프로세스가 짧은 주기로 반복됩니다. Scrum, Kanban 등이 이에 속합니다.
장점: 짧은 주기로 개발 프로세스가 반복되므로 고객의 요구사항 변화에 빠르게 대응할 수 있습니다. 또한 지속적인 테스트와 피드백을 통해 결함을 빠르게 발견하고 수정할 수 있습니다. 단점: 일정 관리가 어렵고, 문서화가 부족할 수 있습니다. 또한 고객과의 지속적인 소통이 필요하므로 고객의 참여가 활발하지 않으면 프로젝트 진행이 어려울 수 있습니다.
DevOps: 개발(Development)과 운영(Operations)의 협업을 강조하는 개발 방법론으로, 지속적인 통합(CI)과 지속적인 배포(CD)를 통해 빠른 배포와 높은 서비스 품질을 달성하는 것을 목표로 합니다.
장점: 개발과 운영의 협업을 강조하여 개발 속도를 높이고 서비스 품질을 개선할 수 있습니다. 지속적인 통합(CI)과 지속적인 배포(CD)를 통해 빠른 배포와 신속한 대응이 가능합니다. 단점: 개발과 운영의 역할 구분이 모호해질 수 있고, 새로운 도구와 기술의 도입이 필요하여 학습 비용이 발생할 수 있습니다.
자료구조는 메모리를 효율적으로 사용하며 빠르고 안정적으로 데이터를 처리하는 것이 궁극적인 목표로 상황에 따라 유용하게 사용될 수 있도록 특정 구조를 이루고 있다.
알고리즘은 특정 문제를 효율적이고 빠르게 해결하는 것이 궁극적인 목표로 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것을 말한다.
자료구조와 알고리즘은 프로그래밍에서 매우 중요한 개념입니다. 자주 사용되는 자료구조로는 리스트(List), 스택(Stack), 큐(Queue), 트리(Tree), 그래프(Graph) 등이 있습니다. 이러한 자료구조들은 데이터를 상황에 맞게 저장하기 위한 구조로 사용됩니다.
알고리즘은 자료구조에 있는 데이터를 활용해 어떠한 문제를 해결하기 위한 여러 방법들의 모임입니다. 자주 사용되는 알고리즘으로는 순환(Recursion), 정렬(Sorting), 검색(Search) 등이 있습니다.
간단히 말하면, 자료구조는 데이터를 저장하고 조직화하는 방법이며,
알고리즘은 이러한 데이터를 활용하여 문제를 해결하는 방법입니다.
이러한 자료구조와 알고리즘은 프로그래밍에서 데이터의 집합, 관계, 연산을 정의하는데 사용됩니다.
2. 데이터베이스 (Database)와 ORM(Object Relational Mapping)에 대해 설명해보세요.
데이터베이스(Database)는 데이터를 저장하고 관리하는 시스템입니다. 데이터베이스는 데이터의 검색, 삽입, 삭제, 수정 등의 작업을 수행할 수 있습니다.
ORM(Object Relational Mapping)은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 호환성을 높이기 위한 기술입니다. ORM은 데이터베이스의 테이블을 프로그래밍 언어의 클래스로 매핑하고, 테이블의 레코드를 해당 클래스의 객체로 표현합니다. 이를 통해 개발자는 SQL문을 직접 작성하지 않고도 데이터베이스와 상호작용할 수 있습니다.
HTTP와 HTTPS의 가장 큰 차이점은 보안입니다. HTTP란 서버/클라이언트 모델을 따라 데이터를 주고 받기 위한 프로토콜입니다. 이 HTTP에는 3가지 문제가 있습니다.첫 번째HTTP 는 평문 통신이기 때문에 도청이 가능하다.두 번째통신 상대를 확인하지 않기 때문에 위장이 가능하다.세 번째완전성을 증명할 수 없기 때문에 변조가 가능하다. 이 3가지 문제를 해결하기 위해 HTTPS는 SSL(Secure Socket Layer) or TLS(Transport Layer Security)와 같은 프로토콜을 사용하여 공개키/개인키 기반으로 데이터를 암호화하고 있습니다. 데이터는 암호화되어 전송되기 때문에 임의의 사용자가 데이터를 조회하여도 원본의 데이터를 보는 것은 불가능하고, 완정성 또한 증명할 수 있습니다.
2. RESTful API에 대해 설명해보세요.
RESTful API란 Representational State Transfer (REST) 아키텍처 스타일을 따르는 API입니다.
REST는 Representational State Transfer의 줄임말이다. 자원을 자원(resource)의 표현(representation) 으로 구분하여
해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다. REST는 웹 서비스에서 자원을 정의하고 자원에 대한 주소를 지정하는 방법을 제공합니다. RESTful API는 HTTP 메소드를 사용하여 CRUD (Create, Read, Update, Delete) 작업을 수행합니다.
이벤트루프는 자바스크립트의 비동기 작업을 가능하게 해줍니다 자바스크립트의 비동기 작업이 일어날경우 (I/O, setTimeOut) 콜스택에서 실행되면,
라이브러리를 통하여 테크스큐에 쌓이게된다. 이벤트루프는 지속적으로 자바스크립트의 콜스택을 바라보며 비어질때까지 기다린다. 이후 자바스크립트의 콜스택이 비게되면, 테스크큐의 작업을 하나씩 콜스택에 밀어넣어주게된다. 이로서 자바스크립트가 싱글스레드임에도 비동기처리가 가능한 이유입니다.
이벤트 루프는작업이 들어오길 기다렸다가 작업이 들어오면 이를 처리하고,
처리할 작업이 없는 경우엔 잠드는, 끊임없이 돌아가는 자바스크립트 내 루프입니다.
총 6개의 페이즈로 구성되어 있으며 한 페이즈에서 다음 페이즈로 넘어가는 것을 틱이라고 합니다.
각 페이즈는 자신만의 큐를 관리합니다.
이벤트 루프의 6개의 페이즈는 다음과 같습니다: timers: setTimeout(), setInterval()에 의해 스케줄된 콜백들이 수행됩니다. pending callbacks: 다음 loop로 미뤄진 I/O 콜백이 수행됩니다. idle, prepare: 내부적으로 사용됩니다. poll: 새로운 I/O 이벤트를 가져와서 I/O와 관련된 콜백을 수행합니다. check: setImmediate()에 의해 스케줄된 콜백들이 수행됩니다. close callbacks: socket.on('close', ...)와 같이 close와 관련된 콜백이 수행됩니다.
각각의 phase는 FIFO queue를 갖고있는데, 현재 loop에 실행되어야 할 callback들이 callback의 종류에
따라 각 phase에 맞는 곳에 들어가게 됩니다. 각 phase 별로 queue에 callback들을 모두 소진하거나
callback size가 최대를 초과하게 되면, 다음 차례의 phase의 queue에 있는 callback이 실행됩니다 .
2. 콜백 함수 (Callback Function)가 무엇인지, 어떻게 사용되는지 설명해보세요.
콜백 함수는 다른 코드의 인수로서 전달되어 나중에 호출되는 함수입니다. 콜백 함수는 비동기 작업을 처리할 때 주로 사용됩니다. 예를 들어, 파일을 읽거나 웹 API에서 데이터를 가져오는 작업은 시간이 걸리기 때문에 비동기적으로 처리됩니다. 이러한 작업이 완료되면 콜백 함수가 호출되어 결과를 처리합니다.
const fs = require('fs');
fs.readFile('example.txt', 'utf8', function (err, data) {
if (err) throw err;
console.log(data);
});
3번째 인수로 전달된 함수가 콜백함수입니다. 파일을 읽는 작업이 완료되면 콜백함수를 호출하고,
err, data 두개 인수를 전달합니다. 에러 발생시엔 에러 객체가 전달되고, data 인수에는 파일 내용이 전달됩니다.