기본기 닦기(1) - 스레드, 동기/비동기, JVM
ㅇ 스레드(Thread)
자바는 일반적으로 멀티 스레드 환경에 적합한 언어로 알고있다. 그런데 여기서 의문? 스레드가 뭔가? 나는 그저 작업의 한 단위 정도라고 생각을 했다. 자세히 알아보았다. 먼저 정의부터 알아보자면, 내가 아는 것처럼 프로그램 실행의 기본 단위이고, 하나의 프로세스 안에서 독립적으로 실행되는 명령어 집합이라고 한다. 여러 스레드가 하나의 프로세스 내에서 동시에 실행될 수 있으며, 각 스레드는 독립적으로 실행되는 코드의 흐름을 나타낸다. 스레드는 프로세스의 자원을 공유하며, 이를 통해 프로그램의 성능을 향상시키고 병렬 작업을 수행할 수 있다.
자바에서 스레드를 생성하려면, java.lang.Thread 클래스를 상속하거나, Runnable 인터페이스를 구현하는 클래스를 작성한다.
class MyThread extends Thread {
public void run() {
// 스레드가 실행할 코드 작성
}
}
그리고 이렇게 만든 스레드를 실행하려면,
MyThread myThread = new MyThread();
myThread.start();
start() 메서드를 호출하면 myThread 클래스의 run() 메서드를 실행시킨다.
그런데 만일 여러 스레드가 한자원에 동시 접근할 때 발생하는 문제를 해결하기 위해 동기화 메커니즘이 사용되는데, synchronized 키워드나, java.util.concurrent 패키지의 동기화 메서드 및 락을 사용할 수 있다.
Spring Framework에서는 기본적으로 HTTP 요청에 대해 각 요청을 처리하는 스레드를 새로운 스레드풀에서 가져와 처리해 여러 요청이 동시에 처리될 수 있다. 이것이 멀티 스레드 환경에서 동작하는 것을 의미한다고 한다.
스레드관련해서 계속 찾아보다가 나온것이 비동기처리 였다. 그래서 동기와 비동기가 무엇인지에대해도 찾아보게되었다.
ㅇ 동기/비동기(Sync/ASync)
간단하게 먼저 말하면 동기는 결과를 기다리는것, 비동기는 결과를 기다리지 않는것이다.
이게 무슨말일까? 간단히 동기식은 A가 B에게 여러가지 물건을 보내줄때, 한개의 물건을 보내주고 B에게 받았다! 라고 전달 받기 전까진 아무작업을 하지 않고있다가 받았다!라는 메시지를 전달받으면 그제서야 다음 물건을 보내주는 작업을 시작하는 걸 의미한다.
비동기는 A가 B에게 물건을 보내주고 받거나 말거나 일단 다음 물건도 보내는걸 의미한다. 이렇게 보면 비동기가 효율적으로 보일 수 있다. 하지만, 각각 장단점이 존재한다.
업무면에선 동기는 단순하고 비동기는 복잡해진다. 자원활용면에선 비동기는 효율적으로 사용하고, 동기는 비효율적으로 사용한다는 장단점이 존재한다.
동기식에서 답변이올때까지 기다리는 상태를 Blocking이라고 한다. 비동기식에서 기다리지않는것을 Non-Blocking이라고 한다.
ㅇ JVM
일단 내가 아는 선에서 설명해보면 JVM은 자바 가상 머신으로 컴파일된 바이트코드들을 각 OS에 맞춰서 실행할 수 있게하는 가상 머신으로 알고 있다. 추가로 가비지 컬렉션도 JVM에 속해있어서 오래되어 사용되지 않는 코드들을 삭제해 메모리 관리까지 해주는 가상머신으로 알고 있다.
컴파일과정을 알아보자. .java 확장자로 이뤄진 코드들을 자바 컴파일러가 컴파일해 .class 자바 바이트 코드 파일로 만들고 이 파일을 JVM의 클래스로더로 전달해 런타임 데이터 영역으로 올려두고 실행엔진에서 코드 한줄한줄 실행하게 된다.