[디자인 패턴, 웹, Python/Django] 기술면접 준비

김태인·2022년 10월 4일
1

기술면접 준비

목록 보기
3/3

관심사 분리란 무엇인지 설명해주세요

  • 하나의 모듈 혹은 함수에서 여러가지의 관심사를 가지고 처리하려면 복잡성이 높아지니 하나의 관심사는 하나의 기능(역할)을 가지도록 구성하는 것
  • 객체지향적 특성, 디자인 패턴등에서 결론적으로 나오는 이야기입니다

SOLID 원칙에 대해 설명해주세요

  • SOLID는 객체지향 설계원칙으로 SRP, OCP, LSP, ISP, DIP 5가지 원칙이 존재합니다

  • SRP (Single Responsibility) 단일 책임 원칙
    → 클래스는 단 한개의 책임을 가져야함
    → 클래스를 변경하는 이유는 단 하나여야함
    → 이를 지키지 않으면 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향을 미칠 수 있습니다 (유지보수가 비효율적입니다)

  • OCP(Open-Closed) 개방-폐쇄 원칙
    → 확장에는 열려있어야 하고, 변경에서 닫혀있어야 함
    → 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 함
    → 이를 지키지않으면 instanceof 와 같은 연산자를 사용하거나, 다운캐스팅 발생

  • LSP (Liskov Substituion) 리스코프 치환 원칙
    → 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 함
    → 상속 관계에서는 꼭 일반화 관계(IS-A)가 성립해야 한다는 의미
    → 상속관계가 아닌 클래스들을 상속관계로 설정하면 이 원칙이 위배됨

  • ISP(Interface Segregation) 인터페이스 분리 원칙
    → 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다는 원칙
    → 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 함
    → 인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야 함

  • DIP(Dependency Inversion) 의존 역전 원칙
    → 의존 관계를 맺을 때, 변하기 쉬운 것(구체적인 것) 보다는 변하기 어려운 것(추상적인 것)에 의존해야 함
    → 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 됨
    → 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 함
    → 저수준 모듈이 변경되어도 고수준 모듈은 변경이 필요없는 형태가 이상적

웹서버와 WAS의 차이점 중심으로 설명해주세요

웹서버

  • 웹 서버는 정적인 데이터를 처리하는 서버
  • 이미지나 단순 HTML파일과 같은 리소스를 제공하는 서버를 웹 서버를 통하면 WAS를 이용하는것보다 빠르고 안정적

WAS

  • 동적인 데이터를 처리하는 서버
  • DB와 연결되어 데이터를 주고 받거나 프로그램으로 데이터 조작이 필요한 경우에는 WAS를 활용해야 함

ASGI와 WSGI가 무엇인지 각각 설명해주세요

WSGI (Web Server Gateway Interface)

  • 웹 서버 게이트웨이 인터페이스
  • Django와 Flask같은 웹 애플리케이션 프레임워크는 Web Server와 통신하게됩니다
  • 하지만 아파치나 Nginx등의 웹서버는 파이썬 코드를 이해하지 못하는데 이때 Python 계열의 프레임워크가 통신할 수 있게 해주는 미들웨어가 WSGI입니다

ASGI (Asynchronous Server Gateway Interface)

  • 비동기 서버 게이트웨이 인터페이스
  • WSGI와 비슷한 구조를 가지나 기본적으로 모든 요청을 비동기로 처리합니다
  • WSGI에서 지원되지 않는 웹소켓, http2.0 을 지원합니다
  • 비동기 호출이 가능함으로 여러 이벤트를 주고받을 수 있어 대용량 트래픽 처리를 유연하게 할 수 있습니다

파이썬에서 매개변수와 인자의 차이를 설명해주세요

  • 매개변수는 파라미터라고도 부르기도 하며 함수를 정의할 때 사용되는 변수를 의미합니다
  • 인자는 매개변수에 들어갈 변수의 값을 뜻합니다

파이썬에서의 상속, 오버라이딩에 대해 설명해주세요

상속

  • 상속이란 물려받다 라는 뜻으로, 클래스에도 개념을 적용할 수 있습니다
  • 어떤 클래스를 만들때 다른 클래스의 기능을 그대로 가지고 올 수 있다는 개념으로, 물려주는 클래스를 부모클래스, 물려받는 클래스를 자식 클래스 라고 합니다
  • 상속을 이용하면 중복코드가 작성되는것을 방지할 수 있고 코드의 유지보수가 쉬워집니다

오버라이딩

  • 오버라이딩은 부모 클래스의 메소드를 자식 클래스에서 재정의하여 사용하는것을 의미합니다
  • 클래스를 만들다보면 메소드의 이름은 같지만 기능을 다르게 해야할때가 있는데 이때 메소드 오버라이딩 개념을 적용하면 됩니다

파이썬 클래스에서의 init, self, super 개념에 대해 설명해주세요

init

  • 컨스트럭터라고 불리는 초기화를 위함 메소드
  • 인스턴스화를 실시할 때 반드시 처음에 호출되는 특수한 함수로 반드시 첫 번째 인수로는 self를 지정해야합니다

self

  • 인스턴스 자기 자신을 뜻합니다

super

  • 부모클래스를 상속받은 자식 클래스에서 부모클래스에 메소드를 호출할때 사용합니다

백엔드 개발자로서 Django를 선택한 이유와 Django로 개발하면서 어떤 장/단점을 느꼇는지 기술적인 측면 위주로 설명해주세요

  • 먼저 비전공자로써 첫 입문언어로 웹크롤링과, 머신러닝에서 두각을 내고있는 파이썬을 배우고싶었던것을 시작으로, 파이썬을 다루다보니 기반된 웹 프레임워크를 다뤄야했고 그중에 가장 강력한 웹 프레임워크는 Django라고 생각했습니다

  • 기본적인 admin을 제공하는것은 물론, 로그인 회원가입등 반복적으로 구현해야하는 부분들을 대부분 만들어져있다보니 빠르게 업무에 투입되어 실무감각을 키울 수 있을것같다는게 제일 큰 이유였습니다

  • 장고로 개발하면서 제가 생각한것 이상으로 많은것들이 이미 구현이 되어있어서 공식문서를 통해 예제를 이해하고 가져다 쓰면 빠르게 결과물이 나오는것이 가장 큰 장점이라 느꼇습니다

  • 반대로 장점과 동시에 단점이라고 느꼇던 부분인데요
    많은 부분이 이미 만들어져있는 프레임 워크다보니 커스텀하기가 까다롭고 파이썬의 단점을 그대로 가져와 인터프리터 언어이기 때문에 생기는 느린 속도와 동적 입력 형태로 인한 디버깅의 어려움등이 있었습니다

동기와 비동기방식을 설명해보세요

  • 동기는 말 그대로 동시에 일어난다는 뜻으로 요청과 그 결과가 동시에 일어난다는 약속입니다
    바로 요청을 하면 시간이 얼마가 걸리던지 요청한 자리에서 결과가 주어져야 합니다
    설계가 매우 간단하고 직관적이지만 결과가 주어질 때까지 아무것도 못하고 대기해야하는 단점이 있습니다

  • 비동기는 동시에 일어나지 않는다를 의미합니다. 요청과 결과가 동시에 일어나지 않고, 결과가 주어지는데 시간이 걸리더라도 그 시간동안 다른 작업을 할 수 있음으로 자원을 효율적으로 사용할 수 있습니다

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

OOP(객체 지향 프로그래밍)
이란 문제를 여러 개의 객체 단위로 나눠 작업하는 방식
으로, 객체들이 서로 유기적으로 상호작용하는 프로그래밍 이론입니다

장점
→ 코드 재사용성 증가
→ 생산성 향상
→ 자연적인 모델링
→ 유지보수의 우수성

단점
→ 개발속도가 느린점
→ 실행속도가 느림
→ 코딩 난이도 상승

특징
→ 클래스를 이용해 연관있는 처리 부분(함수)과 데이터 부분(변수)을 하나의 객체(인스턴스)로 묶어 생성해 사용한다는 점

객체지향 프로그래밍은 캡슐화, 추상화, 상속성, 다형성 네 가지 특징을 지님

OOP는 위 네 가지 특성들을 통해서 어떤 대상을 추상화(Abstraction)하여 공통점을 찾고, 그것을 캡슐화(Encapsulation)해 한 군데에 모아 객체를 만들고, 새로운 객체가 상속(Inheritance)받아 재사용이 가능하게 만들어 준다.

상속받은 객체는 다형성(Polymorphism)을 통해 기능을 수정 또는 추가하여 재사용할 수 있다.

캡슐화, 추상화, 상속성, 다형성이란?

캡슐화 (Encapsulation)

  • 캡슐화란 데이터와 코드의 형태를 외부로부터 알 수 없게하고, 데이터의 구조와 역할, 기능을 하나의 캡슐형태로 만드는 방법이다.

  • 캡슐화의 중요한 목적은 변수를 private로 선언하여 데이터를 보호하고, 보호된 변수는 getter나 setter등의 메서드를 통해서만 간접적으로 접근을 허용하는 것 이다.

  • 캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다.
    캡슐화와 정보은닉은 동일한 개념은 아니다.

추상화 (Abstraction)

  • 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말한다.

  • 다시 말해 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통 특성을 파악해 필요없는 특성을 제거하는 과정을 가르킨다.

  • 객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다.

  • 정리하면 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라 할 수 있다.

상속(Inheritance)

  • 상속이란 기존 상위클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새로운 하위 클래스에 새로운 기능도 추가할 수 있는 것이다.

  • 즉, 부모가 자식에게 유전자를 물려주듯이 부모의 특징을 자식에게 모두 물려준다.

  • OOP에서 이를 부모 클래스, 자식 클래스라고 표현한다.

  • 상속이 필요한 이유는 코드의 중복을 없애기 위해서다.

  • 코드의 중복이 많아지면 개발 단계와 유지 보수에서 많은 비용이 들게 된다.

  • 상속관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없다.

다형성(Polymorphism)

  • 다형성이란 상속과 연관있는 개념으로 한 객체가 상속을 통해 기능을 확장하거나 변경하여 다른 여러형태(객체)로 재구성 되는 것을 말한다.

  • 쉽게 말하면 한 부모의 밑에서 태어난 자식들이 조금씩 다르다는 것이다.

  • 오버로드(Overload) 또는 오버라이드(Override)가 다형성의 대표적인 예라 할 수있고, 이것을 구현하는 걸 오버로딩(Overloading)과 오버라이딩(Overriding)이라고 한다.

  • 간단하게 설명하자면,
    오버라이딩은 하위 클래스(자식)가 상위 클래스(부모)에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는 것을 말한다.

  • 오버로딩은 하나의 클래스 안에서 같은 이름의 메서드를 사용하지만 각 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현하는 것을 말한다.

  • 오버로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 개수나 데이터 타입이 달라야 한다.

  • 다형성을 사용하면 같은 이름의 속성을 유지함으로서, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는다.

  • API가 많아질수록 복잡성은 증가하기 때문에 다형성은 유용하며 코드 재사용성을 늘려주어 유지보수가 용이하도록 도와주는 개념이다.

profile
코딩이 취미가 되는 그날까지

0개의 댓글