모의면접 대비

김윤서·2024년 8월 26일
0

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

  • 표준화된 접근: REST는 HTTP 프로토콜을 기반으로 하여, GET, POST, PUT, DELETE와 같은 HTTP 메서드를 사용해 자원을 처리합니다. 이로 인해 API 설계가 표준화되며, 개발자들이 쉽게 이해하고 사용할 수 있습니다.
    유연성과 확장성: RESTful API는 클라이언트와 서버 간의 결합도가 낮아 유연성과 확장성이 높습니다. 서버는 클라이언트와 독립적으로 개발되고 배포될 수 있으며, 서버의 변화가 클라이언트에 큰 영향을 미치지 않습니다.
    효율성: RESTful API는 서버와 클라이언트 간에 필요한 데이터만 전송할 수 있도록 설계되어 있어 네트워크 사용을 최적화합니다. 또한, HTTP 캐싱을 통해 자주 요청되는 리소스를 캐시하여 응답 속도를 높일 수 있습니다.
    독립성: RESTful API는 클라이언트와 서버가 독립적으로 작동할 수 있게 설계됩니다. 클라이언트는 서버의 내부 구조나 구현 방식에 대한 지식 없이도 API를 사용할 수 있습니다. 이는 개발 팀 간의 협업을 용이하게 합니다.
    확장성: RESTful API는 확장성이 뛰어나며, 여러 클라이언트(웹, 모바일, IoT 등)에서 동일한 API를 사용할 수 있습니다. 이를 통해 다양한 플랫폼에 걸쳐 일관된 데이터와 기능을 제공할 수 있습니다.
    가독성: RESTful API는 자원을 URL로 표현하며, 각 URL은 고유한 자원을 나타냅니다. 이를 통해 API의 구조가 직관적이고, 문서화하기 쉽습니다. 예를 들어, /users/123라는 URL은 사용자 ID가 123인 자원을 명확하게 나타냅니다.
    보안: RESTful API는 HTTPS를 사용하여 데이터를 암호화할 수 있으며, 인증 및 권한 부여를 위한 다양한 표준(예: OAuth)을 지원합니다. 이를 통해 보안성을 강화할 수 있습니다.
    플랫폼 독립성: RESTful API는 HTTP를 기반으로 하기 때문에, 다양한 프로그래밍 언어와 플랫폼에서 사용할 수 있습니다. 이는 이질적인 시스템 간의 상호 운용성을 향상시킵니다.

적절한 관심사 분리의 필요한 이유는?

  • 적절한 관심사 분리가 필요한 이유는 소프트웨어 개발에서 코드의 유지보수성과 확장성을 높이며, 개발 과정에서의 효율성을 크게 향상시키기 때문입니다. 관심사 분리가 잘 이루어지면 다음과 같은 장점을 누릴 수 있습니다.
    코드의 가독성 향상: 관심사가 분리된 코드는 각 모듈이나 클래스가 특정한 역할에 집중하게 되어, 코드가 더 명확하고 이해하기 쉬워집니다. 이를 통해 다른 개발자나 자신이 나중에 코드를 다시 읽을 때도 쉽게 이해할 수 있습니다.
    유지보수성 강화: 특정 기능이나 요구사항이 변경될 때, 관심사 분리가 잘 되어 있다면 수정이 필요한 부분이 명확해지고, 관련된 코드만 수정하면 됩니다. 이는 버그 수정이나 새로운 기능 추가 시 발생할 수 있는 실수를 줄여줍니다.
    재사용성 증가: 잘 분리된 모듈은 독립적으로 동작할 수 있기 때문에, 다른 프로젝트나 코드에서 재사용하기가 쉽습니다. 이는 중복 코드를 줄이고, 개발 시간을 단축하는 데 도움이 됩니다.
    테스트 용이성: 각 모듈이 독립적으로 동작하게 되면, 해당 모듈만을 독립적으로 테스트할 수 있습니다. 이를 통해 유닛 테스트를 쉽게 작성하고, 테스트 커버리지를 높일 수 있습니다. 또한, 문제 발생 시 원인을 빠르게 파악할 수 있습니다.
    협업 효율성 증가: 대규모 프로젝트에서는 여러 개발자가 동시에 작업하는 경우가 많습니다. 관심사 분리가 잘 되어 있으면, 팀원들이 서로 간섭하지 않고 독립적으로 작업할 수 있어 협업 효율이 높아집니다.
    확장성 향상: 시스템이 확장될 때, 관심사 분리가 잘 되어 있으면 새로운 기능을 추가하거나 기존 기능을 확장하기가 더 쉽습니다. 기존 코드에 대한 영향을 최소화하면서 새로운 요구사항을 반영할 수 있습니다.
    변경 영향 최소화: 시스템의 한 부분이 변경될 때, 다른 부분에 미치는 영향을 최소화할 수 있습니다. 이는 코드의 안정성을 높이고, 변경으로 인한 리스크를 줄이는 데 도움이 됩니다.
    결론적으로, 적절한 관심사 분리는 소프트웨어 개발의 품질을 높이고, 장기적으로 유지보수와 확장에 필요한 시간과 비용을 줄여주는 중요한 설계 원칙입니다.

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

  • Setter를 무분별하게 사용하면 안 되는 이유는 객체 지향 프로그래밍의 원칙과 코드의 품질, 유지보수성 등에 부정적인 영향을 미칠 수 있기 때문입니다. 주요 이유는 다음과 같습니다.
    캡슐화 원칙 위반: 캡슐화는 객체의 내부 상태를 외부에서 직접 접근하거나 수정할 수 없도록 보호하는 원칙입니다. Setter를 무분별하게 사용하면 객체의 내부 상태가 외부에서 쉽게 변경될 수 있어, 객체가 자신의 상태를 스스로 관리하지 못하게 됩니다. 이는 객체의 일관성을 깨뜨리고, 예기치 않은 버그를 초래할 수 있습니다.
    객체의 불변성 저해: 객체가 불변(immutable) 상태로 유지되면, 상태 변화로 인한 예기치 않은 부작용을 피할 수 있습니다. Setter를 남용하면 객체의 상태가 언제든지 변경될 수 있어, 코드의 예측 가능성과 안정성이 떨어집니다. 특히 멀티스레딩 환경에서는 상태 변경으로 인한 경쟁 조건이 발생할 수 있습니다.
    의도하지 않은 사용: Setter가 제공되면, 객체의 상태를 변경할 권한이 외부에 주어집니다. 이로 인해 외부 코드가 객체의 상태를 부적절하게 변경할 가능성이 높아집니다. 이는 객체의 설계 의도와 다른 방식으로 객체가 사용될 수 있다는 것을 의미합니다.
    테스트와 디버깅의 어려움: Setter를 통해 객체의 상태가 자유롭게 변경될 수 있으면, 특정 시점에서 객체가 어떤 상태인지 파악하기 어려워집니다. 이는 테스트와 디버깅을 어렵게 만들며, 문제의 원인을 추적하는 데 많은 시간을 소요하게 합니다.
    코드의 응집도 저하: Setter를 통해 객체의 내부 상태를 외부에서 변경하게 되면, 객체의 책임이 분산됩니다. 이는 코드의 응집도를 낮추며, 객체가 특정 작업에 집중할 수 없게 만듭니다. 응집도가 낮아지면, 코드의 유지보수성과 이해도가 떨어집니다.
    객체의 책임이 모호해짐: 객체는 자신의 상태를 관리하는 책임을 가져야 합니다. 그러나 Setter를 통해 외부에서 상태를 변경할 수 있게 되면, 객체의 책임이 모호해집니다. 객체는 자신의 상태를 어떻게 설정해야 하는지에 대해 명확한 로직을 가지지 않게 됩니다.
    디자인 원칙 위반 (예: Tell, Don’t Ask): 객체 지향 설계에서는 "Tell, Don’t Ask" 원칙이 중요합니다. 이는 객체의 상태를 물어보는 대신, 객체에게 무엇을 해야 하는지 명령하는 것이 바람직하다는 의미입니다. Setter를 사용하면, 객체의 상태를 외부에서 묻고 변경하게 되므로 이 원칙을 위반하게 됩니다.

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

  • RDBMS (Relational Database Management System)
    특징:
    데이터 모델: RDBMS는 관계형 모델을 기반으로 하며, 데이터를 테이블(표)로 구조화하여 저장합니다. 각 테이블은 행(레코드)과 열(속성)으로 구성되며, 테이블 간의 관계를 정의할 수 있습니다.
    스키마 기반: RDBMS는 엄격한 스키마를 요구합니다. 데이터베이스를 설계할 때 테이블의 구조를 미리 정의해야 하며, 데이터는 이 구조에 따라 저장됩니다. 이로 인해 데이터 무결성을 유지할 수 있습니다.
    SQL 사용: RDBMS는 SQL(Structured Query Language)을 사용하여 데이터베이스와 상호작용합니다. SQL은 데이터를 쿼리하고 조작하는 표준 언어로, 복잡한 쿼리와 조인 연산을 수행할 수 있습니다.
    트랜잭션 관리: RDBMS는 ACID(Atomicity, Consistency, Isolation, Durability) 속성을 지원하여 데이터의 일관성과 무결성을 보장합니다. 트랜잭션이 성공적으로 완료되면 데이터베이스 상태가 일관되게 유지됩니다.
    확장성: RDBMS는 수직 확장(서버 성능을 높이는 방법)을 통해 확장되는 경우가 많습니다. 이는 스케일업(scale-up)이라고 불리며, 시스템의 물리적 제한이 도달할 때 확장성에 제약이 있을 수 있습니다.
    장점:
    데이터 무결성과 일관성 보장
    복잡한 쿼리와 관계형 데이터 처리에 강점
    광범위한 툴과 커뮤니티 지원
    단점:
    스키마의 유연성이 부족하여, 변경이 어려울 수 있음
    대규모 데이터와 수평 확장에 제한이 있을 수 있음
    사용 사례:
    금융 시스템, ERP, CRM 등 높은 데이터 일관성과 복잡한 트랜잭션을 요구하는 애플리케이션에서 주로 사용됩니다.
    NoSQL (Not Only SQL)
    특징:
    데이터 모델: NoSQL은 다양한 데이터 모델(키-값, 도큐먼트, 열 기반, 그래프 등)을 지원합니다. 이로 인해 데이터 구조가 덜 엄격하며, 비정형 데이터나 반정형 데이터 처리에 유리합니다.
    스키마리스: NoSQL 데이터베이스는 스키마리스(schema-less) 특성을 가지며, 사전에 테이블 구조를 정의하지 않아도 데이터를 저장할 수 있습니다. 이로 인해 구조 변경이 유연하고, 다양한 형식의 데이터를 쉽게 처리할 수 있습니다.
    확장성: NoSQL은 수평 확장(여러 서버에 데이터를 분산하여 저장하는 방법)에 적합합니다. 이를 통해 대규모 데이터 처리와 높은 처리량을 효율적으로 처리할 수 있습니다.
    트랜잭션 관리: 대부분의 NoSQL 데이터베이스는 완전한 ACID 트랜잭션을 지원하지 않으며, 대신 CAP 이론에 따라 일관성(consistency), 가용성(availability), 파티션 내구성(partition tolerance) 중에서 특정 특성에 집중하는 경우가 많습니다.
    유연한 쿼리 언어: SQL 대신, NoSQL은 특정 데이터 모델에 따라 다양한 쿼리 언어나 API를 제공합니다. 예를 들어, 도큐먼트 데이터베이스는 JSON 기반의 쿼리를 사용할 수 있습니다.
    장점:
    스키마의 유연성으로 인해 구조가 자주 변경되는 애플리케이션에 적합
    대규모 데이터 처리와 고가용성 요구 사항에 최적화
    빠른 읽기/쓰기 성능
    단점:
    SQL처럼 표준화된 쿼리 언어가 없어 학습 곡선이 있을 수 있음
    데이터 일관성을 완전히 보장하지 않는 경우가 있어, 특정 애플리케이션에는 부적합할 수 있음
    사용 사례:
    대규모 소셜 미디어 플랫폼, 실시간 데이터 분석, 비정형 데이터 처리(예: 로그 데이터, IoT 데이터) 등에서 자주 사용됩니다.
    RDBMS와 NoSQL 비교
    데이터 구조: RDBMS는 정형화된 구조(테이블)를 사용하고, NoSQL은 유연한 구조(키-값, 도큐먼트 등)를 사용합니다.
    확장성: RDBMS는 수직 확장에 더 적합하며, NoSQL은 수평 확장에 최적화되어 있습니다.
    트랜잭션: RDBMS는 ACID 트랜잭션을 완벽하게 지원하는 반면, NoSQL은 CAP 이론에 따라 일관성보다는 가용성과 확장성에 초점을 맞출 수 있습니다.
    적용 분야: RDBMS는 전통적인 업무용 애플리케이션에서 강점이 있으며, NoSQL은 빅데이터, 클라우드 기반 애플리케이션, 실시간 데이터 처리에 적합합니다.

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

  • 객체지향 프로그래밍(Object-Oriented Programming, OOP)은 객체를 중심으로 프로그램을 설계하고 구현하는 프로그래밍 패러다임입니다. 객체는 데이터(속성, 필드)와 이 데이터에 대한 동작(메서드, 함수)을 하나로 묶은 독립적인 단위입니다. OOP의 핵심 개념은 클래스와 객체로, 클래스는 객체를 생성하기 위한 템플릿(청사진) 역할을 합니다.
    OOP의 주요 특징
    캡슐화 (Encapsulation):
    객체는 데이터를 보호하기 위해 외부에서 직접 접근할 수 없도록 내부 상태를 감춥니다. 데이터를 수정하거나 조회하는 방식은 객체가 제공하는 메서드를 통해 이루어집니다.
    예: 클래스 내부에서 변수는 private으로 선언하고, 접근을 위해 getter와 setter 메서드를 사용합니다.
    상속 (Inheritance):
    상속은 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)에서 재사용하거나 확장할 수 있는 기능을 제공합니다.
    예: Animal이라는 부모 클래스를 상속받아 Dog, Cat 등의 자식 클래스를 정의할 수 있습니다.
    다형성 (Polymorphism):
    다형성은 같은 이름의 메서드가 서로 다른 객체에서 다른 동작을 하도록 하는 특성입니다. 이는 메서드 오버라이딩(override)과 오버로딩(overload)을 통해 구현됩니다.
    예: speak()라는 메서드가 Dog 클래스에서는 짖는 소리를, Cat 클래스에서는 야옹 소리를 내도록 구현할 수 있습니다.
    추상화 (Abstraction):
    추상화는 객체의 복잡성을 줄이고, 필요한 부분만 노출하는 기법입니다. 인터페이스나 추상 클래스를 통해 구현되며, 객체의 구현 세부 사항을 숨기고 중요한 기능만 드러냅니다.
    예: Vehicle이라는 추상 클래스를 만들고, 구체적인 구현은 Car와 Bicycle 클래스에서 처리합니다.
    OOP의 활용 방법
    OOP는 다양한 소프트웨어 개발에서 활용될 수 있으며, 다음과 같은 방식으로 적용할 수 있습니다
    모듈화된 코드 작성:
    객체지향 프로그래밍에서는 프로그램을 여러 객체로 분리하여 모듈화된 코드를 작성할 수 있습니다. 이는 코드의 재사용성을 높이고 유지보수를 쉽게 합니다.
    예: 사용자 인증 시스템을 개발할 때, User, Session, Authenticator 등의 클래스를 만들어 각각의 책임을 분리할 수 있습니다.
    복잡한 시스템 설계:
    OOP는 복잡한 시스템을 설계할 때 유용합니다. 상속과 다형성을 활용하여 코드의 중복을 줄이고, 시스템의 유연성을 높일 수 있습니다.
    예: 게임 개발에서, 다양한 종류의 적 캐릭터가 공통적인 행동(이동, 공격)을 공유하면서도 각기 다른 방식으로 동작하도록 구현할 수 있습니다.
    유지보수성과 확장성:
    OOP의 캡슐화와 추상화 덕분에 코드 변경이 필요한 경우, 해당 객체나 클래스만 수정하면 됩니다. 이는 코드의 유지보수성을 높이고, 새로운 기능을 추가할 때 기존 코드를 크게 변경하지 않고도 확장할 수 있게 합니다.
    예: 전자상거래 시스템에서, 결제 방식에 새로운 유형(예: 암호화폐)을 추가하려면 Payment 클래스를 상속받아 새로운 클래스를 작성하기만 하면 됩니다.
    테스트와 디버깅:
    OOP를 사용하면 개별 객체를 독립적으로 테스트할 수 있어, 유닛 테스트 작성이 용이합니다. 또한, 객체 간의 상호작용을 분리하여 디버깅을 쉽게 할 수 있습니다.
    예: 쇼핑 카트 시스템에서, Cart 클래스와 Product 클래스를 독립적으로 테스트한 후, 이들이 함께 동작하는지 통합 테스트를 수행할 수 있습니다.
    디자인 패턴 적용:
    OOP는 다양한 디자인 패턴(예: 싱글톤, 팩토리, 전략 패턴)을 적용하는 데 적합합니다. 이러한 패턴들은 자주 발생하는 설계 문제를 해결하기 위해 널리 사용됩니다.
    예: 데이터베이스 연결을 관리하기 위해 싱글톤 패턴을 적용하여, 애플리케이션 내에서 단 하나의 데이터베이스 연결 객체만 사용하도록 할 수 있습니다.
    결론
    객체지향 프로그래밍은 소프트웨어 개발에서 모듈화, 재사용성, 유지보수성, 확장성을 크게 향상시킬 수 있는 강력한 패러다임입니다. 객체와 클래스를 사용하여 실세계의 개념을 프로그램에 반영하고, 복잡한 시스템을 효율적으로 관리할 수 있습니다. OOP의 원칙과 기법을 잘 이해하고 적용하면, 더욱 견고하고 유연한 소프트웨어를 개발할 수 있습니다.

0개의 댓글