카테고리 없음

모의면접 질문 준비

codi-3 2024. 9. 3. 11:28

1. RESTful한 API를 설계하는 장점은?

RESTful API를 설계하는 주요 장점은 다음과 같습니다:

  • 표준화된 인터페이스: REST는 HTTP 표준을 기반으로 하여, 클라이언트와 서버 간의 통신이 직관적이고 표준화됩니다. 이는 다양한 클라이언트(웹, 모바일, 기타 서비스)가 동일한 API를 쉽게 사용할 수 있게 해줍니다.
  • 유연성: RESTful API는 클라이언트와 서버가 독립적으로 개발되고 유지될 수 있게 해줍니다. 서버에서 데이터베이스 구조나 비즈니스 로직을 변경하더라도, API 인터페이스가 유지되면 클라이언트 측에 영향을 미치지 않습니다.
  • 확장성: REST는 자원을 URI로 식별하고, 이를 CRUD 방식으로 다루므로, 서비스 확장이나 새로운 기능 추가가 용이합니다.
  • 캐싱: HTTP 프로토콜의 캐싱 기능을 활용할 수 있어, 성능 향상과 서버 부하 감소에 유리합니다.

2. 적절한 관심사 분리가 필요한 이유는?

관심사 분리(Separation of Concerns)는 소프트웨어 설계에서 중요한 원칙 중 하나입니다. 이를 실천하면 다음과 같은 이점을 얻을 수 있습니다:

  • 유지보수성 향상: 각 모듈이나 컴포넌트가 독립적으로 동작하게 되어, 특정 기능을 수정하거나 교체할 때 다른 부분에 영향을 최소화할 수 있습니다.
  • 가독성: 코드가 명확하게 분리되어 있어, 개발자들이 코드를 이해하고 수정하기가 쉬워집니다.
  • 테스트 용이성: 분리된 모듈은 독립적으로 테스트할 수 있으므로, 버그를 찾고 해결하는 과정이 효율적입니다.
  • 재사용성: 잘 분리된 모듈은 다른 프로젝트나 기능에서 재사용할 수 있어, 코드 중복을 줄이고 개발 속도를 높일 수 있습니다.

3. Setter를 무분별하게 사용하면 안되는 이유 무엇인가요?

Setter를 무분별하게 사용하면 다음과 같은 문제가 발생할 수 있습니다:

  • 캡슐화 위반: 객체의 내부 상태를 외부에서 직접 변경할 수 있게 되어, 객체지향 프로그래밍의 핵심 원칙인 캡슐화(encapsulation)를 해칩니다.
  • 불변성 침해: 객체의 상태가 쉽게 변경될 수 있어, 의도치 않은 사이드 이펙트가 발생할 수 있습니다. 이는 특히 멀티스레딩 환경에서 동시성 문제를 야기할 수 있습니다.
  • 유지보수 어려움: 객체 상태를 추적하고 문제를 디버깅하기 어려워질 수 있습니다. 또한, 코드 복잡도가 증가하여 유지보수가 어려워질 수 있습니다.
  • 객체의 일관성 훼손: Setter를 통해 객체의 일부 상태만 변경하면, 객체의 일관성을 유지하기 어렵습니다.

4. NoSQL과 RDBMS에 대해 아는대로 설명해주세요.

NoSQL과 RDBMS는 데이터베이스 관리 시스템의 두 가지 주요 유형입니다:

  • RDBMS(Relational Database Management System):
    • 데이터 구조: 데이터를 테이블 형태로 저장하며, 테이블 간의 관계를 정의합니다. SQL(Structured Query Language)을 사용하여 데이터를 관리합니다.
    • 장점: 데이터 무결성 유지, 트랜잭션 지원, 복잡한 쿼리 처리에 강합니다.
    • 단점: 수평적 확장이 어려우며, 대규모 분산 환경에서 성능 저하가 발생할 수 있습니다.
  • NoSQL(Not Only SQL):
    • 데이터 구조: 테이블 대신, 키-값, 도큐먼트, 컬럼 패밀리, 그래프 등 다양한 데이터 모델을 지원합니다.
    • 장점: 수평적 확장이 용이하며, 빅데이터와 같은 대규모 데이터를 처리하는 데 적합합니다. 스키마리스 구조를 통해 유연성을 제공합니다.
    • 단점: 데이터 무결성 보장이 어렵고, 복잡한 쿼리 처리에는 적합하지 않을 수 있습니다. 또한, 표준화된 쿼리 언어가 부족한 경우도 있습니다.

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

객체지향 프로그래밍(OOP, Object-Oriented Programming)은 프로그램을 객체로 구성하여 설계하고 구현하는 프로그래밍 패러다임입니다. 주요 개념은 다음과 같습니다:

  • 캡슐화(Encapsulation): 객체의 상태와 행동을 하나의 단위로 묶어 외부에서 내부 상태를 직접 접근하지 못하도록 보호합니다.
  • 상속(Inheritance): 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받아 재사용할 수 있습니다.
  • 다형성(Polymorphism): 동일한 인터페이스나 부모 클래스를 통해 여러 다른 형태의 객체를 다룰 수 있습니다.
  • 추상화(Abstraction): 복잡한 시스템을 단순화하여 중요한 부분만 표현하고, 불필요한 세부 사항을 숨깁니다. 추상화는 인터페이스나 추상 클래스를 통해 객체의 공통된 특징을 정의하고, 구체적인 구현은 이를 상속하는 클래스에서 담당하게 합니다.

활용 방법:

  • 코드 재사용성: 상속과 다형성을 통해 중복 코드를 줄이고, 공통된 기능을 공유함으로써 코드 재사용성을 높일 수 있습니다.
  • 유지보수성: 객체 단위로 코드가 분리되어 있어, 유지보수와 확장이 용이합니다.
  • 모듈화: 시스템을 객체로 분리하여, 각 객체가 독립적으로 동작하도록 모듈화할 수 있습니다.
  • 현실 세계 모델링: 객체지향 프로그래밍은 현실 세계의 문제를 더 직관적으로 모델링하고 해결하는 데 유리합니다.