기술 면접 준비

[기술면접] 프로그래밍 공통

Lea Hwang 2023. 3. 2. 12:22

[기술면접] 프로그래밍 공통 목차

  • Restful API
  • 프레임워크와 라이브러리의 차이
  • Call By Value와 Call By Reference의 차이
  • CORS
  • 절차지향 프로그래밍과 객체지향 프로그래밍의 차이점
  • OAuth 2.0의 흐름
  • CSRF에 대해 설명하고, 이를 막기 위한 방법
  • 대칭키, 비대칭키 암호화 방식
  • TDD(Test-Driven-Development)
  • MSA(Microservice Architecture)

 

 


 

 

😎 Restful API에 대해 설명해주세요.

Restful API는 HTTP 통신을 Rest 설계 규칙을 잘 지켜서 개발한 API를 Restful한 API라고 합니다.
Rest 설계 규칙은 URI는 정보의 자원만 표현해야 하며, 자원의 상태와 행위는 HTTP Method에 명시하는걸 말합니다.

 

 

▶ 꼬리질문 "REST란? REST API 와 RESTful API의 차이점을 말씀해주세요."

 

REST(REpresentational State Transfer)란?

  • Rest 정의 및 개념
  • Rest 구성 요소
  • Rest 특징

 

Rest 정의 및 개념

REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에,

웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일입니다.

REST는 네트워크 상에서 Client와 Server 사이의 통신 방식 중 하나입니다.

 

한 줄로 요약하자면, 자원(resource) 표현(representation)에 의한 상태 전달을 뜻합니다.

  • 자원 : 해당 소프트웨어가 관리하는 모든 것 ( 문서, 그림, 데이터, 해당 소프트웨어 자체 등 )
  • 표현 : 그 자원을 표현하기 위한 이름 ( DB의 학생 정보가 자원이면, 'students'를 자원의 표현으로 정함 )
  • 상태 전달 : 데이터가 요청되는 시점에 자원의 상태를 전달한다. ( JSON 혹은 XML을 통해 데이터를 주고 받는 것이 일반적 )

 

어떤 자원에 대해 CRUD(Create, Read, Update, Delete) 연산을 수행하기 위해 URI(Resource)로

GET, POST 등의 방식(Method)을 사용하여 요청을 보내며, 요청을 위한 자원은 특정한 형태(Representation of Resource)로 표현됩니다.

URI 와 URL의 차이점?
URI는 URL을 포함하게 됩니다.
URL은 Uniform Resource Locator로 인터넷 상 자원의 위치를 의미합니다.
반면 URI는 Uniform Resource Identifier로 인터넷 상의자원을 식별하기 위한 문자열의 구성을 뜻합니다.

 

 

Rest 구성요소

1. 자원(Resource) - URI

  • 모든 자원에는 고유한 ID가 존재하고, 이 자원은 Server에 존재하는 HTTP URI 입니다.
  • Client는 URI를 이용해 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청합니다.

2. 행위(Verb) - Method

  • HTTP 프로토콜의 Method를 사용합니다.
  • HTTP 프로토콜은 GET, POST, PUT, PATCH, DELETE의 Method를 제공합니다. ( CRUD )
GET Read : 정보 요청
POST Create : 정보 입력 및 처리
PUT Update : 데이터 전체 업데이트
PATCH Update : 데이터 일부 업데이트
DELETE Delete : 정보 삭제

 

3. 표현 ( Representation of Resource )

  • Client와 Server가 데이터를 주고받는 형태로 JSON, XML 등이 있습니다.

 

 

Rest 특징

1. Server-Client (서버-클라이언트 구조)

  • Client에서 Server쪽으로 자원을 요청합니다.

2. Stateless (무상태)

  • HTTP 프로토콜은 Stateless Protocol이므로 REST 역시 무상태성을 갖습니다.
  • Client의 context를 Server에 저장하지 않으므로 구현이 단순합니다. 
  • Server는 각각의 요청을 완전히 별개의 것으로 인식하고 처리합니다.

3. Cacheable (캐시 처리 기능)

  • 웹 표준 HTTP 프로토콜을 그대로 사용하므로 웹에서 사용하는 기존의 인프라를 그대로 활용할 수 있습니다.
    • 즉, HTTP가 가진 가장 강력한 특징 중 하나인 캐싱 기능을 적용할 수 있습니다. 
    • HTTP 프로토콜 표준에서 사용하는 Last-Modified Tag 또는 E-Tag를 이용해 캐싱을 구현합니다.
  • 대량의 요청을 효율적으로 처리할 수 있습니다.

4. Self-Descriptiveness (자체 표현)

  • 요청 메시지만 보고도 쉽게 이해할 수 있는 자체 표현 구조로 되어있습니다.

 

 

REST API 란?

  • REST API 정의 및 특징
  • REST API 디자인 가이드 
  • REST API 의 설계 규칙

REST API의 정의 및 특징

  • REST의 특징을 기반으로 서비스 API를 구현한 것입니다. 
  • REST API의 가장 큰 특징은 각 요청이 어떤 동작이나 정보를 위한 것인지를 그 요청의 모습 자체로 추론이 가능한 것 입니다.

 

REST API의 디자인 가이드

REST API 설계 시 가장 중요한 항목은 다음의 2가지입니다.

  • 첫 번째, URI는 정보의 자원을 표현해야 한다.
  • 두 번째, 자원에 대한 행위는 HTTP Method(GET, POST, PUT, PATCH, DELETE)로 표현한다.
    • 행위(Method)는 URI에 포함하지 않는다.

 

조금 더 자세히는 REST API의 설계 규칙에서 알아보겠습니다. 

REST API의 설계 규칙

1. URI는 명사를 사용한다.

2. 슬래시( / )로 계층 관계를 표현한다.

3. URI 마지막 문자로 슬래시 ( / )를 포함하지 않는다.

4. 밑줄( _ )을 사용하지 않고, 하이픈( - )을 사용한다.

5. URI는 소문자로만 구성한다.

6. HTTP 응답 상태 코드 사용

- 클라이언트는 해당 요청에 대한 실패, 처리완료 또는 잘못된 요청 등에 대한 피드백을 받아야 한다.

7. 파일확장자는 URI에 포함하지 않는다.

 

💡 REST API에서 꼭 가져가야할 개념
URI는 정보의 자원만 표현해야 하며, 자원의 행위는 HTTP Method에 명시한다.

 

 

 

REST API와 RESTful API의 차이는 뭘까?

RESTful은 REST의 설계 규칙을 잘 지켜서 설계된 API를 RESTful한 API라고 합니다.

RESTful하게 만든 API는 요청을 보내는 주소만으로도 어떤 것을 요청 하는지 파악이 가능합니다.

예를들어

https://school.com/grade 의 주소는 :  학교의 학년들을 목록으로 받는 요청일 것입니다.

https://school.com/grade/2/students 의 주소는 : 2반 학생들의 정보를 받아올 수 있습니다.

또, https://school.com/grade/2/students/15 의 주소는 :  그 학생들 중 15의 id를 가진 학생의 정보가 오겠죠.

 

 

 

 

 

😎 프레임워크와 라이브러리의 차이에 대해 설명해주세요.

이 둘의 차이점은 실행 흐름에 대한 제어 권한이 누구에게/어디에 있는가에 있습니다.

프레임워크는 전체적인 흐름을 자체적으로 제어하고, 개발자는 그 안에서 라이브러리에 대한 흐름을 쥐고 있으며 필요한 상황에 가져다가 쓸 수 있습니다.


여기서 개발자의 제어권을 프레임워크에게 넘김으로써 신경써야할 것을 줄일 수 있는데,
이를 제어의 역전(Inversion of Control)이라 합니다.

 

 

 

 

😎 Call By Value와 Call By Reference의 차이에 대해 설명해주세요.

  • Call By Value(값에 의한 호출) - 인자로 받은 값을 복사하여 처리하는 방식입니다. 
    • 장점 - 값을 복사하여 처리하기 때문에 원래의 값이 보존된다.
    • 단점 - 복사하기 때문에 메모리 사용량이 증가한다.
  • Call By Reference(참조에 의한 호출) - 인자로 받은 값의 주소를 참조하여 직접 저장해 값에 영향을 주는 방식입니다. 
    • 장점 - 복사하지 않고 직접 참조하기에 빠르다.
    • 단점 - 직접 참조를 하기에 원래의 값이 영향을 받는다.

 

▶꼬리질문 -  Java에서 어느 부분이 call by value이고 어느 부분이 call by reference에 해당하나요?

Java는 기본적으로 모든 전달 방식이 Call by Value 입니다.

참조형의 경우 객체의 '주소값'을 매개변수로 전달하니 call by reference가 아니냐는 의문을 가질 수 있지만,

정확하게 말하면 '주소값'이 아니라, '주소를 가리키는 참조값'이다.

또한, 주소값 자체를 '복사 없이' 인자로 전달하는게 아니라 자기 자신이 갖고 있는 값을 복사해서 전달한다.

결국 기본형 변수나 참조형 변수 모두 자기 자신이 갖고 있는 값을 복사해서 전달하기 때문에 Call by value이다.

 

 

 

 

😎 CORS(교차 출처 리소스 공유, Cross-Origin Resource Sharing)에 대해 설명해주세요.

CORS란 도메인이 서로다른 2개의 사이트가 데이터를 주고 받을 때 발생하는 문제입니다.
예를 들어 domain-a.com  domain-b.com으로 데이터를 주고받을시 따로 설정 하지 않으면 CORS 에러를 만나게 됩니다.


따라서 다른 서버의 리소스를 불러오기 위해서는, 그 출처에서 CORS에 대한 내용을 Response의 헤더에 추가해줘야 합니다.

  • Access-Control-Allow-Orgin : 요청을 보내는 페이지의 출처 [ *, 도메인 ]
  • Access-Control-Allow-Methods : 요청을 허용하는 메소드. Default : GET, POST
  • Access-Control-Max-Age : 클라이언트에서 preflight 요청 (서버의 응답 가능여부에 대한 확인) 결과를 저장할 시간
  • Access-Control-Allow-Headers : 요청을 허용하는 헤더

 

 

 

😎 절차지향 프로그래밍과 객체지향 프로그래밍의 차이점에 대해 설명해주세요.

  • 절차지향 프로그래밍
    • 물이 위에서 아래로 흐르는 것처럼 순차적인 처리를 중요시하는 프로그래밍 기법이다.
    • 대표적인 언어로 C언어가 있다.
    • 컴퓨터의 처리구조와 유사해 실행속도가 빠르다.
    • 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다.
  • 객체지향 프로그래밍
    • 실제 세계의 사물들을 객체로 모델링하여 개발을 진행하는 프로그래밍 기법이다.
    • 대표적인 언어로 Java가 있다.
    • 캡슐화, 상속, 다형성 등과 같은 기법을 이용할 수 있다.
    • 절차지향 언어보다 실행속도가 느리다.

 

 

😎 OAuth 2.0의 흐름에 대해 간단히 설명해주세요.

  1. 사용자가 클라이언트(이하 클라)에게 사용 요청을 보낸다.
  2. 클라 권한 서버 권한 부여 승인 코드 요청(response_type=code로 지정하여 요청)을 보낸다.
  3. 이후 클라는 권한 서버에서 제공하는 로그인 페이지를 띄워 사용자에게 보여준다.
  4. 사용자가 로그인 하면 권한 서버는 (2)권한 부여 승인 코드 요청에 전달받은 redirect_url로 Authorization Code를 전달한다.
  5. Authorization Code는 권한 서버에서 제공하는 API를 통해 Access Token으로 교환된다.

 

 

😎 CSRF(Cross-site request forgery)에 대해 설명하고, 이를 막기 위한 방법에 대해 설명해주세요.

사이트 간 요청 위조의 약자입니다. 웹 어플리케이션 취약점 중 하나로 공격자가 의도한대로 사용자가 행동하게 하여 특정 웹페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법을 의미합니다.

 

 

CSRF 공격과정

- 2008년도에 있었던 옥션 해킹 사고도 CSRF 공격을 했다고 한다.
(해커가 옥션 운영자에게 CSRF 코드가 포함된 이메일을 보내서 관리자 권한을 얻어냈다)

 

1. 옥션 관리자 중 한 명이 권한을 가진채 회사 내에서 작업을 하던 중 메일을 조회한다. (로그인이 되어있으니 관리자로서의 유효한 쿠키를 가지고 있음)
2. 해커는 위와 같이 태그가 들어간 코드가 담긴 이메일을 보낸다.
3. 관리자가 이메일을 열어볼 때, 이미지 파일을 받아오기 위해 위 URL이 열린다.
4. 해커가 의도한 대로 관리자 계정 id와 pw가 admin으로 변경된다.

 

 

막기위한 방법

상태를 변화시키는 POST, PUT 등의 요청에 대해 csrf 토큰이 포함되어야만 요청을 처리하여 공격을 방어

 

 

 

😎 대칭키, 비대칭키 암호화 방식에 대해 설명해주세요.

대칭키와 비대칭키는 양방향 암호화 방식 알고리즘입니다.

대칭키는 암호화와 복호화에 같은 암호 키를 쓰는 알고리즘입니다.
이는 중간에 누군가 암호키를 가로채면 정보가 유출될 수 있다는 단점이 있는데 이런 문제를 보완한 방식이 바로 비대칭키 입니다.

비대칭키는 암호화와 복호화할 때 서로 다른 키를 쓰는 알고리즘입니다.
타인에게 절대 노출되어서는 안되는 개인키와 공개적으로 개방되어 있는 공개키를 쌍으로 이룬 형태입니다.

 

 

 

😎 TDD(Test-Driven-Development)의 개념에 대해 설명해주세요.

TDD란 작은 단위의 테스트 케이스를 작성하고 그에 맞는 코드를 작성하여 테스트를 통과한 후에
상황에 맞게 리팩토링하는 테스트 주도 개발 방식을 말합니다.

이렇게 반복적인 단계가 진행되면서 자연스럽게 코드의 버그가 줄어들고, 코드는 간결해진다는 장점이 있습니다.

TDD는 레드 그린 사이클이라는 3가지 과정을 거칩니다.

  1. Red : 어떠한 기능을 검증하는 테스트가 실패하는 코드를 작성하고, 실제로 실패하는지 확인한다.
  2. Green : 어떠한 기능을 검증하는 테스트가 통과하는 코드를 작성하고, 실제로 성공하는지 확인한다.
  3. Refactor : 앞에 실패하는 테스트와 성공하는 테스트를 모두 검증했다면, 작성한 코드를 깨끗하고 가독성 좋게 고친다.
  4. Repeat : 이 세 가지 과정을 반복하여 프로그램을 완성한다.

▶ 꼬리질문 -  테스트 코드를 작성 해야하는 이유에 대해 아는대로 설명해주세요.

1. 기능의 추가, 변경, 삭제로 인한 영향도를 쉽게 파악 가능

2. 예상하지 못한 오류에 대한 피드백을 위해

3. 좋은 설계로 작성되게끔 코드를 유도

4. 기능 정의의 문서의 역할

5. 실수를 줄여준다.

 

 

 

😎 MSA(Microservice Architecture)가 뭔지 설명해주세요.

MSA는 1개의 시스템을 독립적으로 배포 가능한 각각의 서비스로 분할합니다. 각각의 서비스는 API를 통해 데이터를 주고 받으며 1개의 큰 서비스를 구성합니다.


모든 시스템의 구성요소가 한 프로젝트에 통합되어 있는 Monolithic Architecture(모놀리식 아키텍쳐)의 한계점을 극복하고자 등장하게 되었습니다.

 

  • 장점
    • 일부 서비스에 장애가 발생해도 전체 서비스에 영향을 끼치지 않는다.
    • 각각의 서비스들은 서로 다른 언어와 프레임워크로 구성될 수 있다.
    • 서비스의 확장이 용이하다.
  • 단점
    • 서비스가 분리되어 있어 테스트나 트랜잭션 처리 등이 어렵다.
    • 서비스 간에 API로 통신하기 때문에 그에 대한 비용이 발생한다.
    • 서비스 간의 호출이 연속적이기 때문에 디버깅 및 에러 트레이싱이 어렵다.

 

 

 

 

 

💡 최근에 읽은 기술 관련 책 이름이 무엇이고 인상 깊었던 부분을 얘기해주세요.

 

💡 본인이 사용했던 기술들과 그 기술을 사용했던 이유에 대해 설명하고, 대체 기술도 알고 있다면 얘기해주세요.

 

💡 하나의 비지니스 로직을 작성할 때 어느 수준으로 작성하는지, 무엇을 중요하게 생각하는지 얘기해주세요

 

💡 프로젝트를 진행하면서 어려웠던 점이 있었다면 설명해주세요.

 

💡 앞으로 쌓거나 경험하고 싶은 개발자 커리어가 있다면 얘기해주세요.

 

 

 

 

 

 

 

 

 

 


 

출처:

https://mangkyu.tistory.com/88
https://dev-coco.tistory.com/164
https://gyoogle.dev/blog/

'기술 면접 준비' 카테고리의 다른 글

[기술면접] Spring - 3/3  (0) 2023.03.02
[기술면접] Spring - 2/3  (0) 2023.03.02
[기술면접] Spring - 1/3  (0) 2023.03.02
[자료구조] 시간복잡도  (0) 2022.11.21
기술 면접 준비시 유용한 링크 모음집  (0) 2022.11.16