객체 지향 프로그래밍
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 프로그램을 객체들의 모임으로 바라보고 객체들 간의 상호작용을 프로그램의 기본 구성 요소로 취급하는 개념이다. 객체지향 프로그래밍에서는 프로그램을 구성하는 각각의 객체가 데이터와 이를 처리하는 메서드를 가지며, 객체들 간의 상호작용을 통해 프로그램이 동작한다.
특징
- 추상화
- 객체들의 공통적인 특징(기능, 속성)을 도출하는 것
- 객체 지향적 관점에서는 클래스 정의를 추상화라고 할 수 있다.
- 캡슐화
- 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
- 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
- 상속
- 부모 클래스가 가진 특징(함수, 데이터)를 자식 클래스가 그대로 물려받는 것
- 기존 코드를 재활용해서 사용함으로써 객체 지향 프로그래밍의 중요한 기능 중 하나에 속한다.
- 다형성
- 여러 개의 서로 다른 클래스가 동일한 인터페이스를 구현하거나 상속 관계에 있을 때 동일한 메서드 호출에 대해 각기 다른 동작을 수행할 수 있는 것(오버라이딩)
장점
- 모듈화와 재사용성(유지보수)
- 코드를 객체 단위로 모듈화하여 작성하기 때문에 코드의 재사용성이 높아지고 유지보수가 쉬워진다.
- 가독성, 생산성
- 객체의 속성과 메서드가 명확하게 구분되어 있기 때문에 가독성이 높아지고 코드의 재사용으로 생산성이 높아진다.
단점
- 학습곡선
- 다양한 개념과 원칙을 익혀야 하는 문제로 학습 곡선이 높다.
- 메모리 사용량, 실행 속도
- 객체 단위로 데이터를 처리하기 때문에 메모리의 사용량이 늘어나고 실행 속도가 느려질 수 있다.
- 복잡한 설계
- 모듈화와 재사용성, 객체 간의 관계 설정이 복잡해 설계시 많은 노력이 필요하다.
- SRP - 하나의 클래스는 하나의 책임만 가져야 한다.
- OCP - 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- LSP - 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다.
- ISP - 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.
- DIP - 구체적인 것이 아닌 추상적인 것에 의존해야 한다.
REST API
HTTP 프로토콜의 기본적인 요청 메서드(GET, POST, PUT, DELETE)를 이용하여 자원을 처리하기 때문에 간단하고 효율적인 구조를 갖추고 있다.
특징
- Uniform Interface(일관된 인터페이스): URI(Uniform Resource Identifier)를 통해 자원에 접근하고, HTTP 메서드를 통해 해당 자원을 처리한다.
- Stateless(무상태성): 서버는 각 요청을 독립적으로 처리하며, 이전 요청과 관계를 유지하지 않는다.
- Cacheable(캐시 가능): 클라이언트는 응답을 캐싱할 수 있으며, 이를 통해 서버의 부하를 줄일 수 있다.
- Self-descriptiveness(자체 표현 구조): HTTP 요청 메시지 자체가 어떤 메시지인지 알 수 있다.
Client-Server 구조: 클라이언트와 서버는 각각 독립적으로 구현되어야 하며, 서로간의 의존성이 줄어든다.
REST API를 사용하면, 다양한 클라이언트(브라우저, 모바일 앱 등)에서 동일한 서버 자원을 공유할 수 있고 확장성과 유지보수성이 좋아진다.
다른 API 스타일
SOAP API
XML 기반으로 작성된 메시지를 이용하여 서비스 요청과 응답을 처리하는 API이다. SOAP API는 보안 및 트랜잭션 처리를 위한 강력한 기능을 제공하지만, REST API보다 더 복잡하고 성능이 낮은 경우가 많다.
GraphQL API
Facebook에서 개발된 쿼리 언어를 사용하여 데이터를 요청하고 응답받는 API이다. REST API와는 다르게 클라이언트가 요청한 데이터의 정확한 형태를 서버에서 받아서 응답하며, REST API와는 달리 여러 개의 엔드포인트 대신 하나의 엔드포인트를 사용한다. 이러한 특징으로 인해 클라이언트에서 필요한 데이터만 요청하고 응답받을 수 있어서 네트워크 부하가 적고, 효율적인 데이터 관리가 가능하다.