쓰레드 시작하자.(프롤로그)
🎯 배경
쓰레드를 학습한게 몇번인지 모르겠다. 자면서도 생각했다. 내가 과연 쓰레드를 아는걸까?근데 왜 모르는 걸까? 비동기로 돌리는건 쉽게 하는데 왜 하는지도 모르고 이거 말고 더 좋은 방법이 있는지도 생각하지 않는다. 이게 정답이라 생각한다.개발자는 다양한 방식으로 문제를 해결을 해야 된다고 생각한다. 또, 상상속의 코드도 실험을 할 줄 알아야 한다. 하지만 이 모든걸 하지못하면 머릿속에서 할 수 있는 단 하나의 방법만 생각할 수 밖에 없다. 이걸안다고 해서 한개인 방법이 여러개로 분해가 되는건 아니지만, 그래도 어느정도 도움이 되지 않을까 싶다.
들어기 앞서
왜 우리가 쓰레드를 학습하지 어려운지부터 생각을 해야 한다. 내가 생각할때 쓰레드는 일반적으로 자바같은 언어 위에서 작성을 하게 된다. 그러면 이걸 사용하는 입장에서는 너무 추상적으로 되어있기 때문에 쉽지 않는거 같다. 예시로
1
new Thread()..;
라는 코드가 있다고 가정했을때, 이게 쓰레드를 만드는건 알겠고, 쓰레드가 작업단위라는걸 알고 있는데… 뭔가 와닿지 않는 느낌이 든다. 어디에서 이걸 사용하는걸까??? 의문점이 가득한 상태로 다음단계로 넘어간다. 그렇게 이것저것 배우다 보면 결국 쓰레드에 대해 설명하려고 하면 이상하게도 생각이 나지않는다. 이유가 뭘까… 나는 요것에 초점에 맞춰서 쓰레드를 학습하려고 한다.
쓰레드란?
알다시피 쓰레드는 작업단위다. 그러면 프로세스랑 뭐가 다를까? 컴퓨터에서 실행되는 프로그램이라고 한다. 프로세스는 여러개의 쓰레드를 가질 수 있다. 자바에서 쓰레드 만드는 방법 new Thread
혹은 Runnable
을 구현하는 방법은 잘 알고 있을거 같다.
쓰레드와 JVM 그리고 OS
본격적으로 시작해보자. jvm을 학습하다보면 심심하지 않게 쓰레드라는 용어가 등장한데 지금 학습하고 있는 쓰레드와 jvm의 쓰레드는 사전적으로는 같은 쓰레드다. 똑같이 어떤 특정한 작업 단위를 의미한다. 그렇다면 뭐가 다른걸까? 일단 주체 그러니까 프로세스부터 알아보자. jvm의 쓰레드의 프로세스는 아무래도 jvm이겠지.. jvm에서 실행단위를 구분지어서 하는거니까..
그렇다면 java에서 작성은 쓰레드의 프로세스는 뭘까? java그 자체일까? 아니면 뭘까? JVM이 프로세스다.
학습 이유
지금까지 jvm이 프로세스인건 알았다. 근데 생각해보니 쓰레드를 왜 학습하는 걸까? 쓰레드 몰라도 스프링 혹은 스프링 부트가 처리를 해줄텐데 왜 우리는 쓰레드를 학습을 해야 하는걸까? 사실 스프링이 쓰레드의 몇몇은 처리를 해주는것이 맞다. 그래서 많은 이들이 쓰레드가 어렵다는 이유와 이와 같은 이유로 포장을 한다. 나도 그들중 하나였다. 하지만 쓰레드를 제대로 학습하게 되면 크게 2가지 이점이 있다.
- 다양한 기술들을 이해하기 쉽다. 예를 들어, 비관락,낙관락도 쓰레드를 통해 이해한다면, 조금더 수월할 가능성이 높을거라 생각한다. 또한 레디스같은 기술들도 쓰레드를 제대로 이해하면 조금더 수월해질거라 생각한다.
- 테스트 코드를 작성하기 쉬워진다. 대용량 테스트를 하기 위해서는 직접 시도 하는 방법과 쓰레드를 이용해 테스트 코드로 작성하는 방법이 존재한다. 전자 같은 경우 부하테스트를 해야한다고 생각했을때 부하테스트기를 설치하고 프로그램을 실행시킨다는 등 여러가지 과정이 존재한다. 너무 시간이 오래걸린다. 하지만 후자는 코드만 짤줄만 안다면 테스트코드를 작성할 수 있다.
아직 학습하진 않았지만 쓰레드를 통해 동시성 테스트도 진행이 가능하다. 이걸 쉽게 생각하면 자바 필드가 프로세스고 거기에 쓰레드를 사용한다고 생각하면 되는데 쓰레드 여러개가 있으면 선점도 있을거고 여러가지 동시성 이슈를 발생을 시킬 수 있다.(이거는 잘못된 설명이다. 일단 예시때문에 이렇게 표현했을 뿐이다.)
이제 쓰레드를 학습해보자.
next to
JVM과 관계 생명주기 동시성 동기화 발전과정
더 중요한게 있을수는 있겠지만 이덩도만 알면 확장 가능할거라 예상한다. 이번장에는 요약은 없다.