1.5 프로토콜 계층과 서비스 모델

1.5 프로토콜 계층과 서비스 모델 1.5.1 계층구조 프로토콜 계층화 네트워크 설계자는 프로토콜을 **layer(계층)**로 조직한다. 각 프로토콜은 한 계층에 속한다. 한 계층은 상위 계층에 **서비스(service)**를 제공한다. 이것을 계층의 **서비스 모델(service model)**이라고 한다. 각 계층은 그 계층 내부에서 어떤 동작을 수행하거나, 직접 하위 계층의 서비스를 사용한다. 프로토콜 계층은 소프트웨어, 하드웨어 또는 둘의 통합으로 나타낼 수 있다. 애플리케이션 계층(HTTP, SMTP)과 트랜스포트 계층 : end system의 소프트웨어로 구현 물리(physical) 계층과 데이터 링크 계층 : 네트워크 인터페이스 카드(이더넷, 와이파이 인터페이스 카드) 네트워크 계층 : 하드웨어와 소프트웨어로 혼합 구현 n계층 프로토콜은 네트워크를 구성하는 종단 시스템, 패킷 스위치, 그 외의 요소 사이에 분산되있다. ⇒ 각 네트워크 구성요소에는 하나의 n계층 프로토콜이 있다. 프로토콜 스택 : 다양한 계층의 프로토콜을 모두 합한 것 이 프로토콜 스택에서 애플리케이션 계층부터 다루어 내려가는 것이 top-down approach. 5개 계층의 인터넷 프로토콜 스택 애플리케이션 트랜스포트 네트워크 링크 물리 애플리케이션 계층 네트워크 애플리케이션과 애플리케이션 계층 프로토콜이 있는 곳 HTTP(웹 문서 요청과 전송 제공), SMTP(전자메일 전송 제공), FTP(두 종단 시스템 간의 파일 전송 제공) 같은 프로토콜들을 포함 이 계층에 있는 DNS(Domain Name Server)가 우리에게 친근한 인터넷 주소를 32비트 네트워크 주소로 변환한다. 애플리케이션 계층 프로토콜 : 여러 end system에 분산. 한 end system에 있는 app이 다른 end system에 있는 app과 **메시지(정보 패킷)**를 교환하는데 사용 트랜스포트 계층 클라이언트와 서버 간에 애플리케이션 계층 메시지를 전송 인터넷에는 TCP와 UDP 라는 트랜스포트 프로토콜이 있다. TCP : 연결지향형 서비스. UDP : 비연결형 서비스. 간단한 서비스. 세그먼트(segment) : 트랜스포트 계층 패킷 네트워크 계층 한 호스트에서 다른 호스트로 **datagram(데이터그램)**을 라우팅한다. 인터넷 트랜스포트 계층 프로토콜이 보낸 트랜스포트 계층 세그먼트와 목적지 주소를 목적지 호스트의 트랜스포트 계층으로 전달 IP 프로토콜 IP 데이터그램의 필드를 정의 종단 시스템과 라우터가 이 필드에 어떻게 동작하는지를 정의 네트워크 계층을 가진 모든 인터넷 요소는 IP 프로토콜을 수행해야만 한다. 인터넷 네트워크 계층은 출발지와 목적지 사이에서 데이터그램이 이동하는 경로를 결정하는 라우팅 프로토콜을 포함한다(많이). IP 계층이라고도 불린다. 링크 계층 인터넷의 네트워크 계층은 출발지와 목적지 간 일련의 패킷 스위치(인터넷에서는 라우터)를 통해 데이터그램을 라우트한다. 노드에서 노드로 패킷을 이동하기 위해 네트워크 계층은 링크 계층 서비스에 의존한다. 노드 간의 이동 과정 출발 노드의 네트워크 계층이 데이터그램을 아래 링크 계층으로 보냄 링크 계층은 데이터그램을 경로상의 다음 노드에 전달 다음 노드의 링크 계층은 데이터그램을 상위 네트워크 계층으로 보냄 링크 계층에서 제공하는 서비스는 그 링크에서 채용된 특정 링크 계층 프로토콜에 의해 결정 데이터그램은 경로상의 각기 다른 링크에서 다른 링크 계층 프로토콜에 의해 처리될 수 있다. 프레임(frame) : 링크 계층 패킷 물리 계층 링크 계층의 기능은 전체 프레임을 한 네트워크 요소에서 이웃 네트워크 요소로 이동하는 것 물리 계층의 기능은 프레임 내부의 각 비트를 한 노드에서 다음 노드로 이동하는 것 1.5.2 캡슐화(encapsulation) 호스트 : 다섯 계층을 구현 링크 계층 스위치 : 하위 1~2 계층 구현(물리, 링크) ⇒ IP 주소를 인식 못하지만 이더넷 주소는 인식하는 이유다. 라우터 : 하위 1~3 계층 구현(물리, 링크, 네트워크) 각 계층에서 패킷은 헤더 필드와 **페이로드 필드(payload field)**로 구성된다. 계층 캡슐화 헤더 필드 페이로드 필드 애플리케이션 애플리케이션 계층 메시지 애플리케이션 계층 메시지 트랜스포트 트랜스포트 계층 세그먼트 트랜스포트 계층 헤더 정보 애플리케이션 계층 메시지 네트워크 네트워크 계층 데이터그램 네트워크가 추가한 헤더 애플리케이션 계층 메시지 트랜스포트 계층 헤더 정보 링크 링크 계층 프레임 링크가 추가한 헤더 애플리케이션 계층 메시지 트랜스포트 계층 헤더 정보 네트워크가 추가한 헤더

2024년 1월 16일 · 3 분 · 배준수

단위 테스트

Unit Testing 유닛 테스트 과정 Fake UsersService를 만들어서 실행할 계획이다. 정상적으로 애플리케이션을 실행하면 DI 안에 많은 종속성을 넣어야 한다. 우린 새롭게 테스트를 위한 DI를 만드는데, 내부에는 Userss Service의 모든 메서드를 실행하는 클래스를 담는다. 이로서 어떤 단위(ex. Authentication, sign in 등)을 테스트하는데 종속성 주입에서 자유로워질 수 있다. Test 설정하기 users 디렉토리에 auth.service.spec.ts 파일을 만들자 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // auth.service.spec.ts import { Test } from '@nestjs/testing'; import { AuthService } from './auth.service'; import { UsersService } from './users.service'; it('can create an instance of auth service', async () => { // 새 DI container 생성 // 하지만 AUthService를 위한 종속성을 제공하지 않았으니 실행하면 오류가 뜰것이다. constmudle = await Testing.createTestingModule({ providers:[AuthService] }).compile(); const service = module.get(AuthService); expect(service).toBeDefined(); }); 터미널에서 npm run test:watch를 입력한다. 3개가 failed라고 뜰텐데, p를 누르고 auth.service.spec 을 입력한다. 그럼 이 파일만 테스트하여 1 failed라고 뜬다. ...

2023년 10월 9일 · 5 분 · 배준수

Data 처리 및 저장

User Data Users service 이제 유저서비스를 다뤄보자. users.service.ts 파일을 수정하자 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // users.service.ts import { Injectable } from '@nestjs/common'; import { Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { User } from './user.entity'; @Injectable() export class UsersService { // repo : argument name // Repository<User> : User type을 다루는 Repository에 접근하여 instance를 받는다. // @InjtectRepository(User) : DI 시스템에게 우리가 User Repository가 필요하다는것을 말하는 코드 // DI 시스템은 뒤에 Repository<User>부분에서 inject할 인스턴스가 무엇인지 파악하기 위해 // type annotation 한다. generic에는 잘 작동 안하니까 앞에 decorator를 통해 더 분명히 제공한 것. constructor(@InjectRepository(User) private repo: Repository<User>) {} // create는 service 내에서 받은 정보(email과 password)로 User Entity Instance를 만든다. // save는 entity instance를 실제 Database에 저장해준다. create(email: string, password: string) { const user = this.repo.create({ email, password }); return this.repo.save(user); } } 이제 컨트롤러에 넣어보자 ...

2023년 10월 7일 · 9 분 · 배준수

Nest 아키텍처 : 모듈

종속성 주입 이해를 위한 소규모 프로젝트 소규모 프로젝트 개요 3개의 계층으로 이루어진 모듈을 만들 것이다. 최상층에는 Computer Module이 있고 내부에는 Computer Controller가 run이라는 메서드를 가진다. 이 내부에는 CPU, Disk Module이 있는데 각각 CPU Service, Disk Service를 가지고 있으며 이는 또 compute와 getData라는 메서드를 가진다. 최하층에는 Power Module이 있으며 Power Service를 가진다. 메서드는 supplyPower()이다. 생성은 당연히 최하층 Power Module이 전원을 제공하면 CPU와 Disk가 작동하고 Computer가 작동하는 형태이다. 기존과는 다른 새로운 디렉토리에서 Nest 프로젝트를 시작하자. ...

2023년 10월 7일 · 6 분 · 배준수

Nest 아키텍처 : 서비스와 레포지토리

서비스와 레포지토리 공통점과 차이점 둘 다 클래스이다. 서비스는 비즈니스 로직을 넣는 곳이다. 레포지토리는 저장과 관련된 로직을 넣는 곳이다. 서비스는 데이터를 찾거나 저장하기 위해 하나 이상의 레포지토리를 사용한다. 레포지토리는 일반적으로 TypeORM entity, Mongoose schema 등으로 끝난다. 서비스와 레포지토리에서 사용하는 메서드는 동작이 비슷하다. 서비스에서 ‘데이터를 찾아라’ 라는 메서드를 호출할 것이고 레포지토리에서는 그 메서드를 실행할 것이기 때문. 그럼에도 서비스는 필요하다. 이유는 후술! 레포지토리 만들기 src 디렉토리 내에 messages.repository.ts와 messages.service.ts를 만든다. 루트 디렉토리에는 messages.json 파일을 만든다. 내용은 비워둔다. (안 만들면 찾을 파일이 없어서 오류발) ...

2023년 10월 6일 · 6 분 · 배준수

코드잇(CodeEat)

코드잇 코딩을 처음 접하는 어린이들을 위한 미니 게임 플랫폼. 코드잇 입니다. 📜포스터 ⚙️기능 🗺️메인 맵 디자인 : 기존 오피스를 위한 메타버스 오픈소스에서 메타버스의 색과 기능을 제거하고 유저를 위한 학교 맵으로 직접 제작하였습니다. 아바타 : 회원가입시 설정한 아바타로 맵 곳곳을 돌아다닐 수 있습니다. 🎮게임 오브젝트 : 게임 내 오브젝트와 상호작용을 통해 플레이할 수 있습니다. 3가지 게임 :3종류의 2인용 실시간 멀티플레이 게임을 구현하였습니다. ☔산성비 게임 떨어지는 영어 단어를 입력하여 점수를 획득합니다. 제한시간 내 높은 점수를 얻거나, 상대가 목숨을 모두 잃으면 승리합니다. 글자색으로 나타나는 아이템을 통해 상대의 화면을 가리거나 단어 추락 속도를 높일 수 있습니다. 실시간으로 상대방의 화면도 볼 수 있습니다. 아이들이 키보드 타자, 특히 영어 타자에 익숙해지도록 돕기 위한 게임입니다. 🔨두더지 게임 주어진 문제에 알맞은 정답을 들고 있는 두더지를 상대보다 먼저 클릭하는 게임입니다. 정답 유무는 효과음과 캐릭터의 반응을 통해 알 수 있습니다. 파이썬의 함수와 같은 기초 문제들이 출제됩니다. 📦자료구조 게임 문제가 제시하는 조건에 맞게 주어진 동물 배열을 정리하는 게임입니다. List, Set, Stack, Deque, Queue 중 하나를 선택하고 그에 맞는 오퍼레이션을 선택합니다. ‘같은 동물 2마리를 남겨라’ 라는 문제를 위해 Deque을 선택하여 pop(), popleft()등을 선택할 수 있습니다. set을 선택하면 중복되어 있는 원소들이 삭제되는 등 성질에 알맞게 구현하였습니다. 화면을 통해 상대가 입력하는 오퍼레이션과 현재 상황을 알 수 있습니다. 🧑🏻‍🤝‍🧑🏽유저간 교류 친구 : 친구 추가, 삭제, 목록 등 다양한 유저와 관계를 맺어나갈 수 있습니다. 동시접속자 : 현재 서비스에 들어와 있는 유저들을 확인할 수 있습니다. 프로필 : 내가 누군지 나타내고, 다른 사람의 정보를 확인할 수 있습니다. 메시지 : 어느 유저에게나 보낼 수 있으며, 개별 창에서 유저 별 최근 메시지와 안 읽은 메시지가 표시됩니다. 🕹️게임성 레벨 : 게임을 통해 경험치를 획득할 수 있습니다. 이기면 더 많이 얻고, 레벨이 높을수록 더 많이 필요합니다. 랭킹 : 가장 높은 레벨, 경험치를 기록하고 있는 상위 10명의 유저를 확인할 수 있습니다. 매치메이킹 : 현재 생성된 방 List를 확인할 수 있습니다. 친구와 하기 위해 비밀번호를 설정할 수 있습니다. 대기방 : 상대가 들어오면 방장이 게임을 시작할 수 있습니다. 💾레퍼런스 자료 설명 코드잇 포스터 A1 Size의 포스터로 요약한 프로젝트 내용입니다. 코드잇 깃허브 실제 코드를 확인할 수 있습니다. 코드잇 서비스 주소 서비스를 체험해볼 수 있습니다. 코드잇 발표 PPT 프로젝트 최종 발표 당시의 PPT입니다. 코드잇 발표 영상 프로젝트 최종 발표의 비디오 버전입니다. 🫱🏼‍🫲🏼팀소개 🐶배준수(BE) : https://github.com/importunate-dev ...

2023년 7월 11일 · 2 분 · 배준수