TIL : 221202

JINSEON YE·2022년 12월 2일

TIL

목록 보기
26/88

테스트 코드

  • 개발 과정 중 예상치 못한 문제를 미리 발견할 수 있다.
  • 작성한 코드가 의도한 대로 작동하는지 검증할 수 있다.
  • 코드의 변경, 추가, 삭제 시 사이드 이펙트를 줄일 수 있다.
    -> 마음편한 변경, 추가, 삭제 가능
    -> 마음편한 리팩터링 가능! "돌아가는 코드는 건들지마라!!"


build.gradle

  • JUnit test code

    내가만든 Sum클래스의 sum 메소드 동작 확인.


→ 실행 결과

✅ 생성된 Test 클래스의 위치 확인.
✅ 자동으로 생성된 테스트 클래스의 이름은 “테스트 대상 클래스+Test”로 자동 생성

  • Annotation
    • @Test : 테스트 메서드임을 나타냄. 실행 가능

    • @BeforeEach : 각 메서드 전에 실행됨을 나타냄.

    • @BeforeAll : 현재 클래스의 모든 메서드보다 먼저 실행되어야하는 메서드 표시.

    • @AfterAll : 현재 클래스의 모든 메서드보다 나중에 실행되어야하는 메서드 표시.

    • @RepeatedTest : 메서드 반복 호출을 함을 표시.

    • @DisplayName : 사용자 지정 표시 이름을 선언. -> @Test 랑 같이쓰세요

    • → 테스트 메서드 및 Life Cycle을 잘 이해하고 있어야. 우아하게 활용할 수 있다.

  • 좋은 테스트 코드는 새로운 기능을 구현, 코드를 리팩터링 하는데에 자신감과 간정감을 주지만, 의미 없는 테스트 코드를 작성하면, 테스트 코드 작성에 들이는 에너지가 낭비되고, 수정 유지 관리하는데에 많은 비용이 들어서
    안하느니만 못하다!

CI/CD란?

  • 좋은 테스트 코드를 작성하는 방법

1.간단하게 만드세요.

  • 테스트 코드 자체가 논리가 복잡하면 시나리오가 꼬이고 테스트코드의 복잡도가 높아지면 테스트 코드의 의도가 없어질수있음.

2.엣지 케이스 테스트

  • 자주 발생하지 않지만 오류가 발생해야하는 부분, 예외처리가 필요한 부분 등을 테스트해라!
    -잘못된 입력 : 잘못된 인수가 들왔을때
    -누락된 인수 : 파라미터로 어떤 값이 들어와야하는데 인수가 제대로 안들왔을때
    -빈 데이터 : 아무것도 안 들왔을때
    -호출된 함수의 예외 : 예외상황에서도 테스트코드 작성해야함.

    엣지 케이스란,
    알고리즘이 처리하는 데이터의 값이 알고리즘의 특성에 따른 일정한 범위를 넘을 경우에 발생하는 문제를 가리킨다.
    예를 들면 fixnum이라는 변수의 값이 -128 ~ 127의 범위를 넘는 순간 문제가 발생하는 경우가 있을 수 있다.

3.버그를 수정하기 전에 테스트 작성

  • 버그가 발생했다면 버그를 재현하는 테스트 작성을 고려하세요. 나중에 이 버그를 발견하기 위한 좋은 회귀 테스트로 남는다.

4.설명이 포함된 이름 사용

  • 디스플레이네임은 어노테이션을 통해서 설명을 추가해줘야함.
    테스트가 실패했을때 가장 먼저 보게되는게 이름임. 길고 설명적임 이름을 두려워하지말자. 짧은 이름은 오히려 안 좋음 보고 한 방에 이해되는 긴 이름이 오히려 좋아.

5.한 번에 하나의 요구 사항 테스트

  • 하나만 해야지 요구사항에 맞는 구체적인 이름을 선택할 수 있고 테스트가 덜 부풀어 오르고 읽기 쉽고 유지 관리가 쉬워짐. : 간단하게 만들라는 요구와 비슷

TDD : http://clipsoft.co.kr/wp/blog/tddtest-driven-development-%EB%B0%A9%EB%B2%95%EB%A1%A0/

스레드

  • JVM 구조 복습

-> 스레드 부분을 스택이라 부르는 이유 : 스택이랑 같은 구조를 띄어서 LIFO : 젤 마지막에 들온거 젤 먼저 나감.

  • JVM Call Stack
    main stack frame에서 일어나는 일 들.
...

int main(void){
    func1();  // func1() 호출

    return 0;
}

void func1(){
    func2();  // func2() 호출
}

void func2(){
}
...

함수 호출에 의한 스택 프레임의 변화.

실행 단계 살펴보기

  1. 프로그램이 실행되면, 가장 먼저 main() 함수가 호출되어 main() 함수의 스택 프레임이 스택에 저장.
  2. func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장.
  3. func2() 함수를 호출하면 해당 함수의 스택 프레임이 추가로 스택에 저장.
  4. func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수의 스택 프레임만이 스택에서 제거.
  5. func1() 함수의 호출이 종료되면, func1() 함수의 스택 프레임이 스택에서 제거.
  6. main() 함수의 모든 작업이 완료되면, main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료.

→ Stack 자료구조! Last-In, First-Out

참고 : http://www.tcpschool.com/c/c_memory_stackframe

  • Thread와 Multi Thread 프로그래밍
    • Main Thread
      모든 자바 프로그램은 메인 스레드가 psvm을 실행하며 시작.
      main 스레드는 작업 스레드들을 만들어 병렬로 코드들을 실행.
      -> 메인에서 만들어졌지만 메인 콜스택이 아니라 메인스택 프레임 바깥으로 나옴.
    • 프로세스의 종료
      • 싱글 쓰레드 : 메인 쓰레드가 종료하면 프로세스도 종료.

      • 멀티 쓰레드 : 실행 중인 쓰레드가 하나라도 있다면, 프로세스 미종료.
        -> 메인쓰레드가 비워졌다더라도 다른 쓰레드가 작업 중이면 종료 안됨.

        → 잘못된 처리로, 계속 돌고있는 쓰레드가 하나라도 있다면…? ☠️ 프로그램이 끝나지 않음.... 무한굴레,.? process kill 로 강제로 프로세스를 죽여야할 수도 있음.

⌨️ 코드로 쓰레드를 확인 할 수 있다 ⁉️

public class Main {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
    }
}
  • Thread.currentThread().getName() : 현재쓰레드 이름은 뭐지?

⌨️ 코드로 쓰레드를 만들 수 있다 ⁉️

  1. Runnable 인터페이스를 구현하는 방법
  2. Thread 클래스를 상속받는 방법

두 방법 모두 쓰레드를 통해 작업하고 싶은 내용은 run() 메소드에 작성하면 된다.

  • Runnable 인터페이스 구현하기
public class ImplementRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("Implement Runnable : " + Thread.currentThread().getName());

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.getStackTrace();
        }

        System.out.println("- Implement Runnable End -" );
    }
}
  • Thread 클래스 확장하기
...

public class ExtendThread extends Thread{
    @Override
    public void run() {
        System.out.println("Extend Thread : " + getName()); // 현재 실행 중인 쓰레드의 이름을 반환.

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.getStackTrace();
        }

        System.out.println("- Extend Thread End -" );
    }
}

→ 실행 코드

...

public class Main {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());

        Thread implementRunnable = new Thread(new ImplementRunnable());
        implementRunnable.start();

        ExtendThread extendThread = new ExtendThread();
        extendThread.start();

    }
}

🎤 수석 Java 소프트웨어 개발자가 알려주는 10분컷 Java Thread Code 랩 코딩

- Thread Scheduling

💻 컴퓨터가 동시에 처리할 수 있는 최대 작업 수는 CPU 코어(core) 수와 같다.

→ 스레드의 개수가 코어의 수보다 많을 경우, 스레드를 어떤 순서로 동시성을 실행할 것인가 결정하는 스레드 스케줄링.

  • 자바의 스레드 스케줄링은 우선 순위(Priority) 방식과 순환 할당(Round-Robin) 방식 사용.
    기본 메커니즘은 Queue 구조를 가짐
    - 우선 순위 방식 : 우선 순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링.
    : 1~10까지 값을 가질 수 있으며, 기본은 5.
    - 순환 할당 방식
    : 시간 할당량(Time Slice)을 정해서 하나의 스레드를 정해진 시간만큼 실행.

  • 혼자 독점하지 않기 위해서 시간을 컷해서 골고루 작업들이 돌아갈 수 있도록 시간을 자르는 방법 : 타임 슬라이스

  • 스레드의 일반적인 상태

  • 스레드의 일시 정지 상태 : 스레드는 일시정지 할 수 있다.

  • 상태 제어
    • 실행 중인 스레드의 상태를 변경하는 것
    • 상태 변화를 가져오는 메소드의 종류

공부해야할 것! Object 클래스 코드로 돌아보기
생활코딩 강의 듣기 : https://opentutorials.org/course/1223/6241

🤔 아니,.. 왜이렇게 멀티 스레드, 멀티 스레드 호들갑들이야…?

바로 바로!!

동기화(Synchronization) 문제

스레드는 잘 다루면 매우 효율적이지만,

  • 스레드 간섭 및
  • 메모리 일관성 오류
    라는 두 가지 오류가 발생할 수 있다.
  • 이런 오류를 방지하는 데에 필요한 도구가 동기화.

동기화가 무슨 문제가 있나?
: 스레드를 잘 다루면 좋은데 스레드 간섭과 메모리 어쩌고 문제를 겪을 수 있음. 스레드가 여러개면 데이터에 접근할 수 있는 스레드도 여러개라는 뜻. 공유되는 데이터 때메 heap에서 문제가 생길 수 있음.
-> 내가 원하지 않는 이상한 결과가 나올 수도 있음.

자료 출처

두 개 이상의 스레드가 동일한 리소스에 액세스하려고 시도하고 Java 런타임이 하나 이상의 스레드를 느리게 실행하거나 심지어 실행을 일시 중단할 때 발생하는 스레드 경합을 일으킬 수 있다.

-> ? 어떻게 해결할 수 있는지 알아야함.

➕동시성 VS 병렬성 미리 알아보기 : 추가 공부 따로해야함.

참고 : https://seamless.tistory.com/42

CS

네크워크의 기본구조

  • 네트워크 : 정보가 전송되는 경로
  • 👩‍❤️‍👨1:1 로 연결한다면 그냥 케이블로 연결하면 되겠지만 우리는 글로벌 네트워크를 쓰고있잖아요?
  • 🌐 글로벌 네트워크 구성을 위해 전세계 모든 컴퓨터를 연결하려면
    • 통신 장비(LAN 장비, WAN 장비)도 필요하고
      • 어떻게 연결해 줄지?
    • 통신 역할(서버, 클라이언트)도 필요하고
      • 각각의 장비가 어떤 역할을 할지?
    • 통신 규칙(TCP/IP 규칙)도 필요합니다.
      • 각각의 장비는 서로 어떤 규칙을 가지고 정보를 주고 받을지?

LAN vs WAN

  • LAN (Local Area Network)

    • 사무실이나 빌딩처럼 비교적 좁은 범위의 네트워크를 말한다. ex)랜선
  • WAN (Wide Area Network)
    - 서로 떨어져 있는 LAN 사이를 전용선 등으로 연결한 광역 네트워크를 말한다.

  • LAN을 통해 건물의 네트워크에 접속하거나 자원을 공유할 수 있다.
    - WIFI 공유기를 통해 노트북이나 핸드폰으로 인터넷에 연결하는것도 LAN
    - WIFI 공유기를 통해 컴퓨터에서 프린터에 연결하는것도 LAN

    ![](https://velog.velcdn.com/images/aatwe24/post/7afe3a2e-aa01-4302-aa6f-427ce7b1ce11/image.png)

    -> 좁은 공간의 네트워크

✋ **LAN vs WAN**
  • LAN (Local Area Network)
    • 사무실이나 빌딩처럼 비교적 좁은 범위의 네트워크를 말한다.
  • WAN (Wide Area Network)
    • 서로 떨어져 있는 LAN 사이를 전용선 등으로 연결한 광역 네트워크를 말한다.

Untitled

  • LAN을 통해 건물의 네트워크에 접속하거나 자원을 공유할 수 있다.
    • WIFI 공유기를 통해 노트북이나 핸드폰으로 인터넷에 연결하는것도 LAN
    • WIFI 공유기를 통해 컴퓨터에서 프린터에 연결하는것도 LAN Untitled
  • 집에있는 WIFI 공유기에 맨 왼쪽 포트가 WAN 포트이고 나머지 포트가 LAN 포트라는 사실!

Untitled

  • LAN을 통해 건물의 네트워크에 접속하거나 자원을 공유할 수 있다.
    • WIFI 공유기를 통해 노트북이나 핸드폰으로 인터넷에 연결하는것도 LAN
    • WIFI 공유기를 통해 컴퓨터에서 프린터에 연결하는것도 LAN

  • WAN을 통해 멀리 떨어져 있는 LAN 사이를 연결할 수 있다.

    • WAN 전용선으로 건물과 통신사 중계기(ISP)를 연결하는 것도 WAN
    • WAN 케이블로 네트워크 시스템(SDN)을 통해 미국의 네트워크에 연결하는것도 WAN

  • 우리나라는 1982년 5월에 미국에 이어 세계에서 두번째로 인터넷 연결을 한 나라 라는 사실!

profile
백엔드 개발자

0개의 댓글