[프로그래밍] 1. Interface 이해하기 (UI, API, ABI)

Min·2022년 11월 14일
0

C/S Background Knowledge

목록 보기
1/1
post-thumbnail

UI? API? 그리고 여기에 공통적으로 등장하는 용어인 Interface
네이버 영어사전에 검색해도, Interface의 첫 번째 뜻은 그냥 '인터페이스'였습니다.

개발공부를 본격적으로 한 지는 한 달 남짓 되었는데, 이 'Interface' 개념을 비전공자의 입장에서 이해하는게 정말 모호하고 또 중요하다는 생각을 했습니다.


어원이 영어니까, 영어로 검색해봤습니다.

Interface (noun)

a connection between two pieces of electronic equipment, or between a person and a computer
(두 조각의 전자 장비 혹은 사람과 컴퓨터 사이의 접점/연결지점)

Interface를 Inter- 과 Face로 쪼개어서 생각해보겠습니다.

  • Inter- 이라는 접두사는 '...사이의' '상호 간의'라는 뜻을 나타냅니다.
  • Face는 얼굴이라는 뜻 외에도 '표면' '겉면' 이라는 뜻이 있습니다.

즉, Inter-face는 두 면의 사이라는 느낌을 지니게 됩니다. 그게 접점/연결지점이 되겠습니다. 예들 들면, USB와 컴퓨터 사이의 Interface는 USB Port가 됩니다.


UI (User Interface)

요즘은 포괄적으로 Product Design이라는 용어를 많이 쓰고 있는데, 한동안 UX/UI Design이라는 용어도 자주 쓰였던 것 같습니다. 여기서 UX는 User eXperience이고, UI는 User Interface를 뜻합니다.

접점이 있으려면 적어도 두 가지 이상의 면(face)이 있어야겠죠. Interface라는 개념을 떠올려보면, User Interface는 '서비스와 사용자의 접점' 정도로 볼 수 있겠습니다.

사용자는 서비스를 이용할 때 모니터모바일 화면을 보고 조작합니다. 그래서 UI Design라는 말은, 사용자와 상호작용(Interaction)하는 화면(screen)에 나타나는 것들 즉, User Interface을 디자인하는 일이 될 것입니다.


API (Application Programming Interface)

그러면 API는 어떤 면(face) 사이의 접점일까? 라는 물음을 가질 수 있습니다. APIApplication Programming Interface의 줄임말입니다. Application Programming하는데 있어서의 접점이라는 말 같습니다.

제가 공부한 결과 API라는 용어는 방대한 범위에서 사용되고 있었습니다. 그러나 다른 맥락에서 사용되는 것 같았지만 결국 핵심적인 의미는 같았습니다. 보다 정확한 의미에서 Interface, 그리고 API에 대해 이해하려면 'Application Programming은 어떤 일인가'에 대한 어느 정도의 개념 이해가 필요합니다.

Application?

  • Application(App) Program (or Software) - 우리가 사용하는 어플리케이션 (줄여서 앱)이라는 단어는 응용 프로그램이라는 의미를 갖고 있습니다.

  • 컴퓨터는 기본적으로 CPU, RAM, ROM 등의 Hardware 자원이 필요합니다. 그리고 그 자원에 접근하고 보다 효율적으로 동작하게 해주는 것이 Windows, MacOS와 같은 OS (Operating System, 운영체제)입니다.

  • OS 위에서 Application Program이 실행됩니다. 이 program은 해당 OS와 호환되는 code의 집합으로 이뤄져있습니다. Windows에서 실행되는 .exe program이 MacOS에서 실행될 수 없는 것은, .exe 파일 형식이 MacOS 환경에서 동작할 수 없기 때문입니다. 안드로이드 폰에서 실행되는 .apk 파일이 아이폰에서 실행될 수 없는 이유도 마찬가지 입니다.


Programming?

  • 프로그래밍은 프로그램을 만드는 일입니다. 프로그램은 OS 위에서 동작하며, 컴퓨터의 Hardware 자원을 사용합니다.

  • 명령어로 컴퓨터에게 일을 시킬 수 있습니다. 이 명령어는 code 형태로 되어 있습니다. code정보를 나타내기 위한 기호의 체계입니다.

  • 논리적인 규칙과 체계를 갖춘 코드 작성 체계를 '프로그래밍 언어 (Programming Language)'라고 부르고, 각 언어마다 자체적인 '문법'을 갖고 있습니다. 프로그래밍 언어마다 지향점과 역할이 다르기 때문에, 필요에 맞는 프로그래밍 언어를 채택하여 프로그램을 만드는 것이 적절합니다.

  • 프로그래밍 언어는 저급언어 (Low-level Language)고급언어 (High-level Language) 로 나눌 수 있는데, '이는 얼마나 사람과 가까운 언어인지' 기준에 따라 나뉩니다. C언어보다 Python이 더 사람에게 친화적인 문법을 제공합니다. 두 언어 모두 고급언어에 속하지만, 기준에 따라 Python이 더 고급언어라고 할 수 있습니다.

  • 컴퓨터는 0과 1의 전기신호로 동작하기 때문에 추상적인 프로그래밍 언어를 결코 이해할 수 없습니다. 따라서 어떤 언어로 작성되었든 간에 모든 codes는 0과 1로 이루어진 기계어 (Machine Language)컴파일 (compile, 번역) 되는 과정을 거칩니다.


Application Programming

그러면 어플리케이션(Application)을 만들기 위해서는 어떻게 해야할까요?
프로그래밍 언어(Programming Language)를 선택해서 그 문법에 맞게 code를 작성해야할 것입니다.

모든 프로그래밍 언어는 근본적으로 기계어를 사람이 알아들을 수 있는 글자, 문법으로 치환한 형태를 띕니다. 그렇다면, 서로 다른 프로그래밍 언어를 사용하더라도 서로 상호작용 할 수 있는 여지가 분명 있습니다. 왜냐하면 모두 기계어를 바탕으로 만든 프로그래밍 언어 체계이기 때문입니다. (물론 하드웨어 레벨에서 해당 언어 및 개발환경을 지원하는 OS와 호환되지 않으면 상호작용이 되지 않으므로 호환이 불가능합니다.)

그러한 프로그래밍 언어로 만든 어플리케이션 프로그램(Application Program) 사이에도 분명 상호작용이 가능할 것입니다. 이 어플리케이션 프로그램이라는 면(face)에서의 접점(Interface)이 API 입니다. 어플리케이션 프로그램의 맞은 편에는 또 다른 어플리케이션 프로그램이 있을 수도 있고, OS 가 있을 수도 있습니다.

Application ~ OS

Operating System (OS, 운영체제)의 가장 중요한 목적은 한정된 Hardware 자원을 효율적으로 활용하는 데에 있습니다. 컴퓨터에서 실행 가능한 모든 프로그램을 OS가 제공하는 것이 아니라, 여러 어플리케이션 프로그램이 동작할 수 있도록 환경을 제공합니다.

개발자들이 OS의 모든 작동원리를 이해하고 program을 개발하는 것은 현실적으로 어렵습니다. 따라서, OS에서는 Application Program 개발자들이 해당 OS에서 동작하는 program을 보다 쉽게 만들 수 있도록, 기본적인 기능들을 함수로 제공합니다.

이렇게 운영체제가 제공하는 함수들의 집합, 라이브러리도 API에 해당합니다. OS 측에서 Application에게 '우리 OS의 이런 기능을 사용하려면 이러한 함수를 호출해' 라고 미리 규칙체계를 정립해놓은 것입니다. Application은 그러한 규칙에 맞게 OS에 접근해서 기능을 활용할 수 있습니다.


Application ~ Application

API는 '클라이언트와 서버의 통신' 맥락에서도 사용됩니다. Client Side에서 동작하는 Application은 서버의 Database에 접근해서 필요한 정보를 가져와야합니다. 서버는 클라이언트의 요청(Request)에 응답해야하는데, 이 요청의 주도권은 서버에 있습니다. 이 말은 즉, 서버의 '어떻게 요청하라'는 형식에 맞게 요청해야한다는 것입니다.

서버 API를 설계한다는 의미는 서버의 출입 관리 시스템을 만드는 것과 유사합니다. 어떤 사람들을 접근시킬 것이며, 형식에 맞는 어떠한 요청이 들어왔다면 그 요청에 따라 결과값을 응답(Response)합니다.

이렇게 요청에 따라 응답하는 서버 측의 프로그램은 서버 컴퓨터에서 동작하는 어플리케이션 프로그램이라고 볼 수 있습니다. 클라이언트 컴퓨터에서 동작하는 브라우저가 인터넷 네트워크를 통해서 서버 사이드 컴퓨터에 요청하고, 다시 응답받는 구조입니다. 어플리케이션 프로그램 사이의 접점입니다.


표준화된 규격

어떤 응용프로그램이 다른 프로그램에게 정보 또는 기능을 제공하기 위해서 API를 세팅합니다. 이런 규격을 만들어놓으면 우리 응용 프로그램에 접근권한이 있는 누군가는 이 규격에 따라 어떠한 요청(Request)를 하게 될 것입니다.

앞서 언급한 OS가 제공하는 API도 마찬가지입니다. OS의 표준규격(Standard)에 따라 개발자가 함수를 호출(Call)하게 되면, OS에서는 그것이 규격에 맞는 요청이었을 때 적절한 Response를 해주는 것입니다.


인터페이스와 프로그래밍

프로그래밍은 레고 블록을 조립하는 일과 흡사합니다. 여러 작은 블록들을 조합해서 거대한 시스템을 만들 수 있습니다. 반대로, 복잡하고 거대한 시스템을 여러 개의 작은 모듈로 쪼갤 수도 있습니다. 그 쪼개진 모듈을 누군가가 활용할 수 있도록 API를 갖춰 열어놓을 수도 있고, 어떠한 데이터를 API에 따라 불러올 수 있습니다.

이미 만들어진 무언가를 불러와서 사용하는 개념은, Library를 불러오는 것과 비슷합니다.
그러나 Library와는 다르게 API는 컴포넌트를 사용하는 규약이고 호출을 위한 수단에 불과합니다. 구현을 할 수 있는 논리(logic)이 존재하지 않습니다.

처음부터 무언가를 하나하나씩 만드는데는 한계가 있습니다. 그래서 개발자들은 필연적으로 여러 개발 모듈을 활용해야만 합니다. OS 기능을 활용하기위한 API부터, 구글 지도 API, 카카오페이, 결제 API 도로명주소 API 등을 필요에 따라 사용할 수 있습니다. APIs, Library는 반드시 잘 이해하고 있어야 합니다.


Open API?

Open API라는 말도 아마 들어보셨을 것입니다. 이것은 말 그대로 Open(열려있는) API 입니다. 서버에 접근하고 필요한 정보를 요청하기 위해서는 권한을 얻어야 하는데, Open API는 누구나 정보에 접근하고 기능을 사용할 수 있도록 공개되어 있습니다.


ABI (Application Binary Interface)

그렇다면 ABI는 무엇일까요? 바이너리 코드 수준에서의 하드웨어 접점입니다. CPU는 여러가지 연산 기능을 사용할 수 있는 Binary Code Interface를 제공합니다. 즉 CPU에 따라 제공하는 Binary Code Interface가 다를 수 있습니다.

Intel x86 ABI에 맞춰서 컴파일한 코드를 ARM CPU 기기에서 돌리려고 하면 실행이 되지 않는 이유는, Binary Code Interface가 달라서 그렇습니다. 각 CPU 아키텍쳐에 따라 서로 다른 ABI를 갖고 있습니다.

해당 CPU에 맞는 Binary Code가 존재하고 그 Binary Code로 Source Code를 컴파일시켜야 합니다.

profile
성공적인 스타트업을 만들기 위해 이것저것 배우며 시도하고 있습니다.

0개의 댓글