백엔드 개발자(Java/Node) 기술면접 대비 개념정리

nn98·2023년 3월 17일
0

기술면접

목록 보기
1/1

SW 마에스트로 심층면접 준비하며 정리한 자료.
Github언어분포 참고하시고 사용한 스택만 보시길 권장

자바

Strength:

가상머신 메모리관리, 이식성 / 운영체제에 구애받지 않고 사용

Weakness :

가상머신으로 인해 컴파일링 시간 느림.

코딩 컨벤션 :

코드 작성 규칙, 들여쓰기 변수명 주석

코드 플로우 :

코드 실행 흐름, 다이어그램까진 안그려도 구조를 이해하고 작성

객체 지향 :

데이터와 메소드를 객체라는 단위로 묶어 프로그래밍. 객체간 상호작용
캡슐화 등으로 안정성 유지보수성 향상

람다 :

인터페이스추상클래스 구현하는 익명메소드 표현법 Java 8

추상 클래스 :

필드값 설정 및 메소드 내부 코딩 가능, 추상적 개념

인터페이스 :

상수, 메소드명만 가능, 다중 상속

제네릭 :

클래스/메소드에 사용될 변수의 타입을 지정하지 않은 것
타입 안정성 재사용성 유지보수성. Java 5

JVM Heap :

운영체제에서 할당받은 메모리. 객체 생성시 메모리 할당하고 GC으로 회수
스트링은 스트링 풀. 관리 및 저장되는 공간이 다름.

스트링 풀 :

스트링 객체들을 관리하고 프로그램의 효율을 향상.
스트링은 이뮤터블하기에 동일한 값을 가진 객체를 생성한다면
이미 존재하는 같은 값의 객체를 참조하도록 변환해준다.

TMI) 알고리즘 강의에서 이뮤터블, 스트링을 배울 때 값과 주소 비교가 다르다 배움
(equals, ==) 궁금해서 직접 비교해보니 의외의 결과가 나옴

String s1 = "ab";
String s2 = "ab";
System.out.println(s1==s2); // true

배운대로면 같은 값지지만 참조하는 주소가 달라 false가 나와야하지만 true가 나온 것.
교수님께 질문하니 스트링 풀을 가볍게 설명해주시고 좋은 자세라고 격려받음.
검색해보니 원래대로면 flase지만 따옴표로 만든 스트링
자바가 자체적으로 스트링 풀을 확인하고, 같은 값이 존재할 경우 경우 재사용
이 때 INTERN 메소드로 풀에서 같은값 탐색.
실행 결과 추론 문제에서 써먹기 좋을 듯.

노드

Definition :

V8 + 비동기 이벤트 드리븐 라이브러리 libuv

Strength :

비동기 이벤트 드리븐 방식과 V8엔진을 사용하기에 성능 우수
인터프리터 언어 특성상 컴파일러 기반 언어로 구현된 서비스에 비해
느릴 수 있지만 자바스크립트는 인터프리터 기반 언어 중 빠른 편에 속하고
비동기 이벤트 드리븐을 활용해 구현한다면 해당 단점을 충분히 보완 가능

Weakness :

복잡한 연산, 높은 복잡/난이도, 서버 체크 로직 다수 등의 경우에 별로

pm2:

pm2는 Node.js 애플리케이션을 관리하기 위한 프로세스 매니저이다.
Node.js 애플리케이션을 실행, 관리, 로깅하는데 도움을 준다.
무중단 배포를 지원하며, 애플리케이션의 상태를 모니터링할 수 있다.

express:

express는 Node.js의 웹 프레임워크 중 하나이다.
HTTP 요청을 처리하는 라우팅 및 미들웨어를 제공하며,
빠르고 유연한 웹 애플리케이션 개발을 가능하게 한다.

cors:

cors는 Cross-Origin Resource Sharing을 처리하기 위한
Node.js 패키지이다. 다른 도메인에서 요청이 온 경우에 대해
처리할 수 있게 해 준다.
! CORS err

body-parser:

body-parser는 HTTP 요청에서 body를 파싱하기 위한
Node.js 패키지이다. JSON, URL-encoded 등
다양한 형식의 데이터를 파싱할 수 있다.

wait-notify:

wait-notify는 Node.js의 이벤트 기반 비동기 처리에서
동기적인 처리를 가능하게 하는 패키지이다.
일반적인 JavaScript에서 지원하지 않는 wait, notify 기능을 제공한다.

puppeteer:

puppeteer는 Headless Chrome을 제어할 수 있는 Node.js 패키지이다.
웹 페이지 스크래핑, UI 테스트, 웹 페이지 자동화 등에 활용될 수 있다.

cheerio:

cheerio는 Node.js의 jQuery와 유사한 DOM 조작 라이브러리이다.
웹 페이지 스크래핑 등에 활용된다.

fs:

fs는 Node.js의 파일 시스템 모듈이다.
파일을 생성, 수정, 삭제하는 등의 파일 시스템 조작을 수행할 수 있다.

안드

Activity :

UI 컴포넌트, 라이프사이클 메소드, 액티비티/서비스와 연동, 상호작용

AsyncTask :

메인 스레드가 UI, 이벤트 처리 실행하는 동안
영향을 주지 않고 작업할 비동기 실행 흐름.
실행 > 백그라운드 > 진행 업데이트 > 완료 후 처리
추상 클래스, 제네릭 <Params, Progress, Result>
가변 인자 (Params ...), (Progress ...)
onPreExecute, doInBackground, onProgressUpdate, onPostExecute

공통

프레임워크 :

여러 기능의 클래스, 라이브러리의 집합.
모듈화를 통해 재사용성 향상 모듈화된 객체들을 큰 그룹 단위로 묶은 집합.
특정 결과물을 구현하기 위한 집합이기에 일종의 상태적 유사성 보유.
마이크로 <> 풀 스택 프레임워크.

인터프리터 :

코드 한줄씩 컴파일없이 실행.

의존성 주입 :

객체 지향 프로그래밍에서 매우 중요한 개념 중 하나.
생성자 주입은 이러한 의존성 주입 방식 중 하나로, 생성자를 통해
객체의 의존성을 주입하는 방식입니다. 이 방식을 사용하는 이유는 다음과 같습니다.

  • 의존성의 명시성과 제어
    생성자 주입 방식을 사용하면 객체가 필요로 하는 의존성이 무엇인지 명확하게
    표현할 수 있습니다. 즉, 코드를 작성하는 시점에서 해당 객체가 어떤 의존성을
    필요로 하는지 알 수 있습니다. 이는 코드의 가독성을 높이고, 코드의 유지보수를
    용이하게 만듭니다.
    또한, 생성자 주입 방식을 사용하면 의존성의 제어가 가능합니다.
    즉, 객체를 생성할 때 의존성을 직접 생성하는 것이 아니라,
    외부에서 의존성을 주입할 수 있습니다. 이를 통해 객체 간의 결합도를
    낮출 수 있습니다. 예를 들어,
    의존성이 있는 객체 A를 생성할 때 객체 B를 생성하고,
    객체 B를 생성할 때 객체 C를 생성해야 한다면,
    생성자 주입 방식을 사용하면 객체 A가 직접 객체
    B와 C를 생성하지 않고, 외부에서 주입받을 수 있습니다.
설명 개복잡하게하네;
  • 테스트 용이성
    생성자 주입 방식은 테스트 용이성을 높입니다.
    의존성이 있는 객체를 테스트할 때, 해당 객체의 의존성을
    가짜 객체(Mock Object)로 대체하여 테스트를 수행할 수 있습니다.
    이를 통해 의존성이 있는 객체를 테스트할 때 외부 환경에 의해 영향을 받지 않고,
    안정적으로 테스트를 수행할 수 있습니다.

  • 다형성의 활용
    생성자 주입 방식은 다형성의 활용을 용이하게 합니다.
    인터페이스나 추상 클래스를 이용해 의존성을 주입할 수 있습니다.
    이를 통해, 의존성을 구체적인 클래스가 아닌 인터페이스나 추상 클래스로 주입하면,
    구체적인 클래스를 변경해도 의존성 주입 코드를 변경하지 않아도 됩니다.
    따라서, 유연하고 확장성 있는 코드를 작성할 수 있습니다.

추상화:

객체 지향에서는 추상화를 통해 인터페이스를 정의하여 의존성을 줄입니다.
인터페이스는 구현과 분리되어 있기 때문에, 의존성을 줄일 수 있습니다.

의존성 역전 원칙:

의존성 역전 원칙은, 추상화된 것이 구체적인 것에 의존하는 것이 아니라,
구체적인 것이 추상화된 것에 의존해야 한다는 원칙입니다.
이를 통해 추상화된 인터페이스에 의존하도록 설계함으로써 의존성을 낮출 수 있습니다.

DI(Dependency Injection):

DI는 의존성을 주입하여 객체 간의 결합도를 낮추는 방법입니다.
객체가 직접 의존성을 생성하는 것이 아니라,
외부에서 의존성을 주입받도록 설계함으로써 객체 간의 결합도를 낮출 수 있습니다.

SOLID 원칙:

SOLID 원칙은 객체 지향 설계 원칙의 다섯 가지 원칙으로,
객체 지향에서 의존성을 낮추는 방법을 제시합니다.
이를 따르면 객체 간의 의존성을 낮추고, 유지보수성과 재사용성을 높일 수 있습니다

JWT :

JWT (JSON Web Token)은 웹표준으로서,
사용자 인증 정보를 안전하게 전달하기 위해 사용됩니다.
JWT는 토큰 기반 인증 방식 중 하나로, 서버와 클라이언트 간의
정보 교환에 사용됩니다.
식별자 추가정보 서명 지속 전달 서버 부하 감소

REST API :

REST API는 Representational State Transfer(표현 상태 전이)의 약자로,
웹 상에서의 서버-클라이언트 간의 통신 방식 중 하나입니다.
RESTful API라고도 불리며, REST 아키텍처 스타일을 따르는
웹 서비스를 RESTful API라고 부릅니다.

REST API는 자원(Resource)과 행위(Verb)로 구성되며,
HTTP 프로토콜의 메서드(GET, POST, PUT, DELETE 등)를 이용하여
서버-클라이언트 간의 통신을 수행합니다.
예를 들어, 웹 페이지에서 게시글을 작성할 때, 클라이언트는
POST 메서드를 이용하여 작성한 내용을 서버에 전송합니다.

무중단 배포 :

무중단 배포란 서비스를 업데이트하거나 유지보수를 할 때
서비스가 중단되지 않고 계속 운영되도록 하는 것을 말합니다.
이를 위해 여러 가지 방법이 존재하며,
그 중에서도 node.js를 사용하는 경우 pm2를 이용한 무중단 배포 방법을 많이 사용합니다.

  • Docker와 같은 컨테이너 기술을 사용하여 무중단 배포를 구현하는 방법입니다.
    각각의 컨테이너는 서버의 다른 인스턴스와 독립적으로 실행됩니다.

  • AWS Elastic Beanstalk과 같은 서비스를 사용하여 배포를 자동화하는 방법입니다.
    Elastic Beanstalk는 서버의 배포 및 관리를 자동화하므로 무중단 배포를 보장할 수 있습니다.

  • Nginx나 Apache와 같은 웹 서버를 프록시 서버로 사용하여
    무중단 배포를 구현하는 방법입니다. 업데이트를 배포할 때
    프록시 서버에서 서버의 연결을 끊지 않고 새로운 버전으로 전환할 수 있습니다.

0개의 댓글