[TIL] 26. RESTful한 API, 적절한 관심사 분리

김지수·2024년 5월 27일

TIL

목록 보기
26/53

RESTful API

REST(Representational State Transfer) 아키텍처 스타일을 따르는 API(Application Programming Interface)를 말합니다. REST는 웹 서비스의 설계 원칙과 관련된 아키텍처 스타일로, 네트워크 상에서 자원을 정의하고 자원에 대한 상태 정보를 주고받는 방식입니다. RESTful API는 다음과 같은 원칙을 따릅니다.

RESTful API 장점

1. 단순성(Simplicity)

HTTP 프로토콜을 사용하여 쉽게 이해하고 구현할 수 있습니다.
JSON, XML 등 간단한 데이터 형식을 사용하여 직관적입니다.

2. 유연성(Flexibility)

HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 다양한 CRUD 작업을 수행할 수 있습니다.
클라이언트와 서버가 독립적으로 개발되고 배포될 수 있어 변경이 용이합니다.

3. 확장성(Scalability)

무상태(stateless) 특성으로 인해 서버가 클라이언트 상태를 유지하지 않아 부하 분산이 용이합니다.
로드 밸런싱과 캐싱을 통해 성능을 향상시킬 수 있습니다.

4. 표준화(Standardization)

HTTP 표준을 따르므로, 이미 널리 사용되는 프로토콜과 잘 통합됩니다.
다양한 클라이언트(웹, 모바일 등)에서 쉽게 접근할 수 있습니다.

5. 재사용성(Reusability)

URI를 통해 자원을 명확히 식별하고 접근할 수 있어 API 재사용성이 높습니다.
표준화된 인터페이스를 통해 다양한 애플리케이션에서 쉽게 사용할 수 있습니다.

6. 확장 가능성(Extensibility)

새로운 기능을 추가하거나 확장할 때 기존 API를 변경하지 않고도 확장이 가능합니다.
HATEOAS(Hypermedia As The Engine Of Application State)를 사용하여 클라이언트가 동적으로 상호작용할 수 있습니다.

7. 성능(Performance)

HTTP 캐싱 메커니즘을 통해 네트워크 트래픽을 줄이고 응답 시간을 개선할 수 있습니다.
무상태 아키텍처 덕분에 서버 리소스를 효율적으로 사용할 수 있습니다.

8. 보안(Security)

HTTPS를 사용하여 데이터 전송을 암호화할 수 있습니다.
OAuth 등의 인증 방식을 쉽게 통합할 수 있습니다.

9. 호환성(Interoperability)

RESTful API는 다양한 언어와 플랫폼에서 지원되므로, 상호 운용성이 뛰어납니다.
클라이언트는 API 명세만 있으면 쉽게 통합할 수 있습니다.

적절한 관심사 분리

소프트웨어 공학에서 중요한 개념 중 하나로, 시스템을 논리적으로 구분된 부분으로 나누어 각 부분이 특정한 기능이나 역할에 집중하도록 하는 원칙입니다. 이를 통해 복잡성을 줄이고, 시스템의 유지보수성과 확장성을 향상시킬 수 있습니다.

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

1. 복잡성 관리(Managing Complexity)

소프트웨어 시스템은 본질적으로 복잡합니다. 관심사를 분리함으로써 각 부분을 더 작은 단위로 나누어 복잡성을 줄이고, 각 부분에 집중할 수 있게 합니다.
복잡한 시스템을 여러 작은 모듈로 분리하면, 각각의 모듈을 이해하고 관리하기 쉬워집니다.

2. 유지보수성 향상(Improved Maintainability)

코드가 명확하게 분리되어 있으면, 특정 부분을 수정할 때 다른 부분에 미치는 영향을 최소화할 수 있습니다.
문제가 발생했을 때, 문제의 원인을 특정 모듈 내에서 빠르게 찾고 수정할 수 있습니다.

3. 개발 속도 향상(Faster Development)

분리된 모듈은 독립적으로 개발될 수 있으므로, 여러 팀이 동시에 작업할 수 있습니다.
새로운 기능을 추가하거나 기존 기능을 수정할 때, 관련된 모듈만 작업하면 되므로 개발 속도가 빨라집니다.

4. 재사용성 증가(Increased Reusability)

잘 분리된 모듈은 다른 프로젝트에서도 쉽게 재사용할 수 있습니다.
예를 들어, 인증 모듈이나 데이터베이스 접근 모듈 등을 다른 애플리케이션에서 재사용할 수 있습니다.

5. 테스트 용이성(Testability)

각 모듈이 독립적으로 테스트될 수 있어 단위 테스트(Unit Testing)가 용이합니다.
모듈 간의 상호작용을 테스트하기 위해 통합 테스트(Integration Testing)를 수행할 수 있습니다.

6. 이해 용이성(Understandability)

각 모듈이 특정 역할을 수행하므로, 시스템 전체를 이해하지 않고도 각 모듈의 기능을 이해할 수 있습니다.
코드 리뷰와 협업이 용이해져 팀 내 커뮤니케이션이 원활해집니다.

7. 확장성(Scalability)

시스템의 특정 부분이 더 많은 부하를 처리해야 할 때, 해당 모듈만 확장하거나 최적화할 수 있습니다.
모듈화된 시스템은 새로운 기능을 추가하거나 기존 기능을 변경할 때, 다른 부분에 최소한의 영향을 미칩니다.

8. 변경 용이성(Flexibility in Changes)

요구사항이 변경될 때, 관심사가 잘 분리되어 있으면 변경사항을 특정 모듈에 한정할 수 있습니다.
예를 들어, 사용자 인터페이스(UI)를 변경할 때, 백엔드 로직에 영향을 주지 않고 변경할 수 있습니다.

9. 보안(Security)

보안 관련 기능을 별도의 모듈로 분리하면, 보안 전문가가 해당 모듈을 집중적으로 관리하고 개선할 수 있습니다.
보안 취약점을 신속하게 발견하고 수정할 수 있습니다.


오늘의 회고

모의 면접에 대한 질문 중 공부를 하면서 하나를 더 얻어 가는 것 같다.
강의를 진행하면서 이해하는 속도가 느려서 강의 속도가 늦는 거 같다. 내일부터는 빠르게 나머지 강의를 다 듣고 과제를 진행해야겠다.

profile
서툴고 부족한 점이 많지만, 배우고 발전하며 성장하기 위해 노력하겠습니다.

0개의 댓글