📃 기술면접에 대한 고찰 

 

면접을 많이 다녀보다보니 기술면접에서 회사의 이미지나 같이 일하게 될 개발 팀원들의 수준, 그리고 이 회사에서 성장할 수 있는 성장성을 가늠할 수 있겠다는 생각이 들게 된 부분이 기술면접이였던 것 같습니다.  코딩테스트를 보는 건 본인의 실력을 뽐낼 순  있지만 ,같이 일하게 될 시니어 개발자나 개발팀들의 실력은 면접을 통해 알 수가 없습니다. 주니어 개발자로 들어왔지만 자신의 분야를 깊이 배울 수 없는 회사면 굳이 오래다닐 이유가 없다는 거죠 . 그래서 면접을 볼때 참여하는 개발자의 질문 수준에서 그 회사의 수준 깊이가 보인다는 걸 직감할 수 있었습니다. 저의 경우에는 질문에 대한 답변을 하지 못했을 경우 그 질문에 대한 답변을 알려주실 수 있냐고 하였습니다. 프로페셔널한 개발자분들은 성심성의껏 답변해주시는 분들이 많았고 답을 틀렸다고 불합격을 주지도 않았습니다. 오히려 이런 열의를 좋게 봐주셔서 면접을 본 곳 모두 합격을 하였습니다.

 

개발자면서도 컴맹인 분들도 많아서 개발용어와 관련된 질문뿐만 아니라 정처기 필기에 나오는 전반적인 컴퓨터 + 개발에 대한 질문을 하는 곳은 개발자를 넘어 데브옵스의 영역까지도 전문적으로 깊이가 있는 사람이 상사라는 의미로 같이 일을 하면 초반엔 힘들 수는 있지만 본인은 정말 알다모르게 상사를 따라다니거나 질문을 통해 배우는 점이 많을 것입니다.  

 


직접 면접을 다니면서 받았던 기술질문에 대해서는 빨간색으로 표시를 해뒀습니다. 자주나오는 질문은 노란형광펜으로 색칠했습니다

📌프로세스 질문

운영체제란?

시스템의 자원과 동작을 관리하는 소프트웨어 [프로세스, 저장장치, 네트워킹 ,사용자, 하드웨어 관리]

 

메모리 구조: 코드, 데이터, 힙, 스택

Code는 소스코드가 들어갑니다. Data는 전역변수, 정적변수가 할당됩니다.

Heap은 사용자가 직접 관리하는 영역으로 데이터가 동적으로 할당되는 공간입니다.

Stack은 함수의 호출 정보, 지역변수, 매개변수들이 저장되게 됩니다.

 

가상 메모리란? 

모든 프로세스에게 메모리를 할당하기게은 메모리의 크기에 한계가 있기 때문에 사용하는 방법입니다. 프로세스에서 사용하는 부분만 메모리에 올리고, 나머지는 디스크에 보관하는 기법을 말합니다.

 

TCP , UDP

TCP는 신뢰성 있는 통신을 위해 사용하는 프로토콜로 높은 신뢰성을 보장하지만, UDP보다 속도가 느립니다.

3way, 4way handshake로 서버와 클라이언트가 1:1로 통신을 합니다. 흐름 제어와 혼잡 제어가 이루어집니다.

UDP는 비연결형 프로토콜로 손상된 데이터에 대해서 재전송하지 않습니다. 신뢰성이 낮지만, TCP보다 속도가 빨라 스트리밍 같은 서비스에 주로 사용하게 됩니다. 마지막으로 1:1, 1:N, N:M 으로 연결이 가능합니다.

 

IP란?

Internet Protocol의 약자로 인터넷 망을 통해 패킷을 전달하는 프로토콜 입니다. 비연결성과 비신뢰성 특징을 가지고 있습니다. 비연결성은 패킷을 보내는 길을 정하지 않는 것이고, 비신뢰성은 패킷의 완전한 전달을 보장하지 않는 것 입니다.

 

프로토콜이란?

컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계입니다.

 

DNS : 도메인 주소를 IP 주소로 변환해주는 시스템 입니다.

 

트랜잭션 특징 ACID - A:원자성, C:일관성, I:격리성, D:지속성

데이터베이스의 무결성과 일관성을 위해서 트랜잭션 4가지 특징을 만족해야 합니다.

한 트랜잭션 내 실행한 작업이 모두 성공하거나 또는 실패해야 한다는 원자성,

데이터베이스 상태를 유지 시켜야 한다는 일관성,

동시에 실행되는 트랜잭션은 서로에게 영향을 미치지 않아야 한다는 격리성,

트랜잭션 완료 시 결과가 영구적으로 반영되어야 한다는 지속성이 있습니다.

 

NOSQL 란?

NOSQL은 Not Only SQL의 약자로 SQL을 보완한다는 의미를 가지고 있습니다.

NOSQL은 스키마가 없어서 데이터를 조회 하고 삽입하는 속도가 빠릅니다.

또한 대량의 분산 데이터를 저장하는데 특화되어 있습니다.

 

절차지향과 객체지향의 차이점

절차지향 : 수행되어야 할 연속적인 계산과 과정을 포함하고 있는 프로그래밍

객체지향: 강한 응집력과 약한 결합력을 위해 현실세계의 객체라는 개념을 이용한 프로그래밍

객체지향 프로그래밍 (OOP) 이란?

객체지향 프로그래밍이란 컴퓨터 프로그래밍 방식 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜

상태와 행위를 가진 객체를 만들고 그 객체들간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.

객체지향 프로그래밍(OOP) 의 장점과 단점?

장점
코드 재사용성이 용이합니다.
상속을 통해 프로그래밍 시, 코드의 재사용 률을 높일 수 있습니다.
유지보수가 용이합니다.
절차 지향 프로그래밍은 코드를 수정해야 할 때 하나씩 찾아서 수정해야 하는 반면에, 객체지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 있기 때문에 해당 부분 수정이 편리합니다.
생산성이 높습니다.
(생산성 향상)
잘 설계된 클래스를 독립적인 객체를 활용함으로써, 개발의 생산성을 향상시킬 수 있습니다.
자연적인 모델링
일상생활에서 쓰는 개념 그대로 객체라는 구조로 표현하여 개발함으로써, 생각한 것을 그대로 구현이 가능합니다.
단점
실행 속도가 느립니다.
절차지향 언어는 컴퓨터의 처리 구조와 비슷해 실행 속도가 빠른 반면, 객체지향 언어는 상대적으로 실행 속도가 느립니다.
프로그램 용량이 큽니다.
객체 단위로 프로그램으로 많이 만들다 보면, 불필요한 정보들이 같이 삽입될 수 있고, 이는 프로그램의 용량 증가로 이어질 수 있습니다.
설계에 많은 시간이 소요됩니다.
클래스 별로, 객체 별로 설계하고, 상속 등의 구조 또한 설계하여야 하기 때문에 절차지향언어에 비해 설계에 드는 시간이 많습니다.

OOP 4가지 원칙 

캡슐화

: 실제 구현 부분을 외부에 드러나지 않는 접근 제어자/ 인터페이스를 의미합니다.

변수와 메서드를 하나로 묶고, 데이터를 외부에서 직접 접근하지 않고 함수를 통해서만 접근하는 것을 의미합니다.

캡슐화에서 중요한 개념 - 정보은닉

-> 다른 객체에서 자신의 정보를 숨기고 자신의 연산만을 통하여 접근을 허용하는 것을 의미합니다.

예) 캡슐약 안에는 여러 종류의 약이 섞여있지만, 사용자는 그 약이 어떤 것인지 알지 못 하더라도 약을 먹으면 효과가 나타나게 됩니다.

상속

: 이미 정의된 클래스의 모든 속성과 연산을 하위 클래스가 물려받는 것을 의미합니다.

추상화

: 인터페이스로 클래스들의 공통적인 특성들을 묶어 표현하는 것을 의미합니다.(도출해내는 것)

다형성

: 하나의 참조 변수로 여러 타입의 객체를 참조할 수 있는 것을 의미합니다.

 

오버로딩(Overloading)

: 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 의미합니다.

(메서드 이름은 같으나, 개수. 타입이 달라야 합니다.)

오버라이딩(Overriding)

: 조상 클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 재정의 하는 것을 의미합니다.

OOP 5가지 원칙 [SOLID]

SRP(단일 책임 원칙) : 한 클래스는 하나의 책임만 가져야 합니다.

OCP(개방-패쇄 원칙) : 소프트웨어 요소는 확장에는 열려 있으나, 변경에는 닫혀 있어야 합니다.

LSP(리스코프 치환 원칙) : 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 합니다.

ISP(인터페이스 분리 원칙) : 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 나음을 의미합니다.

DIP(의존관계 역전 원칙) : 클라이언트 코드가 구현 클래스가 아닌 인터페이스만 바라봐야 합니다.

Java 접근 제어자 종류

public : 접근 제한이 없습니다.

private : 해당 클래스 내에서만 접근이 가능합니다.

protected : 같은 패키지 내에서와 다른 패키지의 자손 클래스에서 접근이 가능합니다.

default : 같은 패키지 내에서만 접근이 가능합니다.

기본 접근제어자(default) 와 프로텍스(Potect) 접근 제어자의 차이

클래스에서 접근 제어자를 지정하지 않고 메서드나 변수를 선언했을 때에는 접근 제어자가 기본적으로 default 형이 됩니다.

default 멤버는 같은 패키지 안의 다른 패키지 클래스에서 볼 수 있지만 해당 멤버 패키지 이외의 클래스에서는 볼 수 없습니다.

protected는 default와 동일하지만, protected 클래스를 상속한 클래스는 패키지 밖에서도 볼 수 있다는 차이점이 있습니다.

생성자란?

생성자는 클래스와 같은 이름의 메서드로, 새 객체가 생성될 때 호출되는 메서드 입니다.

명시적으로 생성자를 만들지 않아도 default로 만들어집니다. 생성자는 파라미터를 다르게 하여 오버로드 할 수 있으며, 파라미터 생성자를 만든다면 파라미터가 없는 default형 생성자도 명시적으로 만들어주어야 합니다.

지역변수와 인스턴스변수의 의미

지역변수는 메서드 안에서 정의되어 메서드 안의 스코프 안에서만 존재합니다.

인스턴스 변수는 클래스에서 정의되어 클래스 전체의 스코프 안에서 존재하게 됩니다.

컴파일 과정

- 자바 소스 코드를 작성합니다.

- 자바 컴파일러가 자바 소스 파일을 컴파일 합니다.

- 컴파일된 바이트 코드를 JVM의 클래스 로더에게 전달합니다.

- 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역, 즉 JVM의 메모리에 올립니다.

- 실행 엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다.

이때, 실행 엔진은 두가지 방식으로 변경됩니다.

JVM 구조

JVM이란 자바 가상 머신을 의미합니다.

자바와 OS 사이에서 중간자 역할을 수행합니다.

자바가 운영체제에 구애받지 않고 프로그램을 실행할 수 있도록 도와주는 역할을 합니다.

또한 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택기반으로 동작합니다.

결과적으로 OS에 종속적이지 않고 Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행할 수 있음을 의미합니다.

싱글톤 패턴이란?

전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴을 말합니다.

하나의 인스턴스만을 생성하는 책임이 있으며, getInstance메서드를 통해 모든 클라이언트에게 동일한 인스턴스를 반환하는 작업을 수행합니다.

call by value  / call by reference

1. call by value (값에 의한 호출)

함수가 호출될 때 메모리 공간 안에서는 임시의 공간이 생성된다. 그리고 함수가 종료되면 해당공간은 사라진다. 

함수 호출시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.

복사된 인자는 함수 안에서 지역적으로 사용하는 변수이다.

JAVA의 경우 함수에 전달되는 인자의 데이터 타입에 따라서 (기본자료형 / 참조자료형 ) 함수 호출 방식이 달라짐

기본 자료형 : call by value 로 동작 (int, short, long, float, double, char, boolean)

참조 자료형 : call by reference 로 동작 (Array, Class Instance) 

 

2. call by reference (참조에 의한 호출)

함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. (함수 종료시 사라짐)

call by reference 참조에 의한 호출방식은 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달한다. (해당 변수를 가르킨다.) 함수 안에서 인자의 값이 변경되면, 함수 호출시에 있던 변수들도 값이 바뀐다. 

 

추상 클래스와 인터페이스의 차이란?

추상 클래스를 부분적으로만 완성된 '미완성 설계도'라고 한다면

인터페이스는 구현된 것은 아무것도 없고 '밑그림만 그려진 기본 설계도'라고 할 수 있습니다.

추상클래스는 클래스 안에 '추상 메서드'가 하나 이상 포함되거나 abstract로 정의된 경우를 말하며,

인터페이스는 모든 메서다가 추상 메서드인 경우입니다.

 

추상 클래스는 그 추상 클래스를 상속 받아서 기능을 이용하여 확장할 수 있고,

인터페이스는 함수의 껍데기만 있으며, 그 함수의 구현을 강제하기 위해서 사용됩니다.

에러와 예외 차이

예외는 프로그램의 코딩에서 수행된 실수의 결과이며, 발생하더라도 비교적 덜 심각한 오류이므로 예외처리를 통해서 비정상적인 종료를 막을 수 있습니다.

오류는 시스템의 부적절한 기능의 결과이며, 메모리 부족, 스택오버플로우와 같이 발생하게 되면 복구 할 수 없는 심각한 오류를 의미합니다.

예외의 종류

체크예외(Check Exception)

- 컴파일 단계에서 확인되는 예외입니다.

- 반드시 명시적으로 예외 처리를 해야 합니다.

- 로직상 예외 발생 가능성이 있는 상황들을 표현합니다.

- 대표적으로 IOException, SQLException, ClassNotFoundException 이 있습니다.

언체크 예외(Unckeck Exception)

- 실행 단계에서 확인되는 예외들 입니다.

- 명시적인 예외 처리를 강제하지 않습니다.

- RuntimeException 클래스의 하위 클래스들이 모두 여기에 속합니다. 속하지 않는 것은 Check 예외 입니다.

Compiler vs Interpreter 차이

Compiler : 인간의 언어에 가까운 고급 언어를 기계어로 변환해주면, 한 번의 번역을 합니다.

Intepeter : 런 타임 이전의 기계어로 한 줄씩 번역을 합니다.

에러가 발생한다면, 즉각 에러가 표시가 되어 좋으나 코드의 변화에 있어서 Compiler에 비해 비효율 적입니다.

불변 객체란? Java String 그 이유는?

문자열 객체는 재 사용될 가능성이 높기 때문에 어플리케이션 당 하나의 String객체만을 생성해두어 JVM의 힙을 절약하기 위해서 입니다.

String 객체의 캐싱 기능 / 보안 기능 / 스레드 안전성

스레드란?

스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미합니다.

모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다.

또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 합니다.

String / String Builder / String Buffer 의 차이

String 객체는 한번 값이 할당되면 그 공간은 변하지 않습니다. (불변)

- String은 값을 변화시킬 때, Heap에 새로운 메모리를 사용하고, 참조되는 메모리 주소만 바꿔주는 것입니다.

가장 큰 차이점은 동기화의 유무로써 StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 점(thread-safe) 입니다. 참고로 String 불변성을 가지기때문에 마찬가지로 멀티쓰레드 환경에서의 안정성(thread-safe)을 가지고 있습니다.

반대로 StringBuilder동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어납니다.

thread safe

: 스레드 안전을 뜻합니다.

멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램 실행에 문제가 없음을 의미합니다.

Servlet vs JSP 차이

Servlet: 자바 언어로 웹 개발을 위해 만들어 졌습니다. Container가 이해할 수 있게 구성된 순수 자바 코드로 만들었습니다.

JSP: html 기반에 Java 코드를 블록화하여 삽입한 것입니다. Servlet을 좀 더 쉽게 접근할 수 있도록 만들어졌습니다.

List Set Map 차이

List : 데이터를 순차적으로 저장 / 데이터 중복을 허용 / 데이터로 null을 허용

Set : 순서없이 key로만 데이터 저장 / key의 중복을 허용 X / key로 null 허용 X

Map : 순서없이 key,value로 데이터 저장 / value는 중복을 허용, key는 중복 허용 X / key는 null 허용 X

ArrayList vs LinkedList 차이

ArrayList는 데이터들이 순서대로 늘어선 배열의 형식을 취하고 있지만, LinkedList는 자료의 주소값으로 서로 연결된 형식을 가지고 있습니다. 이러한 구조에 의해 둘은 각각의 장단점을 가지고 있습니다.

ArrayList

- 원하는 데이터에 무작위로 접근할 수 있습니다.

- 리스트의 크기가 제한되어 있으며, 리스트의 크기를 재조정하는 것은 많은 연산이 필요합니다.

- 데이터의 추가/ 삭제를 위해서는 임시 배열을 생성하여 복제하고 있어 시간이 오래 걸립니다.

LinkedList

- 리스트의 크기에 영향 없이 데이터를 추가할 수 있습니다.

- 데이터를 추가하기 위해 새로운 노드를 생성하여 연결하므로 추가/ 삭제 연산이 빠릅니다.

- 무작위 접근이 불가능하며, 순차 접근이 가능합니다.

큐와 스택의 구현

큐: Array로 구현하면 poll 연산 이후 객체를 앞당기는 작업이 필요합니다. 하지만 List로 구현하면 객체 1개만 제거하면 되므로 삽입 및 삭제가 용이한 LinkedList로 구현하는 것이 좋습니다.

스택: List로 구현하면 객체를 제거하는 작업이 필요합니다. 하지만 Array로 구현하면 삭제할 필요없이 index를 줄이고 초기화만 하면 되므로 Array로 구현하는 것이 좋습니다.

 

가비지 컬렉터란?

'더 이상 참조되지 않는 메모리'인 가비지를 청소해주는 JVM의 실행 엔진의 한 요소 입니다.

JVM은 new와 같은 연상에 의해 생성된 객체들 중에서 더 이상 참조되지 않는 객체를 정리해 줍니다.

가비지 컬렉터는 Heap 영역을 위주로 탐색하며 메모리를 정리해 줍니다.

제네릭이란? 사용하는 이유

제네릭이란 '타입을 일반화'하는 것으로 클래스 내부에서 정하는 것이 아닌 사용자 호출에 의해 타입이 지정되는 것을 의미합니다.

즉, 특정 타입의 변수형에 지정되는 것이 아닌 필요에 의해 여러 가지 타입을 사용하고 싶을 경우 사용합니다.

[사용하는 이유]

재 사용성 증가/ 컴파일 시 타입 에러 발견 가능/ 컴파일러가 타입 변환 수행

- 강제 캐스팅 사용을 줄여 프로그램 성능 저하를 줄일 수 있습니다.

- 반복되는 코드를 줄임으로써 가독성, 프로그램 크기, 유지보수를 효율적으로 할 수 있습니다.

 


 

스프링 프레임워크란?

자바 플랫폼을 위한 오픈 소스 어플리케이션 프레임워크 입니다.

동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하며,

대한민국 공공기간의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부표준 프레임워크의 기반 기술입니다.

스프링 프레임워크의 특징

DI(의존성 주입)

: 설정 파일이나 어노테이션을 통해 객체 간의 의존 관계를 설정하여 개발자가 직접 의존하는 객체를 생성할 필요가 없습니다.

Spring AOP(관점지향 프로그래밍)

: 트랜잭션, 로깅 보안 등 여러 모듈, 여러 계층에서 공통으로 필요로 하는 기능의 경우 해당 기능을 분리해 관리할 수 있습니다.

POJO

: 일반 J2EE 프레임워크에 비해 특정 라이브러리를 사용할 필요가 없어 개발이 쉽습니다.

IOC(제어버전)

: 컨트롤의 제어권이 개발자가 아니라 프레임워크이 있습니다. 객체의 생성부터 모든 생명 주기의 관리까지 프레임워크가 주도합니다.

Spring AOP가 무엇인지 OOP와 AOP 비교 설명

AOP는 관점지향 프로그래밍으로 애플리케이션의 핵심적인 기능과 부가적인 기능을 분리해 Aspect라는 모듈로 만들어 설계하고 개발하는 방법입니다.

OOP는 객체지향 프로그래밍을 의미합니다.

공통적 기능을 모든 모듈에 적용하기 위한 방법으로 상속을 이용하는데 Java에서는 다중 상속이 불가합니다.

그리고 기능 구현 부분에서 핵심 코드와 공통 코드가 섞여있어서 보기에도 불편하고 효율성이 떨어집니다. 이러한 이유로 AOP가 등장했습니다.

Spring MVC 란?

데이터와 화면간의 의존관계를 벗어날 수 있게하는 개발 기법입니다.

Model은 애플리케이션이 무엇을 할 것인지를 정의하고, 내부 비즈니스 로직을 처리하기 위한 역할을 합니다.

View는 사용자에게 보여지는 화면을 나타내며, 사용자 인터페이스 내의 구성 요소들을 표현합니다.

Controller는 Model과 View를 연결하고 있는 클래스를 대표하고 있으며, 클래스들 간의 정보를 교환하는 역할을 합니다.

JSTL은 무엇이며, 사용하는 이유는?

JSP 표준 태그 라이브러리의 약자로서, 자신만의 태그를 추가할 수 잇는 기능을 제공합니다.

주로JSTL의 core에서 c를 사용하여 <c:if> <c:forEach> 등으로 사용합니다.

AJax란? 그리고 단점

AJax는 자바스크립트의 라이브러리 중 하나입니다. 전체 페이지를 새로 고치지 않고도 페이지의 일부분만을 위한 데이터를 로드하는 기법이며 AJax를 한 마디로 정의하자면 자바스크립트를 사용한 비동기 통신입니다. 클라이언트와 서버 간에 XML 데이터를 주고받는 기술 이라고 할 수 있습니다.

[단점]

- 자바스크립트이므로 브라우저에 따라 크로스 브라우저 처리가 필요합니다.

- 연속적인 데이터 요청 시 서버 부하가 증가하여 페이지가 느려집니다.

- 페이지 내 복잡도가 증가하여 에러 발생 시 디버깅이 어렵습니다.

동기 / 비동기 차이

동기란 요청과 결과가 동시에 이루어지는 것을 의미합니다.

설계가 매우 간단하고 직관적이지만, 결과가 주어질 때까지 아무것도 하지 못 하고, 대기해야 한다는 단점을 가지고 있습니다.

비동기는 동기와 반대로 요청과 결과가 동시에 일어나지 않습니다.

동기보다 복잡하지만, 결과가 주어지는 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있따는 장점이 있습니다.

RestFul API란?

자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 의미합니다.

URL을 통해 자원을 명시하고 HTTP Method를 통해 해당 자원에 대한 CRUD를 적용하는 것을 의미합니다.

HTTP란?

HTTP는 웹 상에서 클라이언트와 서버간에 요청과 응답으로 데이터를 주고 받을 수 있는 프로토콜 입니다.

GET vs POST 차이

GET은 클라이언트에서 어떠한 리소스부터 정보를 요청하기 위해 사용되는 메서드 입니다.

데이터를 읽거나, 검색할 때 사용되는 메서드로 사용됩니다.

POST는 리소스를 생성, 업데이트 하기 위해 서버에 데이터를 보낼 때 사용되는 메서드 입니다.

GET과 달리 전송해야 되는 데이터를 body에 담아서 전송되며, content-Type에 요청 데이터 타입 표시에 따라 결정 됩니다.

 

 

힙이란?

힙은 최대값 혹은 최소값을 빠르게 찾기 위한 이진트리 입니다.

최소 힙의 경우에는 부모는 자식보다 작습니다. 최대 힙의 경우에는 부모는 자식보다 커야 됩니다.

힙의 삽입과 삭제는 O(lgN) 만큼의 시간 복잡도를 갖습니다.

 

해시 란?

해시에 매핑하여 데이터를 저장하는 자료구조 입니다. Key는 hash function을 통해 hash로 변경된 다음에 value와 매핑 되어서 bucket에 저장되게 됩니다. 시간복잡도는 삽입, 삭제, 조회가 모두 O(1)의 시간복잡도를 갖습니다.

 

자바 애플리케이션 실행 과정

자바 소스 코드를 작성합니다.

컴파일러가 자바 소스를 바이트코드로 변환합니다.

Class Loader가 바이트 코드를 런타임 데이터 영역에 로드시킵니다.

로딩된 바이트 코드가 실행 엔진에 의해서 실행되게 됩니다.

 

자바 메모리 구조

자바 메모리 구조는 크게 5가지 영역으로 구분이 됩니다.

스레드마다 PC resister, JVM stack, 그리고 Native Method Stack이 있습니다.

스레드 공통으로는 Heap과 Method Area 가 있습니다.

PC Register는 현재 수행중인 JVM 명령어가 들어가 있습니다.

JVM Stack은 호출된 메서드의 매개변수, 지역변수, 리턴 정보들이 저장됩니다.

Native Method Stack은 자바 외의 언어인 C나 C++ 같은 것들을 수행하기 위한 영역입니다.

Method Area는 클래스 별로 전역변수, 정적변수, 메서드 정보들이 저장되게 됩니다.

마지막으로 Heap영역은 런타임 중 생성되는 객체들이 동적으로 할당되는 곳 입니다.

 

가비지 컬렉션 (GC)

JVM에서 메모리를 관리해주는 모듈 입니다. Heap 메모리를 재활용하기 위해서 더 이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈입니다. 개발자가 직접 메모리를 정리하지 않아도 되기 때문에 개발 속도가 향상되는 장점이 있지만, Mark and Sweep 이라는 과정에서 참조되지 않는 객체를 찾는 과정이 있는데, 이 때 스레드가 잠깐 중단이 되어서 성능이 떨어진다는 단점이 있습니다.

 

프로세스와 스레드 차이점

프로세스는 운영체제로부터 자원을 할당 받는 작업의 단위입니다.

스레드는 할당 받은 자원을 이용하는 단위입니다.

어플리케이션 하나가 프로세스 이고, 이 안에서 분기 처리가 스레드를 의미합니다.

 

멀티프로세스와 멀티 스레드

멀티 프로세스는 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것입니다.

장점으로는 하나의 프로세스가 잘못 되어도 프로그램은 동작을 합니다. 단점은 context switching 비용이 발생

멀티 스레드는 프로그램을 여러 개의 스레드로 구성하고 스레드가 작업을 처리하는 것입니다.

장점은 시스템 자원 소모 감소, 처리 비용 감소, 스레드간 자원 공유가 있습니다. 단점은 디버깅이 어려우며, 동기화 이슈 발생, 하나의 스레드의 오류로 전체 프로세스에 문제가 발생됩니다.

 

쿠키 & 세션에 대해

쿠키[사용자의 컴퓨터에 저장하는 기록 정보 파일]

클라이언트 로컬에 정의되는 키와 값이 들어있는 작은 데이터 팡리

(사용자 인증 유효시간 명시 / 유효시간이 정해지면 브라우저가 종료되어도 유지)

- 쿠키로 인하여 페이지 이동 시마다 로그인을 다시 하지 않고 ,사용자 정보를 유지할 수 있다.

세션[일정 시간 동안 같은 사용자로부터 일련의 요구를 하나의 상태로 보고 유지를 시킴]

사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 서버 측에서 관리

(서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증 상태를 유지)

HTTP 란?

웹 상에서 클라이언트와 서버 간에 요청/응답으로 데이터를 주고 받을 수 있는 프로토콜 입니다.

HTTP, 클라이언트 전달과정

클라이언트가 HTTP 프로토콜을 통해 서버에게 요청을 보내면 서버는 요청에 맞는 응답을 클라이언트에게 전송합니다. 이때, HTTP 요청에 포함되는 HTTP 요청에 포함되는 HTTP 메서드는 서버가 요청을 수행하기 위해 해야 할 행동을 표시하는 용도로 사용합니다.

 

MVC에 대해 설명

M(Model) : 내부 비즈니스 로직에 해당합니다.

백그라운드 로직으로써 처리되는 알고리즘, 데이터, DB와의 상호 작용 등을 담당합니다.

V(View) : 사용자 인터페이스(UI)를 의미합니다.

요청에 대한 처리 결과를 View를 통해 클라이언트에게 환면을 통해 보여줍니다.

C(Controller) : Model과 View 사이에서 중계자 역할을 수행합니다.

클라이언트의 요청을 처리하고 흐름 제어를 담당합니다.

Model1 과 Model2 의 차이

Model1은 View와 Controller를 JSP에서 모두 구현하는 구조를 가지고 있습니다.

따라서 클라이언트의 요청을 받는 것도 JSP, Model과 상호작용을 하여 변경된 Model을 사용하여 View를 다시 그려내는 것도 JSP 입니다. - 사용자의 요청 처리와 요청에 대한 응답 처리를 JSP에서 모두 구현하는 구조입니다.

Model2 는 Model1과는 다르게 View와 Controller가 분리된 구조를 가지고 있습니다.

클라이언트의 요청을 처리, 흐름제어를 하면서 필요 시 Model과 상호 작용을 하는 Controller는 Servlet에서 담당하고, 사용자 인터페이스를 보여주는 View는 JSP에서 담당하고 있습니다.

Controller와 View를 분리함으로써 클라이언트의 요청 처리 부분과 응답처리 부분을 분리하여 각 로직을 독립적으로 수행할 수 있습니다. - 유지보수 측면에서 매우 좋고 디자이너와 개발자 간의 협력이 우수하다는 장점이 있습니다.

* 정 리 *

- Model1은 View와 Controller가 하나의 JSP에서 이루어지며, 클라이언트가 직접적으로 View에 접근할 수 있습니다.

- Model2는 요청처리 시, Servlet에서 담당하고 응답처리는 JSP 에서 이루어지기 때문에 두 로직이 분리되어 있습니다.

그래서 클라이언트는 View에 직접적으로 접근할 수 없고 반드시 Controller를 통해서 접근해야 합니다.

복사했습니다!