Skip to main content

· 2 min read
Park Ki Hyun

관심사 분리


모듈 별 경계를 나누고 모듈간 약속을 정하는 것 like a 전기 콘센트와 플러그의 관계라고 한다.

MVVM 이론


ViewViewModel 그리고 Model을 나누어 View를 쉽게 변경할 수 있는 목적을 갖고 있는 아키텍처 패턴

역할

View : UI
ViewModel: View 상태 및 로직 담당
Model: 비지니스 로직과 데이터 입출력 담당

핵심은 데이터 바인딩이다.

데이터 바인딩이란 간단히 말하면 ViewModel과 View가 서로를 의존하지 않는 것 Provider 패키지를 사용해서 데이터 바인딩 이용한다는데 나는 Bloc를 사용해서 하고 싶다.. 당장은 Provider로 구현해보기

페이지 마다 하나의 ViewModel이 있어야 하고 ViewModel은 View의 상태와 로직을 관리한다.

Model은 Service, Model, Repository가 있는데 Service는 전역 상태와 비지니스 로직을 관리하고 Model은 데이터 Repository는 데이터 요청 로직을 담당한다.

걍 뭔가 어려움 많이 연습해봐야겠다.

· 5 min read
Park Ki Hyun

테스트 코드 작성 요령

테스트 코드를 작성하면 기능들의 의존성도 확인할 수 있고 테스트할 기능이 많아질 수록 자동화 해놓면 좋다.

테스트 종류

단위 테스트 ( Unit Test ): 특정 함수 및 클래스 테스트
위젯 테스트 ( Widget Test ): 단일 위젯 테스트
통합 테스트 ( Integration Test ): 앱의 전체적인 테스트 동작

단위 테스트


내장 테스트로 테스트를 진행할 수 있습니다.

테스트 파일은 파일이름_test.dart여야 한다. 즉 _test.dart로 끝나야 함

테스트 관련 함수

test(): 테스트 시작 expect(): 값 검증
group(): 테스트 그룹 만들기
setUp(): 테스트 시작 전 실행하는 함수(계속 테스트 시작할 때마다 실행)
setUpAll(): 최초 한 번만 실행
tearDown(): 테스트 후 실행
tearDownAll(): 테스트 종료 후 마지막 한 번 실행

테스트를 하다보면 왜하나 싶을 수 있는데 변경에 대처하기 위해서 작성하는 것임. 완전 변한다면 또 의미가 없어지긴하는데 리팩토링 했을 때 검증하는 느낌이려나 아직은 잘 모르겠다.

Mock Object

api 통신 테스트 같은 경우 외부 변수가 많아서 mock object로 한다.

왜냐하면 실제 요청 응답은 변수가 많아서... 재현이 어렵다. 그리고 실제로 서버 응답 실패 테스트 같은 경우도 쉽지 않다. mock object를 사용하면 쉽게 할 수 있다.

mockito랑 build_runner를 사용한다고 한다.

mockito로 어노테이션 달고 build_runner로 코드 생성하는 거임

DI ( Dependency Injection )

di를 하는데 생성자를 통해 외부 코드를 받는다인 간단한 개념이라고 한다.

위젯 테스트


상호작용, 생김새, 상태 확인을 테스트 한다고 한다.

위젯 테스트

testWidgets(): 테스트 진행
pump(): 화면 갱신
find.text(): 특정 테스트 검색
find.byType(): 특정 클래스의 타입과 일치하는 위젯 검색
tester.widget(): 특정 타입의 위젯 가져옴
tester.element(): 특정 위젯의 BuildContext 가져옴

golden test도 있다.

golden test는 이미지 픽셀 비교하는 테스트다 즉 시각적 모습을 테스트할 수 있다.

flutter test --update-goldens

이걸로 골든테스트 정답 생성해줌 신기하넹.

통합 테스트


GUI테스트 EndToEnd라고 합니다.

실제 에뮬레이터를 통해서 테스트를 하게 된다.

integration_test를 추가해야 한다고 합니다.


integration_test:
sdk: flutter

dev_dependecies에 붙여넣어주면 된다.

integration_test라는 폴더를 root에 만들어주고 하면 된다. 아주 신기하다.

테스트 커버리지


플러터 커버리지

테스트 코드 기반으로 커버리지 측정을 한다.

커버리지 거터스

이거는 특정 파일에서 좌측 하단 watch를 눌러보면 어디가 테스트가 안됐는지와 커버리지 % 알려준다.

hydrated bloc을 사용해보거나 다른 서드파티들 검색해서 찾아보자

· 3 min read
Park Ki Hyun

이름 풀이 기능 참조 파일

  • mac address 사용자 정의 C:\Program Files\Wireshark\ethers
  • port number 정보 C:\Program Files\Wireshark\services
  • 호스트 이름 정보 C:\Program Files\Wireshark\hosts

와이어샤크는 포트번호가 인식되지 않을때 data로 해석됩니다. 비표준 포트 번호를 사용하는 FTP 서비스를 수동으로 분석기를 설정하는 메뉴는 어디인가요?

Analyze>Decode as

WLAN 프로파일을 생성시 환경설정 저장 경로는 어디인가요?

C:\Users\user1\AppData\Roaming\Wireshark\Profile

원격지 트래픽 캡쳐를 수행하려고 합니다. 캡쳐하고자 하는 컴퓨터에 winpcap을 설치한 후 원격지에 실행해야하는 데몬 실행파일은 무엇인가요?

rpcapd.exe

기존 추적파일에는 적용할 수 없고 실시간 캡쳐하는 작업에만 적용되는 필터로 TCPDUMP 구문의 BPF형식을 따르는 필터는 무엇인가요?

캡쳐필터

실시간 캡쳐 필터구문을 작성하세요.

  • http와 dns 패킷을 동시 캡쳐 tcp port 80 or udp port 53
  • 목적지 IP주소가 10.10.10.10 이면서 telnet 패킷만 캡쳐 ip dst 10.10.10.10 and tcp port 23
  • icmp ttl 에러만 캡쳐 icmp[0]=11 and icmp[1]=0

전역환경설정 위치에 존재하는 파일로 업그레이드시 복사본을 만들어야 하는 파일을 쓰세요.

  • 실시간 캡쳐 필터 cfilters
  • 디스플레이 필터 dfilters
  • 컬러링 필터 colorfilter

실시간 캡쳐시 파일집합으로 최근 10개 파일만 생성을 유지할 수 있는 설정은 무엇인가요?

링버퍼

· 4 min read
Park Ki Hyun

문제


PDU

  • L1> bits
  • L2> frame
  • L3> packet
  • L4> segement
  • L5~L7> message, data stream

캐시 확인 및 삭제

  • MAC
추가
arp -a
삭제
arp -d
  • DNS
추가
ipconfig/displaydns
삭제
ipconfig/flushdns
  • NetBIOS
추가
nbtstat -c
삭제
nbtstat -R

OSI

MAC주소 포함 : L2 - datalink layer IP주소 포함 : L3 - network layer

기본 최대 크기

Ethernet Frame : 1518 Byte MTU : 1500 byte 크기변경 가능 MSS : 1460 byte

목적지 IP주소에 대한 MAC주소를 찾아오는 프로토콜

arp

TCP 헤더에서 Flag 6개

syn,ack,fin,rst,psh,urg

TCP/IP에서 연결상태를 확인하고 에러메세지를 전달하는 프로토콜

icmp

스위치 기본 기능

flooding, learning, fowarding, filtering

와이어샤크


병합

와이어샤크에 일시중지 기능은 없다 정지 이후 다시 캡쳐해서 병합하는 방법밖에 없다.

병합은 파일 > 병합에서 가능

와이어샤크는 두개의 파일을 동시에 열 수 없어서 병합을 사용한다.

병합에는 3가지 옵션이 있는데 기본값은 시간 기준으로 병합하는 것이고 전에 이어붙이기 후에 이어붙이기가 있습니다.

캡처 파일

열기 폴더 버튼으로 파일을 연다면 캡처 시간과 사이즈 등을 추가로 확인할 수 있다.

새로고침 버튼

와이어샤크는 time 칼럼의 작동방식이 지연 시간 작동방식을 채택한다.

그래서 1번 패킷이 0.00초이고 그다음 부터는 1번 패킷 이후 캡쳐된 지연 시간이다.

그런데 10번 패킷을 0초로 설정하는 방법이 있는데 시간 참조 설정을 하면 할 수 있다.

시간 참조 설정은 하나에만 할 수 있는 것이 아닌데 그래서 나중에 풀어주려고 하면 너무 어렵다.

이 때 파일 다시 불러오기 버튼이 이를 모두 해제해준다.

그래서 파일 다시 불러오기 버튼을 자주 사용한다고 한다.

이름 해석

보기 > 이름해석 > 네트워크 주소 해석을 키면 패킷의 IPv4에서 dns 주소로 확인할 수 있다.

근데 이러면 쓸데없는 UDP 패킷이 생기기 때문에 실시간 패킷을 캡쳐할 때 이름 해석을 해제하고 하는 것이 좋다.

보기 > 이름해석 > 전송주소 해석을 키면 포트 번호에 이름을 붙여줌

이름 해석 커스텀

MAC addr c:\program files\wireshark\ethers IP addr c:\program files\wireshark\hosts port name c:\program files\wireshark\services

· 6 min read
Park Ki Hyun

와이어샤크 설치


이곳에서 진행할 수 있습니다.

컴퓨터 네트워크


데이터 통신은 MAC주소가 꼭 필요함. 이걸 논리적으로 바꾼 주소가 IP주소

물리주소 확인

arp -a

캐시 데이터다. 5분뒤에 지어짐 근데 지우려면

apr -d

캐시가 남는경우는 내가 상대방과 연결을 할 때도 있지만 상대방이 나와 연결할 때도 캐시가 남음.

그래서 패킷 분석할 때 캐시를 지워야 한다.

dns가 알려준 ip 캐시 정보 확인


ipconfig/displaydns

지우기

ipconfig/flushdns

컴퓨터 이름으로 통신


nbtstat -n

캐시 확인

nbtstat -c

캐시 삭제

nbtstat -R

분석할 때 arp, dns, nbtstat 캐시 지워주고 하는게 좋다.

OSI 7 계층

계층을 통과할 때는 관련 헤더가 추가된다. PDU가 있다.

PDU는 아래 정리..

Presentation : Message

Transport : Segment

Network : packet

Datalink : frame


Application : 통신 software

Presentation : 데이터 포맷 정의 (jpg,png 등)

Session : App 연결 유지 or 해제

Transport : 패킷 분리, 재전송, 에러 검출 (Segment가 전송 최소단위여서)

Network : Segment앞에 논리적 주소(IP)를 추가해서 목적 전달 가능하게 해줌 > Packet

Datalink : 물리 주소를 추가해서 전달(MAC,DLCI) > Frame

Pyhsical : bit를 전기신호로 변환, 전기적, 기능적 특성, 절차적 특성, 기계적 특성에 대한 약속

TCP/IP 4 계층

Application : osi의 application, presentation, session을 합친 계층, http, telnet, dns, dhcp 프로토콜이 있음

Transport : TCP,UDP 프로토콜이 있음

+ 포트번호를 통해서 Application 어디로 보낼지 담겨있음

Internet : OSI의 network 계층, ICMP, IP, ARP RARP 있다.

+ protocol Number 를 통해서 TCP,UDP.. 등 어디로 넘기지 담겨있음

network access : OSI의 datalink, physical 계층 ethernet2(MAC)

+ Type(IPv4, IPv6)이 인터넷 계층 프로토콜 어디로 보낼지 구분해줌 

Alt text

포트번호

0 ~ 1023 : 잘 알려진 서비스 예약 포트

1024 ~ 49151 : 추가 표준 상용 tool 예약 포트

49152 ~ 65535 : 개인용 포트

네트워크 연결 장치

  1. HUB

허브는 다 확인해보고 해당 목적지인지 검사하고 아니면 다음 목적지로.. 반복

  1. Switch

스위치는 목적지 주소가 포함되어 있어서 해당 목적지에만 방문 근데 FFFF가 목적지 주소이면 브로드캐스트 인데 모든 스위치에 전달(Flooding)하기 때문에 네트워크 부하가 옴 > 차단의 필요성이 있다.

스위치 동작
  1. Flooding

들어온 포트를 제외하고 모든 포트에 뿌림

  1. Learning

맥주소를 학습해서 맥 테이블에 작성

  1. Forwarding

목적지 맥주소에 그대로 프레임 보내는 것

  1. Filtering

목적지 주소를 알고 있을 때 프레임 전송을 막는 것

  1. Router

라우터는 네트워크 별로 전송 차단할 수 있음. 브로드캐스트로 인한 네트워크 부하 방지

TCP와 UDP

TCP : 헤더(20 ~ 60byte)

A >> 확인신호 >> B

B >> 응답 >> A

A >> 연결 확정 >> B

A >> 데이터 전달 >> B

B >> 응답 >> A

UDP : 헤더 (8byte)

A >> 데이터 전달 >> B

wireshark


와이어샤크는 마지막 상태 설정이 저장된다.

캡처 옵션에서 모두 무작위를 끄면 나한테 들어오는 패킷만 확인할 수 있다.

숨김

캡처 > 옵션 > 인터페이스관리에서 표시를 체크 해제하면 인터페이스를 숨길 수 있다.

아니면 네트워크 설정에서 어댑터 사용안하면 안보임

아니면 라이브러리(npcap)가 삭제됐을 수도 있음.

아니면 가상 인터페이스를 추가하고 재부팅해야 보임

통계

필터에 tcp.stream == 1 등으로 필터링 후

통계 > 플로 그래프 > 표시 필터로 제한

Alt text

스트림 확인

패킷에 우클릭 > 따라가기 > TCP 스트림 등..

한 눈에 보인다.

TCP는 최대 길이가 1514여서 잘려서 분석하기 어려울 수 있는데 한 눈에 확인 가능

· 3 min read
Park Ki Hyun

PKI란 Public Key Infrastructure의 약자로 공개키 암호화와 전자서명을 사용할 수 있게 기반을 마련해둔 것이라고 합니다.

신뢰기간이 공개키들을 인증해주면 그 공개키에 대응되는 개인키도 인증되기 때문에 개인키를 갖고 있는 개인이 인증을 받습니다.

은행에서 공인인증서 인증 과정


은행에서 공인인증서 과정를 인증하는 과정이 있습니다.

Alt text

생성 과정

  1. 먼저 개인이 공인 인증서 발급을 CA에 요청합니다.

  2. 그러면 CA에서 개인의 개인키, 공개키를 생성합니다.

  3. 생성한 키들로 디지털 인증서를 발급합니다.

디지털 인증서에 들어가는 것

발급자 정보, 소유자 정보, 인증서 권한, 유효기간, 발급자 전자 서명, 일련번호, 소유자 공개키 정보

  1. 디지털 서명 생성을 생성합니다.

디지털 서명은 전송할 문서를 인증해주는 도구입니다.

디지털 서명 생성 절차
  1. 메시지 or 문서 선택
  2. 메시지 or 문서에 해시 함수 적용 > 해시 값
  3. 사용자의 개인키로 해시 값 암호화 > 디지털 서명

확인 과정

  1. 원본 메시지디지털 서명을 받습니다.

  2. 디지털 인증서에서 추출한 공개키로 디지털 서명을 복호화합니다. > 해시 값

  3. 원본 메시지 해시해보며 복호화한 해시 값과 동일한지 확인하여 무결성 검사를 합니다.

  4. 디지털 인증서의 유효기간을 확인합니다.

그러면 PKI 인증이 됩니다. 여기서 은행과 통신하고 싶다면 메시지 또는 문서가 은행의 인증서가 되겠네요.

· 4 min read
Park Ki Hyun

오버로딩과 오버라이딩에 대해서 알아보겠습니다.

오버로딩 (Overloading)

정의

한 클래스 내에 이미 사용하려는 이름같은 이름을 가진 메소드가 있어도 매개 변수의 개수와 타입이 다르면 같은 이름을 사용해서 메소드를 재정의 할 수 있다.

여기서 핵심은 2가지로 정리할 수 있습니다.

  1. 메소드의 이름이 같다.
  2. 매개변수의 개수나 타입이 달라야 한다.
  3. 리턴값과는 상관 없습니다.

오버로딩 함수 코드

오버로딩 함수
public class OverringClass {

// 오버로딩 1번 함수
public void OverloadMethod(){
System.out.println("============================");
System.out.println("매개변수 수 : 0개");
System.out.println("매개변수 타입 : void");
System.out.println("오버라이딩 1번 함수 입니다.");
System.out.println("============================");
}

// 오버로딩 2번 함수
public int OverloadMethod(int a, int b){
System.out.println("============================");
System.out.println("매개변수 수 : 2개");
System.out.println("매개변수 타입 : int");
System.out.println("오버라이딩 2번 함수 입니다. 덧셈 값을 반환합니다.");
System.out.println("============================");

return a+b;
}

// 오버로딩 3번 함수
public int OverloadMethod(int a, int b, int c){
System.out.println("============================");
System.out.println("매개변수 수 : 3개");
System.out.println("매개변수 타입 : int");
System.out.println("오버라이딩 3번 함수 입니다. 곱셈을 반환합니다.");
System.out.println("============================");

return a*b*c;
}


// 오버로딩 4번 함수
public boolean OverloadMethod(String str){
System.out.println("============================");
System.out.println("매개변수 수 : 1개");
System.out.println("매개변수 타입 : String");
System.out.println("오버라이딩 4번 함수 입니다. 이름이 park이면 true를 반환합니다.");
System.out.println("============================");

if(str.equals("park")){
return true;
}else{
return false;
}
}
}

위 함수들을 보시면 OverloadMethod로 이름들이 같지만 타입과 매개변수의 수가 다른 것들을 보실 수 있습니다. 함수들에 대한 설명은 코드에 작성돼 있으니 참고해주세요~ 😎

코드를 실행하는 코드와 결과를 확인해보겠습니다.

결과 확인 코드
public class Main {
public static void main(String[] args) {
OverringClass oc = new OverringClass();

// 오버로딩 1번 함수
oc.OverloadMethod();

// 오버로딩 2번 함수
int a = oc.OverloadMethod(1,2);
System.out.println("오버로딩 2번 함수 반환값 : "+a);

// 오버로딩 3번 함수
int b = oc.OverloadMethod(4,5,6);
System.out.println("오버로딩 3번 함수 반환값 : "+b);

// 오버로딩 4번 함수
boolean c = oc.OverloadMethod("park");
System.out.println("오버로딩 4번 함수 반환값 : "+c);
}
}
결과
============================
매개변수 수 : 0개
매개변수 타입 : void
오버라이딩 1번 함수 입니다.
============================
============================
매개변수 수 : 2개
매개변수 타입 : int
오버라이딩 2번 함수 입니다. 덧셈 값을 반환합니다.
============================
오버로딩 2번 함수 반환값 : 3
============================
매개변수 수 : 3개
매개변수 타입 : int
오버라이딩 3번 함수 입니다. 곱셈을 반환합니다.
============================
오버로딩 3번 함수 반환값 : 120
============================
매개변수 수 : 1개
매개변수 타입 : String
오버라이딩 4번 함수 입니다. 이름이 park이면 true를 반환합니다.
============================
오버로딩 4번 함수 반환값 : true