REST(Representational State Transfer) 아키텍처 스타일을 따르는 API(Application Programming Interface)를 말합니다. REST는 웹 서비스의 설계 원칙과 관련된 아키텍처 스타일로, 네트워크 상에서 자원을 정의하고 자원에 대한 상태 정보를 주고받는 방식입니다. 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)
보안 관련 기능을 별도의 모듈로 분리하면, 보안 전문가가 해당 모듈을 집중적으로 관리하고 개선할 수 있습니다.
보안 취약점을 신속하게 발견하고 수정할 수 있습니다.
모의 면접에 대한 질문 중 공부를 하면서 하나를 더 얻어 가는 것 같다.
강의를 진행하면서 이해하는 속도가 느려서 강의 속도가 늦는 거 같다. 내일부터는 빠르게 나머지 강의를 다 듣고 과제를 진행해야겠다.