백엔드

[백엔드기초] 백엔드의 시작, 백엔드와 관련된 거의 모든 것

묘걍 2023. 11. 23. 20:51

 

백엔드라고 해서 백엔드만 존재하는 것이 아니다

    • 어떤 화면 (사용자가 보고 있는 화면)
    • 무언가 버튼이 눌렸을 때, 서버의 어떤 기능이 호출되는 상황
  1. 전체 아키텍처
    • Java, Spring 당연히 잘 알아야하지만, 이것만 안다고 다 되는 것은 아니다
    • API 스펙, API가 어떻게 호출되는지 (프로토콜)
    • 통신단
    • 저장 (DB) 모두 알아야해

👉🏻 전체 아키텍처

출처: 강사님 화면

🧩 단말

✅ Android / iOS

  • 안드로이드
    • 자바, 코틀린으로 개발
  • iOS
    • swift로 개발
  • React native, Flutter, Ionic 등..

➡️ React vs React Native

  • React
    • 웹 개발
    • 기본적으로 return하는 곳에 html 태그 기반 (화면 만들어)
  • React Native
    • 앱 개발용
    • html 태그 기반, 화면 그리고 데이터를 보여줘서 화면을 만들어
    • 화면의 요소들도 앱 소스가 다 들어가있다 / React Native에 화면 소스가 포함된다

✅ IoT

  • IoT 기기들도 통신 가능

✅ Web

  • PC client와 Web site 포함
  • Desktop = PC application

 

단말들이 서버로 접속.

🧩 접점

✅ API

  • 인터페이스로 접속
  • 인터페이스를 주고 받는다.
    • 웹처럼 화면이 보이는 것이 아니라 데이터만 주고 받는다
    • 화면은 단말에 있음
    • Ex) 카톡의 화면은 내 핸드폰에서 구동되는 것. 메시지 주고 받을 때 데이터만 주고 받는 것
  • 내용은 다 클라이언트한테 있고, 데이터만 주고 받음
  • 대표적으로 REST를 사용
  • 서버에 있다. 요즘엔 그 서버가 대부분 클라우드에 있음
    • IDC
    • 금융권 등에서는 아직 클라우드보다는 IDC...
    •  
    • 더보기

      IDC는 "데이터 센터"를 나타내는 말로, Information Data Center의 약자입니다. 데이터 센터는 기업이나 조직에서 컴퓨터 시스템과 관련된 모든 IT 자원을 집중적으로 보관, 처리, 관리하는 시설입니다. 여러 대의 서버, 스토리지 시스템, 네트워킹 장비 등이 포함되어 있습니다.

      이를 좀 더 구체적으로 설명하면:

      1. 서버: 데이터 센터에는 많은 컴퓨터 서버가 있습니다. 서버는 프로그램을 실행하고 데이터를 저장하는 역할을 합니다.
      2. 스토리지 시스템: 대규모의 데이터를 저장하고 관리하기 위한 스토리지 시스템이 포함되어 있습니다. 이는 하드 디스크 드라이브(HDD)나 고속의 플래시 기반 스토리지 등을 사용할 수 있습니다.
      3. 네트워킹 장비: 서버와 스토리지 시스템을 연결하고 외부와 통신하기 위한 네트워킹 장비가 필요합니다. 이는 고성능의 라우터, 스위치 등을 포함합니다.
      4. 냉각 시스템: 대규모의 컴퓨터가 동시에 작동하면 열이 발생합니다. 따라서 데이터 센터에는 이 열을 효과적으로 제어하기 위한 냉각 시스템이 필요합니다.
      5. 전원 관리 시스템: 서버와 다른 장비들은 안정적인 전원을 필요로 합니다. 데이터 센터는 전원 공급에 대한 안정성을 보장하는 시스템을 가지고 있습니다.
      6. 보안 시스템: 많은 중요한 정보가 저장되어 있기 때문에, 데이터 센터는 높은 수준의 보안 시스템을 갖추고 있습니다.

      이렇게 데이터 센터는 기업이나 조직이 대량의 데이터를 안전하게 저장하고 처리하기 위한 핵심적인 시설 중 하나입니다. 이러한 데이터 센터는 클라우드 컴퓨팅, 인터넷 서비스, 대규모 데이터 분석 등 다양한 IT 서비스를 제공하는 데 중요한 역할을 합니다.

*서버 = 우리가 다루는 핸드폰이나 컴퓨터가 아니라, 어딘가에 존재하며 우리의 응답을 기다리는 컴퓨터를 말한다

그 컴퓨터는 IDC 등에 모여 있거나 클라우드에 있다

 

➡️ 인증

  • Authentication
    • 인가 / 승인
    • 당신이 이 곳에 들어올 수 있어요 / 없어요
    • Ex) 홈페이지에 로그인해서 들어가는 과정
  • Authorization
    • 권한
    • ~까지 접근 가능해요
    • 일반 사용자 / 관리자
    • Ex) 관리자에게만 부여된 기능에 접속 가능한지 안 한지

✅ Web Server

  • 웹을 가지고 있다
    • Ex) 네이버 접속시 그 안의 내용들이 다 웹에 그려져 있음
    • 웹에 접속해서 보는 것
    • 사이트에서 대부분의 내용이 내려오고 그려짐
  • 브라우저에서 주소를 쳐서 내용을 받음
  • Spring boot, Django 등의 언어로 만들어져 있다
    • Tomcat = WAS 서버 (Web Application Server - API를 담고 있다)
    • 우리나라 백엔드의 많은 부분이 Spring으로 돼있다

🤔 모바일에서 웹브라우저 접속은?

이 경우는 API로 붙는 건 아니다.

보통 Web Server로 붙을 가능 성이 높다

아니면 모바일용 서버를 따로 두는 경우도 있다.

(PC에서 네이버에 접속하는 것과 핸드폰에서 네이버에 접속할 때 화면이 다름)

* 다이나믹 HTML

HTML로 그려진 웹은 웹인데 화면이 다름

동적으로 작게 만들어서 표현

별도의 웹서버를 두기도 하고,

하나에서 분기처리를 하기도 한다

 

🧩 Logging

  • 로그
  • 요즘은 서버를 여러대를 주기 때문에 서버 자체도 로컬 로그를 남길 수 있지만, 서버의 로그를 중앙에 모으는 경우가 많다
    • 빅데이터 분석 위해
    • 흘려보내지 않고 분석을 위해 담아둠
  • 빅데이터 처리와 관련된 스택
    • Kibana: 화면
    • Logstash: 로그를 모으는 역할
    • ElasticSearch: DB같이 비정형 데이터 저장 툴

🧩 Queue

  • 요즘 매우 중요
  • MSA 아키텍처 때문 (이전부터 많이 사용되었지만)
더보기

MSA(Microservices Architecture)는 소프트웨어 시스템을 작은 독립적인 부분으로 나누고, 각 부분을 독립적으로 배포하고 실행할 수 있도록 하는 아키텍처 패턴입니다. 여러 마이크로서비스들이 서로 협력하여 전체 시스템을 구성하게 됩니다. 이를 초보자도 이해하기 쉽게 설명하면 다음과 같습니다.

  1. 단일 서비스 대신 작은 서비스들:
    • MSA는 하나의 큰 서비스가 아니라 여러 개의 작은 서비스로 이뤄진 시스템입니다. 각 서비스는 특정 기능이나 업무를 수행합니다.
  2. 독립성:
    • 각 마이크로서비스는 독립적으로 개발, 배포, 운영될 수 있습니다. 이는 하나의 서비스에 문제가 발생해도 다른 서비스에 영향을 미치지 않고 독립적으로 유지될 수 있다는 것을 의미합니다.
  3. 통신과 협업:
    • 마이크로서비스는 서로 통신하여 작업을 수행하고 데이터를 교환합니다. 이를 통해 각 서비스는 자신의 역할에만 집중할 수 있으며, 시스템 전체가 협업하여 기능을 제공합니다.
  4. 유연성과 확장성:
    • 시스템의 특정 부분을 수정하거나 업데이트할 때 전체 시스템을 다시 빌드하거나 배포할 필요가 없습니다. 이는 유연성을 제공하며, 특정 서비스만 확장하여 성능을 향상시킬 수 있습니다.
  5. 기술 다양성:
    • 각 마이크로서비스는 자체적인 기술 스택을 가질 수 있습니다. 이는 특정 기술에 의존하지 않고, 각 서비스에 가장 적합한 기술을 선택하여 사용할 수 있도록 합니다.

간단히 말해서, MSA는 큰 시스템을 여러 작은 부분으로 나누어 각각을 독립적으로 다루는 아키텍처입니다. 이는 유연성과 확장성을 향상시키면서 개발 및 유지보수를 더 효과적으로 할 수 있게 도와줍니다.

  • 비동기처리를 위한 middleware
    • 동기인 경우는 큐가 필요 없다. 직접 시스템을 호출하고 나서 응답될 때 까지 기다리기만 하면 됨
    • 비동기하려면 응답을 기다리는 것을 큐에 넣음
    • 담아 놓는 그릇
    • 일들을 담아 놓고 일을 누가 하나씩 빼가서 처리함
  • pub / sub
    • 집어 넣거나 누가 가져가서 처리

➡️ 동기 vs 비동기

  • 동기 (Sync)
    • 호출해서 응답이 올 때 까지 기다림
    • 리턴해주지 않으면 진행 X
    • Ex) 맛집 가서 줄 서서 기다림
    • 더보기

      동기 (Synchronous)

      동기적인 작업은 순차적으로 진행되며, 한 작업이 끝나야 다음 작업이 시작됩니다. 이것은 마치 레스토랑에서 주문한 음식이 나올 때까지 기다리는 것과 비슷합니다. 주문한 음식이 나오면서 다음 작업(음식을 먹기)이 진행됩니다.

      동기적인 작업의 예시:

      1. 사용자가 웹 페이지를 열 때, 모든 데이터가 한 번에 로딩되고 나서 페이지가 보여집니다.
      2. 파일을 읽을 때, 파일이 읽히기를 기다리면서 다른 작업을 진행하지 않습니다.
  • 비동기
    • 던져 놓고(호출하고) 다른 일 수행
    • Ex) 맛집 캐치테이블로 등록해두고 문자오면 감 (기다리는 동안 다른 것을 할 수 있음)
    • 더보기

      비동기 (Asynchronous)

      비동기적인 작업은 여러 작업이 동시에 진행될 수 있습니다. 한 작업이 완료될 때까지 기다리지 않고, 다른 작업을 계속 수행할 수 있습니다. 이는 마치 여러 개의 음식 주문을 동시에 처리하고, 주문이 완료되면 알림을 받아 음식을 서빙하는 것과 유사합니다.

      비동기적인 작업의 예시:

      1. 웹 페이지에서 데이터를 가져올 때, 다른 작업을 하면서 데이터를 기다리지 않고 가져올 수 있습니다.
      2. 파일을 비동기적으로 읽을 때, 파일이 읽히는 동안에도 다른 작업을 수행할 수 있습니다.

      비동기 작업은 보통 네트워크 호출, 파일 I/O, 데이터베이스 쿼리 등 시간이 걸리는 작업에서 특히 유용합니다. 이렇게 비동기적으로 작업을 처리하면, 시스템이 효율적으로 동작하고 더 빠르게 응답할 수 있습니다.

✅ Kafka

  • 히트침
더보기

카프카(Kafka)는 분산형 스트리밍 플랫폼으로, 대용량의 데이터 스트림을 안정적이고 신속하게 처리할 수 있게 해주는 오픈 소스 솔루션입니다. 초보자도 이해하기 쉽게 설명하면 다음과 같습니다.

  1. 데이터의 흐름 파이프라인:
    • Kafka는 데이터를 한 곳에서 다른 곳으로 안전하게 이동시키는 역할을 합니다. 마치 여러 관문을 통과하는 데이터의 흐름 파이프라인이라고 생각할 수 있습니다.
  2. 이벤트 스트리밍:
    • 이벤트 스트리밍은 데이터의 흐름을 이벤트로 취급하고 이를 스트림으로 처리하는 개념입니다. Kafka는 이벤트 스트리밍을 효과적으로 다룰 수 있는 플랫폼으로 사용됩니다.
  3. 분산 아키텍처:
    • Kafka는 여러 대의 서버에 데이터를 분산하여 저장하고 처리합니다. 이는 안정성과 확장성을 높이며, 시스템이 고가용성을 유지할 수 있도록 도와줍니다.
  4. 토픽과 파티션:
    • 데이터는 토픽이라는 주제로 나뉘어 저장되고, 각 토픽은 여러 개의 파티션으로 나뉩니다. 토픽은 데이터의 종류를 나타내고, 파티션은 해당 토픽의 데이터를 나누어 저장하는 단위입니다.
  5. 프로듀서(Producer)와 컨슈머(Consumer):
    • 데이터를 만들어내는 쪽을 프로듀서라고 부르고, 데이터를 소비하는 쪽을 컨슈머라고 부릅니다. Kafka는 프로듀서와 컨슈머를 통해 데이터의 생산과 소비를 관리합니다.
  6. 내구성과 확장성:
    • Kafka는 데이터를 안전하게 저장하고 보장하기 위해 디스크에 저장하므로 데이터 손실이나 중복을 방지합니다. 또한, 서버의 수를 늘리거나 줄여서 시스템을 쉽게 확장할 수 있습니다.

Kafka는 주로 대규모의 데이터 스트리밍 처리, 로그 처리, 실시간 분석 등의 분야에서 활용되며, 이러한 특징들로 인해 많은 기업에서 사용되고 있습니다.

🧩 File Storage

  • AWS S3을 가장 많이 씀
  • NAS, SAN도 있음
  • 파일을 담아둠

🧩 Services

  • API로 만들어졌을 가능성이 높다
  • API 서버들이 Queue에서 일감을 가져가는 형식
    • Queue의 pub/sub
    • 이런 식으로 계속 일을 주고 받음

🧩 Data Base

  • 빅데이터 처리
    • Hadoop, HBase ... 등
    • 데이터를 모으거나, 전처리하거나, 연산을 수행
    • 빅데이터는 양이 많기 때문에 어떻게 고속으로 처리하냐가 관건
  • 분석 처리
  • 로깅 분석
  • SQL
    • 대표적인 과거 관계형 DB를 처리했던..
    • Ex) 회원 정보 처리
      • 회원의 권한, 소속 등을 테이블에 담음
    • SQL 쿼리문이 있다
    • 정형 (테이블..)
    • 테이블 정규화 / 최적화
      • 회사의 회원 테이블 - 조직 테이블 - 부서명(따로 관리) → 관계도 (관계형 DB) 
    • 최적화에 관심 많음
    • 반정규 (필요한 것들은 같은 테이블에 담기도
  • NoSQL
    • 쿼리할 수 있는 기능이 있다
    • 비정형
    • 각 DB마다 담는 스타일/목적이 다르다
    • 필요한 것을 같은 테이블에 다 넣어버려 (한 번에 뽑아 가면 좋으니까)
    • 서비스 등에서는 비정형을 많이 쓴다

➡️ Data Base vs File

  • File
    • 우리가 실제 컴퓨터에서 다루는 그 파일
    • 데이터 저장됨
  • Data
    • 회원 데이터, 게시판 데이터 ...
    • 정보를 담음

🧩 CI / CD

  • 요즘엔 자동화하는 분위기
  • 대표적으로 Jenkins

✅ CI (Continuous Integration)

  • 배포
    • 소스를 서버에 위치시키는 것
    • 결국 소스를 컴파일하고 빌드하는 것이니

✅ CD(Continuous Delivery / Deployment / Development)

  • 빌드에 가깝다
  • 만들어진 소스가 해당하는 위치의 서버에 전달되는 과정

➡️ Build vs Compile

  • Compile
    • 소스 자체를 목적형
    • C언어를 (object)목적 코드로 바꾸는 것
    • 기계가 알아들을 수 있는 언어로 바꾸는 것
  • Build
    • 여러가지 파일을 서버사이드 서버들이 이해할 수 있는 작업
    • 와르(War) 등의 파일로 묶어지는 것
    • 하나의 파일만 변환하기보다는 목적에 맞게 묶어줌
더보기

CI(Continuous Integration)와 CD(Continuous Delivery 또는 Continuous Deployment)는 소프트웨어 개발 및 배포 과정을 자동화하고 효율적으로 관리하기 위한 개발 방법론입니다. 이 두 가지는 주로 협업하고 있는 개발팀에서 품질 향상, 속도 향상, 버그 감소 등을 목표로 채택되는데요, 각각의 역할을 자세히 살펴보겠습니다.

1. Continuous Integration (CI):

CI는 코드 통합이라는 의미를 가지고 있습니다. 여러 개발자가 동시에 작업하는 경우, 그들의 코드를 정기적으로 통합하여 충돌이나 문제를 최소화합니다.

주요 개념:

  • 자동 빌드 (Automated Build): 개발자가 코드를 커밋할 때마다 자동으로 빌드를 수행하여 빌드 오류를 빠르게 감지합니다.
  • 자동 테스트 (Automated Tests): 코드 변경이 발생하면 자동으로 테스트 스위트가 실행되어 코드 변경으로 인한 문제를 식별합니다.
  • 커밋 후 피드백 (Immediate Feedback): CI는 코드를 통합하는 프로세스를 자동화하고, 문제가 발생하면 가능한 빨리 개발자에게 피드백을 제공합니다.

2. Continuous Delivery (CD) 또는 Continuous Deployment (CD):

CD는 CI를 기반으로 하며, 소프트웨어를 빠르게, 안정적으로, 자주 배포할 수 있도록 하는 개념입니다.

Continuous Delivery:

  • 수동 배포: 코드 변경이 테스트를 통과하면, 운영 환경에 배포를 수동으로 진행합니다.
  • 자동 배포 전 단계 (Automated Pre-Deployment): 자동으로 테스트 및 빌드가 이루어진 후, 스테이징 환경 등에 자동으로 배포되지만, 실제 운영 환경으로의 배포는 수동으로 진행됩니다.

Continuous Deployment:

  • 완전 자동 배포: 코드 변경이 테스트를 통과하면, 자동으로 실제 운영 환경으로 배포됩니다.

공통 특징:

  • 작은 배포 단위: 작은 기능이나 수정 사항에 대한 배포를 지향하여 릴리스 주기를 단축하고, 문제를 빠르게 해결할 수 있도록 합니다.
  • 환경 일치 (Environment Consistency): CI/CD를 통해 테스트 및 배포되는 환경이 실제 운영 환경과 일치하도록 관리됩니다.

CI/CD를 통해 개발팀은 코드 변경을 빠르게 통합하고, 안정적으로 배포함으로써 소프트웨어의 품질을 향상시키고, 릴리스 주기를 단축하여 빠른 피드백과 고객 요구에 빠르게 대응할 수 있게 됩니다.

 

 

 

 

 

 

 

출처: https://youtu.be/_WQR6-sqqjM?si=8lk83Qpynl9MtUcJ

https://youtu.be/0l4neNs64Bo?si=hYvpN17uVtQMA_ET