1. OAuth에 대해서 설명해주세요.
OAuth는 사용자 자격 증명을 제공하지 않고도 애플리케이션이 타사 서비스의 자원에 접근할 수 있도록 하는 권한 부여 프레임워크입니다. OAuth 2.0의 주요 요소와 작동 방식 입니다.
-
주요 요소:
- Resource Owner: 자원에 대한 권한을 가진 사용자.
- Client: 자원에 접근하려는 애플리케이션.
- Resource Server: 보호된 자원이 저장된 서버.
- Authorization Server: 사용자 인증 및 권한 부여 토큰을 발급하는 서버.
- Access Token: 클라이언트가 자원 서버에 요청을 보낼 때 사용하는 토큰.
-
작동 방식:
- 사용자 권한 요청: 클라이언트는 사용자를 권한 서버로 리디렉션하여 권한을 요청합니다.
- 사용자 인증 및 권한 부여: 사용자는 권한 서버에서 로그인하고 권한을 부여합니다.
- Authorization Code 발급: 권한 서버는 클라이언트에 Authorization Code를 발급합니다.
- Access Token 요청: 클라이언트는 Authorization Code를 사용해 권한 서버에 Access Token을 요청합니다.
- Access Token 발급: 권한 서버는 클라이언트에 Access Token을 발급합니다.
- 자원 접근: 클라이언트는 Access Token을 사용해 자원 서버에 접근합니다.
OAuth는 사용자의 비밀번호를 공유하지 않고도 안전하게 자원에 접근할 수 있게 해주는 중요한 인증 및 권한 부여 메커니즘입니다.
2. 클래스형과 함수형의 차이를 설명해주세요. 어떤 방식을 주로 사용하였고 그 이유가 뭔지 답변해주세요.
클래스형 프로그래밍 (Class-based Programming)
-
정의:
- 클래스형 프로그래밍은 객체지향 프로그래밍(OOP)의 한 형태로, 데이터와 메서드를 하나의 단위(클래스)로 묶어 사용하는 방식입니다.
-
구성 요소:
- 클래스: 객체를 생성하기 위한 청사진입니다.
- 객체: 클래스에서 생성된 인스턴스로, 클래스의 속성과 메서드를 가집니다.
-
특징:
- 캡슐화: 데이터와 메서드를 하나의 클래스 안에 묶어 보호합니다.
- 상속: 기존 클래스를 기반으로 새로운 클래스를 만들 수 있습니다.
- 다형성: 동일한 인터페이스를 통해 다양한 구현을 사용할 수 있습니다.
- 추상화: 중요한 개념에 집중하고 세부 사항을 숨깁니다.
-
예시 (Python):
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def speak(self):
return f"{self.name} says Woof!"
dog = Dog("Buddy")
print(dog.speak())
함수형 프로그래밍 (Functional Programming)
-
정의:
- 함수형 프로그래밍은 함수를 일급 객체로 사용하고, 상태와 변경을 피하며 순수 함수를 사용하는 프로그래밍 패러다임입니다.
-
구성 요소:
- 순수 함수: 동일한 입력에 항상 동일한 출력을 반환하고, 외부 상태를 변경하지 않습니다.
- 고차 함수: 함수를 인자로 받거나 함수를 반환하는 함수입니다.
- 불변성: 데이터는 변경되지 않으며, 새로운 데이터 구조를 생성하여 사용합니다.
-
특징:
- 상태 없음: 함수는 상태를 가지지 않으며, 입력만을 기반으로 출력을 생성합니다.
- 선언적: 무엇을 할 것인지를 설명하고, 어떻게 할 것인지는 설명하지 않습니다.
- 병렬 처리에 유리: 상태 변경이 없기 때문에 병렬 처리가 쉽습니다.
-
예시 (Python):
def add(x, y):
return x + y
def apply_function(func, value):
return func(value)
result = apply_function(lambda x: add(x, 2), 3)
print(result)
어떤 방식을 주로 사용하였고 그 이유가 뭔지 답변해주세요.
저는 주로 클래스형 프로그래밍을 사용합니다. 그 이유는 다음과 같습니다:
-
복잡한 애플리케이션 구조:
- 클래스형 프로그래밍은 데이터와 메서드를 하나의 단위로 묶어 관리할 수 있어 복잡한 애플리케이션 구조를 설계하고 유지보수하기에 적합합니다.
-
재사용성:
- 상속과 다형성 덕분에 코드의 재사용성이 높아지고, 새로운 기능을 추가할 때 기존 코드를 재사용하거나 확장하기 쉽습니다.
-
명확한 구조:
- 객체지향 프로그래밍은 코드의 구조가 명확하고, 각 객체의 역할과 책임이 분명히 정의되어 가독성과 유지보수성이 높습니다.
-
대규모 프로젝트:
- 대규모 프로젝트에서는 여러 팀이 협력해야 하며, 클래스형 프로그래밍은 모듈화와 캡슐화를 통해 팀 간 협업을 용이하게 합니다.
그러나, 함수형 프로그래밍의 장점도 이해하고 있으며, 특히 불변성과 순수 함수의 사용으로 인해 코드의 예측 가능성과 병렬 처리 효율성이 필요한 상황에서는 함수형 프로그래밍을 사용하기도 합니다.
프로젝트의 요구 사항에 따라 두 가지 패러다임을 적절히 조합하여 사용하는 것이 중요합니다.