[기술면접] Backend TOP 30

White 와잇·2024년 7월 17일

Backend 기술면접 top30

📢 기술 면접 빈도 높은 질문 30

답변할 수 있을 정도의 길이(3~4줄)로 말하기
두괄식으로 전달하기

1. NoSQL과 RDBMS의 특징과 차이점에 대해서 장, 단점을 들어 설명해주세요.

  • RDBMS : 관계형 데이터베이스 Schema Table SQL
  • NoSQL : 대용량데이터 비규격화 Key,Value

NoSQL은 스키마가 없기 때문에 유연한 데이터 구조를 가지고있고, 수평적확장이 가능해 분산처리로 대규모 데이터 처리가 용이합니다.
RDBMS 보다 읽기와 쓰기 성능이 높으나, 수정에 걸리는 시간이 비교적 느리고 데이터의 중복이 가능하기때문에 중복된 데이터를 수정하는 경우 여러개의 컬렉션에서 데이터를 변경해야합니다.

RDBMS는 사용하려는 데이터의 구조가 명확할 경우 사용합니다.
외래키를 통해서 테이블간 Join이 가능하며, 데이터의 중복을 허용하지 않습니다.
트랜잭션의 ACID(원자성,일관성,고립성,지속성) 성질로 데이터의 무결성과 일관성을 보장합니다.
단점으로는 외래키로 테이블간 관계를 맺고있기때문에 원하는 데이터가 각테이블에 있을경우 Join문을 다수 사용하여 쿼리가 복잡해질 수 있습니다.
또한 데이터의 구조가 명확 할 경우에 사용되기 때문에 데이터가 유연하지 않습니다.

2. mvc 패턴에 대해서 설명해주세요.

모델

model

  • 컨트롤러가 호출을 하면 DB와 연동하여 사용자의 입출력 데이터를 다루는 일과 같은 데이터와 > 연관된 비즈니스 로직을 처리하는 역할
  • 데이터 추출, 저장, 삭제, 업데이트 등의 역할을 수행

view

  • 사용자와 상호작용을 하며 컨트롤러로부터 받은 모델의 결과값을 사용자에게 화면으로 출력

컨트롤러

controller

  • Model과 View 사이를 이어주는 인터페이스 역할
  • Model이 데이터를 어떻게 처리할지 알려주는 역할

MVC 패턴은 사용자 인터페이스로부터 비즈니스 로직을 분리하기 위한 소프트웨어 디자인 패턴으로, 애플리케이션의 구성 요소를 Model-View-Controller로 분리하여 개발하는 방법입니다.

따라서 역할 분리로 인해 낮은 결합도로 모듈화할 수 있고, 코드의 재사용성이 높아지며,
변경이 필요한 부분을 쉽게 파악할 수 있기 때문에 서비스를 유지보수 비용을 줄일 수 있습니다.

Model
데이터를 관리하는 역할을 합니다. 컨트롤러가 호출을 하면 DB와 연동하여 데이터 검색, 저장, 삭제 업데이트와 같은 비즈니스 로직을 처리하는 역할을 합니다.

View
view는 사용자 인터페이스로, 컨트롤러가 모델로부터 데이터를 요청하면 뷰는 해당 데이터를 가져와서 사용자에게 화면에 출력합니다.

Controller
컨트롤러는 독립적인 모델과 뷰 사이를 이어주는 인터페이스 역할을 합니다.
뷰에서 전달한 이벤트에 따라 모델이 애플리케이션 상태를 관리할 수 있게 해주며,
모델이 가진 데이터를 뷰에게 전달해서 화면을 만듭니다.

정리하면 모델은 데이터를 처리하고 뷰는 데이터를 사용자에게 제공하며 컨트롤러는 둘 사이의 상호 작용을 관리하여 올바른 데이터를 가져와 적절하게 표시하도록 합니다.

MVC 패턴을 사용하여 관심사 분리로 인해 애플리케이션은 더욱 모듈화되고, 유지 관리 및 확장 가능해집니다.

3. RDBMS의 정규화에 대해 설명해주세요.

중복데이터 무결성

데이터베이스를 설계할 때 구조를 효율적으로 만들기 위해 중복된 데이터를 최소화하고 무결성을 유지하며 이상현상을 방지할 수 있도록 관계형 테이블을 분해하는 과정입니다. 정규화는 각 단계가 있고 각각 특정한 조건을 만족하는 형태여야 합니다. 제1정규형, 2정규형, 3정규형, 보이스코드 정규형, 4정규형, 5정규형 순서로 분해합니다.
하지만 정규화 단계를 넘어갈 수록 테이블이 많아져 성능 저하가 일어날 수 있으므로 적절한 단계에서 멈추는 것을 선택해야 합니다.

각 정규형 조건 설명:

  • 제 1정규형은 테이블의 모든 열이 원자값을 가져야 합니다. 원자값이란 더 이상 쪼갤 수 없는 데이터 값을 말합니다. 한 인스턴스의 필드 안에 데이터가 2개 이상 들어가면 안됩니다.
  • 제 2정규형은 부분 함수 종속성이 없어야 합니다. 기본 키의 부분 집합이 결정자가 되는 것
  • 제 3정규형은 이 기본 키가 아닌 모든 속성이 기본 키에 대해 이행적 종속성을 가지지 않아야 합니다.
  • BCNF는 후보키가 아닌 결정자에 의해 발생하는 종속성을 없애야 합니다.
  • 제 4정규형은 다치 종속성을 제거해야 합니다.
  • 제 5정규형은 조인 종속성을 제거해야 합니다.

이상현상:
비정규화된 테이블 구조에서 발생할 수 있는 문제를 말합니다. 데이터의 일관성과 무결성을 해칠 수 있기 때문에 문제를 해결해야 합니다. 삽입 이상, 삭제 이상, 수정 또는 갱신 이상이 있습니다.
삽입 이상 - 어떤 데이터를 디비에 삽입할 때 필요없는 다른 데이터도 같이 넣어야 하는 경우입니다.
삭제 이상 - 어떤 데이터를 삭제하면 필요없는 다른 데이터도 함께 삭제해야 하는 경우입니다.
갱신 이상 - 중복 데이터가 여러 곳에 존재해서 한 곳을 수정하면 다른 곳도 수정해주지 않으면 일관성을 해치기 때문에 수정해야 되는 경우입니다.

다른 답변: 정규화란 관계형 데이터베이스의 설계에서
데이터를 중복 없이 효율적으로 저장하기 위한 일련의 과정을 말합니다.
총 5단계의 과정을 거쳐
데이터베이스의 구조가 불필요한 중복을 최소화하고 데이터의 일관성과 무결성을 유지할 수 있도록 도와줍니다. 이때 주의할 점이 있는데
Data의 무결성 보장해주거나 이상현상 등을 막아준다고 하지만 다수의 정규화는 성능 저하를 초래할 수 있습니다.

4. Primary Key, Foreign Key에 대해 설명해주세요.

1:1 1:N N:M

  • PK : not null unique
  • FK : PK 참조

기본키와 외래키는 데이터의 무결성과 일관성을 유지하기 위해 존재합니다.
기본키는 테이블의 행을 고유식별하는 기능입니다. 유일한 값이며 NULL을 허용하지 않습니다.
외래키는 한 테이블이 다른 테이블을 참조하여 테이블 간의 관계를 정의하는 기능입니다. 참조하는 값이 반드시 존재하여 참조 무결성을 유지해야 합니다.

다른 답변: PK 유일한 값으로 공백을 가질 수 없고, 데이터를 식별하기 위한 값이다. 특징으로는 고유성을 가지고, null 값을 허용할 수 없다. unique 제약 조건을 가진다. FK 관계형 데이터베이스의 데이터 관계를 표현하기 위한 키로, 참조되는 테이블의 pk를 fk 라고 한다. fk는 무결성 제약 조건을 가져 참조 무결성을 유지한다, 삭제 및 갱신시 제약 조건을 가진다.

5. HTTP 메서드에 대해 설명해주세요.

  • 주요 메서드 : GET POST PUT PATCH DELETE
  • 기타 메서드 : HEAD OPTIONS CONNECT TRACE

HTTP 메서드란 클라이언트와 서버 사이에 이루어지는 요청(Request)과 응답(Response) 데이터를 전송하는 방식입니다.
HTTP 메서드를 통해 서버가 수행해야할 동작을 지정하면 url은 리소스만 식별하면 되기 때문에 리소스와 동작을 분리할 수 있습니다.

HTTP의 주요 메서드는 GET, POST, PUT, DELETE, PATCH가 있고,
이 외에도 HEAD, OPTIONS, TRACE, CONNECT가 있습니다.

HTTP 메서드를 사용하는 이유는 웹 애플리케이션에서 클라이언트와 서버 간의 통신을 명확하고 효율적으로 관리하기 위함입니다. 각 HTTP 메서드는 특정한 작업을 수행하도록 정의되어 있으며, 이를 통해 서버와 클라이언트 간의 요청 및 응답 처리를 구조화하고 표준화할 수 있습니다. HTTP 메서드를 사용하는 주요 이유는 다음과 같습니다:

HTTP 메소드의 종류는 총 9가지가 있습니다.

  • GET : 리소스 조회
    - 주로 검색, 게시판 목록에서 검색어로 이용하며, 정상적인 응답이 완료되면 200 staus 코드를 반환합니다.
    - 동적 데이터 조회 하는 경우 쿼리 파라미터 사용해서 데이터를 전달합니다.

  • POST: 요청 데이터 처리, 주로 등록 및 생성 요청에 사용하는 메서드 입니다.

  • 메시지 바디(body)를 통해 서버로 요청 데이터 전달하면 서버는 요청 데이터를 처리하여응답시 201 HTTP 응답을 반환합니다.
  • PUT : 리소스를 수정하는 메서드로 데이터가 존재하면 대체하고 존재하지 않으면 생성합니다.

  • 하지만 일부 리소스만 변경할 경우 기존 데이터가 완전히 대체되어 기존 데이터가 삭제되기 때문에 이때는 PATCH 메소드를 이용해야 합니다.

  • PATCH : 리소스 일부 부분을 변경하는 메소드 입니다. (PUT이 전체 변경, PATCH는 일부 변경)

  • DELETE : 리소스 삭제하는 메서드

  • HEAD : GET과 동일하지만 메시지 부분(body 부분)을 제외하고, 상태 줄과 헤더만 반환

  • OPTIONS : 예비 요청(Preflight)에 사용되는 HTTP 메소드로 본 요청을 하기 전에 안전한지 미리 검사하는 메서드 입니다.

  • 따라서 서버의 지원 가능한 HTTP 메서드와 출처를 응답 받아 CORS 정책Visit Website을 검사하기 위한 요청입니다.

  • CONNECT : 대상 자원으로 식별되는 서버에 대한 연결 요청

  • TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행

  • 서버에 도달 했을 때의 최종 패킷의 요청 패킷 내용을 응답 받을 수 있다.

  • 클라이언트의 요청 패킷이 방화벽, Proxy 서버, Gateway 등을 거치면서 패킷의 변조가 일어날수 있는데, 그래서 TRACE 메서드를 통해 요청했던 패킷 내용과 응답 받은 요청 패킷 내용을 비교하여 변조 유무를 확인 할 수 있다

6. CORS(Cross Origin Resource Sharing)에 대해 설명해주세요.

SOP CORS 필요 이유 CORS 정의

CORS는 웹 브라우저 보안 기능입니다.

기본적으로 브라우저는 보안상의 이유로 동일 출처 정책(Same-Origin Policy)을 따르는데,
이것은 한 웹 페이지가 다른 출처의 리소스에 접근하는 것을 제한하는 것입니다.
CORS(Cross-Origin Resource Sharing)는 웹 브라우저가 웹 페이지의 리소스를 다른 도메인에서 요청할 수 있도록 허용하여 제한을 완화시킬 수 있는 방법입니다.

7. 브라우저의 작동방식에 대해서 설명해주세요.

단계별로 상세한 프로세스를 나눠서 설명

  1. 사용자가 브라우저에 URL을 입력하거나 하이퍼링크를 클릭합니다.
  2. 브라우저가 URL을 해석해서 호스트 IP 주소를 DNS에 요청합니다.
  3. 브라우저가 호스트 IP 주소로 웹 서버에 HTTP 또는 HTTPS 요청을 보냅니다.
  4. 웹 서버는 그 요청을 처리하고 응답을 반환합니다.
  5. 브라우저는 응답을 받아 HTML 문서를 파싱해서 DOM(Document Object Model)을 생성합니다. CSS 내용에 따라 렌더링하고 JavaScript는 실행되어 브라우저 동작을 제어합니다.
  6. 최종 렌더링된 페이지가 화면에 출력되고 사용자가 상호작용 할 수 있습니다.

다른 답변: 사용자가 웹 브라우저를 열고 URL을 입력하거나 하이퍼링크를 클릭합니다.
브라우저는 URL에서 호스트 이름을 추출하고 DNS(Domain Name System) 서버를 통해 해당 호스트의 IP 주소를 가져옵니다.
브라우저는 서버에 HTTP 요청을 보냅니다. 이 요청에는 메서드(GET, POST 등)와 함께 요청하는 리소스의 경로 등이 포함됩니다.
서버는 요청을 받고 처리한 후에 HTTP 응답을 생성합니다. 응답에는 상태 코드, 헤더 및 리소스(HTML 문서, 이미지 등)가 포함될 수 있습니다.
브라우저는 응답을 받아서 렌더링합니다. HTML은 DOM(Document Object Model)으로 파싱되고, CSS는 스타일 규칙에 따라 렌더링되고, JavaScript는 실행됩니다.
렌더링된 페이지가 사용자에게 표시됩니다. 사용자가 페이지와 상호 작용하면서 브라우저는 추가적인 요청을 생성하고 응답을 처리합니다.

8. 쿠키, 세션의 개념과 차이를 설명해보세요

무상태(stateless) 이 기술이 왜? 생겨났는지

Http 프로토콜은 이전 요청의 결과나 상태에 독립적입니다. 이 특징을 '무연결성, 무상태(stateless)'라고 합니다.
웹 서비스를 제공할 때 사용자의 상태를 유지하고 추적해야 할 때 사용할 수 있는 기술이 '쿠키'와 '세션'입니다.

둘 다 사용자의 정보를 저장하고 관리하는 역할을 한다는 공통점이 있습니다.
쿠키는 사용자의 브라우저에 저장되고 같은 서버로의 요청을 보낼 때마다 브라우저가 해당 쿠키를 함께 보냅니다. 쿠키는 만료기한을 설정할 수 있다는 특징이 있습니다. 하지만 300개 정도 저장할 수 있고 4KB 정도까지 저장할 수 있는 한계가 있습니다.
세션은 서버측에 사용자의 상태를 저장하는 데이터입니다. 서버가 세션 ID를 클라이언트에게 알려주면 클라이언트는 요청 시에 세션 ID를 전달해야 합니다. 세션 데이터는 브라우저를 닫으면 종료됩니다. 세션 데이터는 서버에 저장되므로 쿠키보다는 보안도가 높지만 서버에 좀 더 부하를 줄 수 있습니다.

쿠키와 세션

목적 : 비연결성과 무상태성을 보완하기 위해서 사용한다.

쿠키

  • 클라이언트 로컬에 저장되는 키와 값이 들어있는 데이터 이다.
  • 유효기간을 명시할 수 있다.
  • 약 300개 정도 저장할 수 있고, 4KB 정도 까지 저장할 수 있다.

세션

  • 쿠키에 기반히지만 세션은 서버측에서 관리한다.
  • 서버에서는 클라이언트의 정보를 저장하고 구분하기 위해서 세션 키를 발급하고, 서버 저장소에서 Map의 형태로 관리한다.
  • 클라이언트와의 연결이 종료되는 시점까지 저장한다. 요청이 일정 시간동안 없다면 제거한다.
  • 서버에 저장되다 보니 서버에 부하를 줄 수 있다.

둘의 공통은 쿠키를 기반한다는 것이고, 차이점은 저장되는 위치에 있다.

9. TCP/UDP에 대해서 설명해주세요.

TCP와 UDP의 신뢰성 차이가 어떤 프로세스 떄문에 발생하는지 3-way handshaking

TCP와 UDP는 네트워크 전송 계층에서 사용되는 인터넷 통신 규약입니다.
TCP는 데이터를 보낼 때 송신 컴퓨터와 수신 컴퓨터의 연결을 먼저 설정합니다. 연결 여부를 확인하기 때문에 송신여부에 대한 신뢰성이 있습니다. TCP는 데이터를 보낼 때 바이트 스트림 형태로 된 패킷 단위로 보내기 때문에 데이터의 순서를 판단할 수 있습니다. 연결 여부를 확인하려면 3-way handshake 연결 과정이 필요합니다. 이것은 송신자와 수신자 사이에 SYN 패킷, SYN-ACK 패킷, ACK 패킷 이렇게 세 번의 통신이 있어 3-way handshake라 불립니다.
TCP는 전송 데이터를 확인하여 잘못된 순서나 데이터가 전송될 경우 재전송하여 복구할 수 있고 속도를 조절할 수 있습니다.

UDP는 TCP와 상반되게 연결 과정이 없어 보다 빠른 데이터 전송이 가능하다는 장점이 있습니다.
UDP는 데이터를 보낼 때 각각 순서와 관련없는 개별적인 데이터를 데이터그램이라 불리기도 하는 패킷 단위로 전송합니다. 각 패킷의 오류 검출을 위한 체크섬 기능이 있지만 복구할 수는 없어 같은 패킷의 재전송이 보장되지 않습니다.

TCP는 신뢰성이 중요한 응용 프로그램에서, UDP는 실시간성과 속도가 중요한 응용 프로그램에서 주로 사용됩니다.


다른 답변:
TCP와 UDP는 웹 상에서 데이터를 전송하기 위한 통신규약입니다.

Transmission Control Protocol

인터넷 상에서 데이터를 메세지의 형태로 보내기 위해 사용하는 프로토콜입니다. 3 way handshaking과정을 통해 연결을 설정하며 데이터가 온전하게 도착하도록 보장하기 때문에 신뢰성이 높은 프로토콜입니다.

User Datagram Protocol

UDP는 사용자 데이터그램 프로토콜의 약자이며 비연결 지향적 프로토콜입니다. TCP와 다르게 사전연결을 하지않아 데이터는 소실될 가능성이 존재하고 순서를 보장하지 않으며 데이터를 보증하지 않지 빠르다는 장점이 존재합니다.

10. http, https 차이점에 대해 설명해주세요

HTTP/HTTPS의 정의와 차이점 SSL 인증서를 통해서 데이터 조작여부 판단

HTTP와 HTTPS는 모두 인터넷의 데이터 전송 프로토콜입니다. 두 프로토콜은 보안 측면의 차이가 있습니다.

HTTP는 웹 서버-클라이언트 간에 데이터를 암호화하지 않고 전송합니다. 기본적으로 80번 포트를 사용하고 있습니다. 암호화 하지 않아 보안에 취약할 수 있습니다.

HTTPS는 HTTP 형태의 데이터가 암호화되어 전송됩니다. 기본적으로 443번 포트를 사용합니다.
암호화를 위해 핸드셰이크 과정을 통해서 SSL 또는 TLS 인증서를 추가하여 서버의 신원을 보장합니다. 신원을 확인할 때 또한 데이터의 무결성과 기밀성을 보장합니다.
또 HTTPS는 구글 등의 검색 엔진이 HTTPS를 사용하는 웹사이트를 더 높은 순위에 노출시키는 경향이 있고 (SEO, 검색 엔진 최적화 방법/전략들을 말합니다), 최신 대부분 브라우저는 웹사이트에 대해 HTTPS 에 대한 지원을 권장하고 있습니다.

SSL/TLS 는 무엇인가요?
SSL: Secure Sockets Layer, 넷스케이프가 개발한 인터넷 데이터 암호화 프로토콜. 1996년에 출시된 3.0 버전이 많은 보안 취약점이 있어 대부분 TLS를 사용합니다.
TLS: Transport Layer Security, 2018년에 발표된 1.3 버전이 최신버전이고, SSL의 취약점을 보완한 암호화 프로토콜입니다.


다른 답변:
HTTP와 HTTPS는 인터넷을(네트워크) 통해 데이터를 전송하는 데 사용되는 두 가지 프로토콜입니다.

HTTP는 HyperText Transfer Protocol의 약자로, 웹 브라우저와 웹 서버 사이에서 웹 페이지를 전송하는 데 사용 되는 통신 프로토콜입니다.
하지만 HTTP는 기본적으로 평문으로 데이터를 전송하기 때문에 데이터가 암호화되지 않고 누구나 읽을 수 있어서, 보안에 취약합니다.
이러한 특징 때문에 보안이 필요하지 않은 정적인 웹 페이지를 전송하는 데 적합합니다.

HTTPS(Hypertext Transfer Protocol Secure)는 HTTP의 보안 버전으로 보안측면에서 더욱 강화된 프로토콜입니다.

HTTPS는 SSL(Secure Socket Layer) 또는 TLS ( Transport Layer Security)프로토콜을 사용해서 데이터를 암호화해서 전송합니다.
이렇게 하면 전송되는 데이터가 보호되어서 중간에서 데이터를 엿보거나 조작하는 것을 방지할 수 있습니다.

즉, HTTP는 평문으로 데이터를 전송하는 프로토콜로 보안이 필요하지 않은 경우에 사용 되고,
HTTPS는 데이터를 암호화하여 안전하게 전송하는 프로토콜로 보안이 필요한 웹 사이트에서 사용됩니다.

HTTP와 HTTPS. 두 프로토콜의 큰 차이점은 SSL/TLS를 사용하는지 여부입니다.
즉, HTTPS는 SSL/TLS를 통해 데이터를 암호화하지만, HTTP는 데이터를 평문으로 전송합니다.

11. DI, IoC에 대해 설명해주세요.

DI는 의존성 주입이라고 하는데, 이것은 객체지향 프로그래밍에서
한 객체 A가 다른 객체B를 필요로 할 때, 즉 A가 B에게 의존도가 있을 때, A 내부에서 직접 B를 생성하는 것이 아니고 A의 외부에서 미리 생성된 B를 받는 것을 의존성 주입이라고 합니다.
생성자를 통한 주입방법, Setter 메서드를 통한 주입방법, 직접적으로 멤버 변수에 주입하는 방법이 있습니다.

IoC는 제어의 역전이라고 하고, 프로그래밍을 의존성 주입을 수행함으로서 프로그램 제어권을 프레임워크나 컨테이너에게 맡기는 것입니다. 개발자가 주입 객체를 작성하고 지정해주면 프로그램 실행시 객체를 외부에서 생성하고 주입하는 행동은 프레임워크가 하게 됩니다. 대표적으로 스프링 프레임워크가 있습니다.

DI를 사용함으로써 IoC를 실현하게 되므로 같은 장단점을 가지게 됩니다.
의존성 주입을 하면 객체 간의 결합도를 낮출 수 있으며 코드 재사용성이 높아집니다. 또 테스트할 때 용이하며 코드가 모듈화되어 유지보수성이 증가합니다.
단점으로는 초기의 설정이 복잡하고 처음 개념을 접하면 이해하는 데 러닝커브가 존재합니다. 제어 흐름이 프레임워크가 관리하기 때문에 디버깅에 어려움이 있습니다. 그리고 프로젝트가 프레임워크에 대해 의존성이 증가할 수 있습니다.


다른 답변:
IOC (Inversion of Control - 제어의 역전)
IOC는 개발자가 객체의 생성과 의존성 관리를 직접 수행하지 않고, 이를 프레임워크나 컨테이너에 위임하는 디자인 패턴입니다. 이전에는 개발자가 객체를 직접 생성하고 의존성을 관리했지만, IOC를 사용하면 프레임워크가 이러한 작업을 대신합니다. 이는 제어의 흐름을 역전시키는데, 즉 객체의 생성과 의존성 주입이 프레임워크에 의해 결정됩니다. 이를 통해 코드의 유연성을 높이고 재사용성을 향상시킬 수 있습니다.

DI (Dependency Injection - 의존성 주입)
DI는 IOC의 한 형태로, 객체가 다른 객체에 의존할 때 이 의존성을 외부에서 주입하는 디자인 패턴입니다. 주로 생성자, 세터 메서드, 인터페이스 등을 통해 의존성이 주입됩니다. 이를 통해 객체 간의 결합도를 낮추고 유연성을 향상시킵니다. 또한 DI를 통해 객체의 재사용성과 테스트 용이성이 증가하며, 코드의 변경을 최소화할 수 있습니다.

IOC/DI의 주요 이점
유연성: 객체 간의 결합도를 낮추고 코드를 더 유연하게 만듭니다.
재사용성: 의존성을 주입하여 객체를 더 재사용 가능하게 만듭니다.
테스트 용이성: 의존성을 외부에서 주입하므로 모의 객체(mock object)를 사용하여 테스트하기 용이합니다.
유지보수성: 변경이 발생할 때 해당 객체만 수정하면 되므로 코드의 유지보수가 용이합니다.

Q. 싱글톤 패턴(추가질문)

싱글톤 패턴은 디자인 패턴 중 하나로, 어떤 클래스가 최초 한 번만 메모리를 할당하고 그 메모리에 객체를 만들어 사용하는 패턴입니다. 이 패턴을 사용하면 애플리케이션 전체에서 해당 클래스의 인스턴스가 하나만 존재하도록 보장할 수 있습니다.

12. 객체지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요?

객체지향 프로그래밍은 프로그래밍 패러다임 중 하나이고 이 방법은
프로그램을 여러개의 객체로 구성하여 작성합니다. 객체는 데이터를 갖는 필드와 행위를 갖는 메서드로 구성되어 있습니다. 객체지향을 사용하면 복잡한 시스템일 수록 각 객체가 독립적이기 때문에 필요한 부분만 개발, 유지보수할 수 있게 되어 전통 프로그래밍 방식인 절차지향보다 유리하고 개발 과정이 단순화되어서 생산성을 향상시킬 수 있습니다.
객체지향은 상속과 다형성을 통해 코드의 재사용성을 높이고, 캡슐화라는 특성이 있는데 객체의 필드와 메서드를 외부로부터 숨겨서 객체의 인터페이스를 통해서만 접근할 수 있습니다. 이렇게 하면 데이터의 무결성과 보안을 높일 수 있습니다. 추상화


다른답변:
객체지향 프로그래밍이란 실제 사물을 모델링하여 소프트웨어를 개발하는 방법으로서 클래스와 객체, 상속, 다형성, 캡슐화의 개념을 가지며 상속을 통해 코드를 재사용하고, 다형성을 통해 유연하고 확장 가능한 코드를 작성할수 있고, 캡슐화를 통해 데이터를 보호할 수 있습니다. 객체가 독립적으로 작동하여 프로그램의 복잡성이 줄어들어 대규모 프로젝트를 효과적으로 관리 할 수있습니다. 이러한 개념의 이점들로 객체지향 프로그래밍은 코드의 유지 보수성과 확장성을 향상시키고, 개발 과정을 단순화하여 생산성을 향상시킵니다.

13. 대용량 트래픽 발생 시 어떻게 대응해야 하나요?

대용량 트래픽은 발생 가능성을 염두에 두고 사전에 여러 방책을 마련해두는 것이 좋습니다.
트래픽 패턴을 분석해서 이벤트, 프로모션 등으로 트래픽 증가를 사전에 예측해야 합니다.

스케일 아웃, 로드 밸런싱, 캐싱, db 최적화, 애플리케이션 최적화 모두 고려해보아야 합니다.

스케일 아웃: 서버를 늘려 트래픽 부하를 분산시킵니다. 로드 밸런싱을 통해 여러 서버에 고르게 분산시켜야 합니다.
캐싱: 정적 콘텐츠는 CDN(Content Delivery Network) 서비스를 통해 전 세계에 분산 배포하여 사용자에게 더 빠르게 전달합니다. 캐시를 통해 데이터베이스 및 서버에 가해지는 부하를 줄입니다.
db 최적화: 데이터베이스 쿼리를 최적화하고, 인덱스를 잘 관리하며, 필요에 따라 읽기 전용 복제본(Read Replica)을 사용합니다.
코드를 최적화하고, 병목 현상을 파악하여 해결합니다. 비동기 처리 및 큐를 이용하여 요청을 처리합니다.

그리고 실시간 모니터링을 하여 대용량 트래픽이 발생했을 시 즉시 대응할 수 있도록 합니다.
대용량 트래픽이 발생했을 때 클라우드 서비스를 사용 중이라면 임시로 스케일 아웃을 할 수도 있습니다. 또, 트래픽에 제한을 거는 방법이나 대기 페이지를 제공하는 방법으로 트래픽을 제어할 수 있습니다. 대용량 트래픽으로 인해 서버 장애가 발생하면 서비스가 유연하게 이어질 수 있도록 백업 서버를 두고 전환하는 방법을 사용할 수 있습니다. DR(Disaster Recovery) 복구 방법을 미리 만들어 두고 데이터 유실을 방지해야 합니다.


다른답변:
1. 스케일 아웃(Scaling Out): 서버 자원을 추가하여 트래픽 부하를 분산시킵니다. 이는 로드 밸런서를 통해 효과적으로 수행할 수 있습니다.
2. 캐싱 사용하기: 정적 콘텐츠를 캐싱하여 서버의 부하를 줄이고 응답 속도를 향상시킵니다.
3. 코드 최적화: 코드를 개선하여 효율적으로 실행되도록 만듭니다. 비효율적인 코드는 서버 부하를 높일 수 있습니다.
4. 데이터베이스 최적화: 데이터베이스 쿼리를 최적화하여 더 빠르고 효율적으로 실행되도록 합니다. 인덱스를 추가하거나 쿼리를 재구성하는 등의 방법을 사용할 수 있습니다.
5. 모니터링 및 스케일 인(Scaling In): 실시간 모니터링을 통해 서버 상태를 지속적으로 확인하고 필요에 따라 서버를 축소시켜 자원을 효율적으로 사용합니다.
6. 클라우드 서비스 활용: 클라우드 기반 인프라를 사용하여 필요에 따라 서버를 신속하게 추가하거나 축소할 수 있습니다.
7. 부하 테스트: 시스템이 어느 정도의 트래픽을 견딜 수 있는지 이해하기 위해 정기적인 부하 테스트를 수행합니다.
8. 이벤트 드리븐 아키텍처 채택: 이벤트 기반 아키텍처를 도입하여 스케일링을 자동화하고 트래픽에 따라 서비스를 유연하게 조정합니다.
9. 백업과 복구 전략 수립: 잠재적인 문제에 대비하여 백업과 복구 전략을 수립하여 데이터 유실을 방지합니다.

14. ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요?

쿼리 성능 문제를 해결하기 위해 디버깅이나 로그 분석을 통해서 병목 지점을 발견하여 개선할 방법을 찾을 수 있습니다.

  1. 쿼리 최적화 기능을 사용하여 필요한 컬럼만 선택하도록 쿼리를 제한할 수 있고, JOIN 시에 불필요한 데이터를 선택하지 않도록합니다.
  2. 쿼리 메서드를 체이닝과 서브쿼리를 사용하여 복잡한 쿼리를 단순화할 수 있습니다.
  3. ORM 제공 기능을 사용하지 않고 복잡한 부분을 Raw 쿼리를 사용하여 직접 처리할 수 있습니다.
  4. DB 뷰를 사용하여 복잡한 쿼리를 단순화할 수 있습니다. 뷰는 테이블처럼 사용가능합니다.
  5. 데이터베이스 테이블의 적절한 인덱스를 설정하도록 해서 쿼리 성능을 최적화할 수 있습니다.

15. GET, POST의 개념과 함께 데이터 흐름에 대해서 설명해주세요.

HTTP(Hypertext Transfer Protocol)는 웹 상의 클라이언트와 서버 간의 통신을 위한 프로토콜입니다. HTTP 메서드는 클라이언트가 서버에 요청을 보내는 방법을 정의하며 그 중에서도 GET과 POST가 가장 많이 사용되는 메서드입니다.

GET: 서버에게 웹 데이터를 열람할 수 있도록 요청할 때 사용됩니다.
예를 들어 어떤 서버의 index 페이지를 보고 싶을 때 URL을 통해 브라우저 같은 HTTP 클라이언트 애플리케이션이 GET 메서드의 HTTP 프로토콜을 생성하고 이것을 서버에 보냅니다.
서버는 index 페이지 연관 리소스를 찾고 HTTP 프로토콜에 담아 응답합니다.
클라이언트 애플리케이션은 응답을 해석하고 처리합니다. 예를 들어 브라우저는 HTML 페이지를 렌더링 합니다.
요청 데이터를 함께 보내려면 URL에 담아 보낼 수 밖에 없고 이 때문에 보안에 취약하다는 단점이 있습니다. get 메서드는 길이 제한이 있으며 브라우저에 캐시될 수 있어 post보다 빠르고 안정적으로 통신할 수 있다는 장점이 있습니다. 또한 같은 GET 요청에 대하여 멱등성이 보장됩니다.

POST: 주로 서버에게 리소스를 변경을 요청할 때 사용되며 데이터를 함께 전송합니다.
GET과 마찬가지로 HTTP 클라이언트 애플리케이션이 POST 로 프로토콜을 생성하고 변경 데이터를 함께 서버에 보냅니다. 서버는 이것을 받아 변경 데이터를 요청에 맞게 처리하고 결과를 다시 HTTP 프로토콜로 응답해줍니다. 그리고 클라이언트 애플리케이션은 응답을 해석하고 처리합니다.
요청 데이터를 http 요청 바디에 넣을 수 있어 GET보다는 안전하고 길이 제한이 없어 대용량 데이터를 주고 받을 수 있다는 장점이 있습니다. get보다는 통신 부하가 크다는 단점이 있습니다.

  • POST가 PUT/PATCH 대신 변경 요청하는 경우?
    POST는 요청 데이터를 처리하는 과정은 서버가 결정하므로 사실 모든 기능을 수행가능합니다.
    기본적으로 데이터 변경 요청 메서드는 PUT/PATCH를 사용하는 것이 바람직하지만 환경에 따라 사용할 수 없는 경우도 있습니다. 예를 들어 HTML의 form은 GET과 POST 메서드만 지원합니다. 이처럼 일부 라이브러리, 프레임워크 등이 지원을 제한하는 경우 POST로 대체하여 사용할 수 있고, 보안 설정때문에 PUT/PATCH 요청이 차단되고 있는 환경일 경우 POST 요청을 사용하기도 한다.
    하지만 이는 RESTful 규칙을 조금 벗어나므로 엄격한 RESTful API를 설계할 때에는 사용하지 않는 방법입니다.

16. OSI 7계층에 대해 아는대로 설명해주세요.

네트워크 통신을 7계층으로 나누고 각 계층이 특정 기능을 수행하도록 설계한 모델입니다.
통신 데이터를 계층으로 구조화하면 계층이 독립적으로 표현되어서 각 계층에 표준화된 프로토콜 기술들을 구별할 수 있다는 장점이 있습니다.

각 계층은 물리-데이터링크-네트워크-전송-세션-표현-응용계층으로 되어있습니다.

  1. 물리 계층 - 물리적 장치로 컴퓨터 간에 비트 스트림을 전송합니다.
  2. 데이터 링크 - 물리 계층에서 데이터를 전송할 수 있도록 프레임 단위로 구성하여 오류 검출과 흐름을 제어하고 MAC 주소로 장치를 식별하는 기능을 합니다.
  3. 네트워크 - 논리 주소인 IP 주소를 통해 데이터 패킷을 전달합니다.
  4. 전송 - TCP/UDP 프로토콜을 통해 데이터 패킷을 세그멘테이션으로 나눠 전달하여 데이터 전송의 순서와 무결성, 신뢰성을 보장합니다.
  5. 세션 - 통신 연결을 유지하고 동기화하고 연결을 끊는 등 논리적 연결을 관리하는 기능을 합니다.
  6. 표현 - 데이터를 응용 계층에서 사용되는 형식으로 인코딩/디코딩/압축변환 등을 처리합니다.
  7. 응용 - 사용자와 네트워크 간의 인터페이스를 제공합니다. 네트워크와 응용 프로그램 간에 HTTP, FTP, SMTP 등의 프로토콜을 사용하여 데이터를 전달합니다.

17. 세션 기반 인증과 토큰 기반 인증의 차이에 대해 설명해주세요.

공통점: 웹 애플리케이션에서 사용자 인증을 처리함

세션 기반 인증: 사용자에 대한 연결 상태를 유지할 수 있는 '세션'을 서버에서 관리하는 방법입니다.
데이터를 서버에 저장하고 사용자는 자신의 세션 ID만 전달하면 인증할 수 있어 적은 통신 비용으로 인증할 수 있습니다. 민감한 데이터를 서버에 저장하므로 토큰으로 통신하는 것보다 안전합니다.
하지만 그만큼 서버의 저장 공간 확보와 여러 서버 환경(로드 밸런싱)에서 각 서버가 세션을 공유해야 하는 과정이 필요합니다.

토큰 기반 인증: 사용자가 자신을 인증할 수 있는 '토큰'을 가지고 서버와 통신하는 방법입니다.
서버가 사용자의 상태를 저장할 필요가 없어 '무상태'의 특성을 갖고 있습니다. 또한 서버의 확장에 영향이 없어 서버 확장성에 좋은 방법입니다.
단점은 클라이언트가 토큰을 갖고 있어 비교적 안전하지 않고, 토큰의 유효기간이 만료되기 전에 서버에서 토큰을 무효화하기 어려울 수 있습니다. 또 토큰은 세션 ID를 전달하는 방법보다 헤더 크기가 커져서 통신 비용이 좀 더 큽니다.

18. JWT, Refresh, Access Token에 대해서 설명해주세요.

JWT: JSON 객체를 사용하여 정보를 안전하게 전달하기 위해 압축된 웹 토큰입니다.
헤더, 페이로드, 시그니처로 구성되어있고, 헤더에 토큰 유형과 알고리즘을 포함하며
페이로드에는 클레임이 포함되고 시그니처에 비밀키를 사용하여 암호화한 정보가 들어있습니다. 시그니처로 토큰의 무결성을 확인합니다.

액세스 토큰: 클라이언트가 안전하게 접근할 수 있도록 인증을 증명할 수 있는 토큰입니다.
짧은 유효기간을 가지고 주로 HTTP 헤더에 포함하여 전송합니다. 유효기간이 짧아서 토큰이 탈취되어도 피해 가능성을 줄일 수 있습니다.

리프레시 토큰: 액세스 토큰의 유효기간이 만료되었을 때 새로운 액세스 토큰을 발급받기 위해 사용되는 토큰입니다. 따라서 긴 유효기간을 가지는 것이 보통입니다. 리프레시 토큰이 필요할 때만 건네줄 수 있으므로 액세스 토큰보다 노출이 낮아 보안을 높일 수 있습니다.

19. OAuth에 대해서 설명해주세요.

OAuth(Open Authorization)는 애플리케이션이 사용자 인증을 직접 처리하지 않고 따로 처리해주는 서버에 요청하는 인증 프로토콜입니다. 사용자의 비밀번호를 애플리케이션에 저장할 필요가 없어 보안성이 높아지고 사용자는 하나의 인증 정보로 여러 어플리케이션에서 인증가능하여 편리합니다.
OAuth는 현재 2.0 버전이 널리 사용되고있으며 이전 버전에 비해 더 간단하고 확장 가능한 구조를 가집니다. 우리나라는 주로 카카오, 구글, 네이버, 페이스북 등이 여러 애플리케이션에서 API 접근과 소셜 로그인에서 사용되고 있습니다.

20. 클래스형과 함수형의 차이를 설명해주세요. 어떤 방식을 주로 사용하였고 그 이유가 뭔지 답변해주세요.

클래스형은 객체지향이며 클래스와 객체를 사용하여 구현합니다. 상속과 다형성, 캡슐화, 추상화를 사용할 수 있습니다.

함수형은 데이터의 불변성을 중시하여 함수를 사용하고 복잡한 함수는 합성하여 구현할 수 있습니다. 함수는 입력이 같으면 항상 같은 출력을 반환하는 것이고 상태를 변경하지 않는다는 특징을 가집니다.

저는 주로 객체지향인 클래스형을 사용합니다.

클래스형을 사용하면 클래스를 통해서 현실세계를 모델링하고 상속과 다형성으로 코드를 재사용할 수 있으며 유지보수와 확장성이 좋아 대규모 프로젝트에서 유리합니다.

21. CI/CD에 대해서 설명해주세요.

22. TDD에 대해서 설명해주세요.

23. 프로세스와 쓰레드에 대해서 설명하고 그 차이에 대해서 설명해주세요.

24. 멀티프로세스와 멀티쓰레드의 특징에 대해 설명해주세요.

25. 쿼리 최적화에 대해 설명해주시고 방법에 대해 설명해주세요.

26. DB 로직 최소화를 하려면 어떻게 해야 할까요?

27. 테스트코드에 대해서 아는대로 설명해주시고 활용 경험에 대해서 답변해주세요.

28. Array, LinkedList에 대해 설명해주시고 각각 어떻게 사용하는지 말씀해주세요.

배열은 인덱스를 가짐. 원하는 데이터를 한번에 접근하기 때문에 접근 속도 빠름.

크기 변경이 불가능하며, 데이터 삽입 및 삭제 시 그 위치의 다음 위치부터 모든 데이터 위치를 변경해야 되는 단점 존재

연결리스트는 인덱스 대신에 현재 위치의 이전/다음 위치를 기억함.

크기는 가변적. 인덱스 접근이 아니기 때문에 연결되어 있는 링크를 쭉 따라가야 접근이 가능함. (따라서 배열보다 속도 느림)

데이터 삽입 및 삭제는 논리적 주소만 바꿔주면 되기 때문에 매우 용이함

데이터의 양이 많고 삽입/삭제가 없음. 데이터 검색을 많이 해야할 때 → Array
데이터의 양이 적고 삽입/삭제 빈번함 → LinkedList

29. AWS S3, EC2를 사용하는 이유와 사용 경험에 대해서 답변해주세요.

30. 정렬 알고리즘에 대해서 아는대로 설명해주세요.

31. 스프링이 뭔지 간단히 설명해주세요.

자바 스프링(Spring Framework)은 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크입니다.
객체 지향적인 설계 원칙으로 자바 객체 POJO를 다양한 엔터프라이즈 서비스에 의존적이지 않게 연결해줍니다. 결합도를 느슨하게 해서 개발자의 생산성을 높이고 애플리케이션의 유지보수를 용이하게 합니다.

다양한 엔터프라이즈 서비스 예시:
대규모 비즈니스 애플리케이션에 사용될 수 있는 기능/기술들. 자바 EE는 이런 서비스를 지원하기 위해 여러 API와 프레임워크를 포함하고 있다.

  • JPA
  • JSP
  • CDI : 의존성 주입과 빈 컨텍스트 관리
  • Security
  • WebSocket: C-S 간의 실시간 통신을 위한 프로토콜 서비스, 이벤트 기반 처리
  • JSON-Processing / JSON-Binding: JSON 데이터 <-> 자바 객체 매핑

SE/EE 차이:

  • SE: 데스크톱 앱, 서버 앱, 임베디드 애플리케이션 개발에 목적을 둔 표준 자바 플랫폼
  • SE의 핵심 서비스: 기본적인 자바 클래스 라이브러리 java.util 등,
    JVM 자바 앱 실행위한 가상 머신, JDBC DB연동 API 등.
  • EE: 웹 애플리케이션 및 엔터프라이즈 서비스 개발에 목적을 둔 추가 기능 플랫폼
  • SE의 확장된 라이브러리를 지원, 웹 서비스 필요한 라이브러리가 많은 것이 특징
profile
웹개발 도전! 데브옵스 도전!

0개의 댓글