먼저 프로세스와 스레드를 알아보기 전에 프로그램 이라는 개념에 대해 알아야 한다.
프로그램이란, 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가지 않은 정적인 상태를 말한다. 즉, 메모리에 올라가지 않는 상태이기 때문에 아직 운영체제로부터 독립적인 메모리 공간을 할당받지 않은 상태이며 정적인 상태이기 때문에 아직 실행되지 않고 가만히 있는 상태이다.
즉, 그냥 코드 덩어리라고 할 수 있다.
프로세스란, 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램이다. 컴퓨터에서 실행되고 있다는 것은 운영체제로부터 독립적인 메모리 공간을 할당받았다는 것이며, 실행되고 있기 때문에 동적인 상태이다.
아래 그림은 프로세스를 나타낸 모습이다.
프로세스의 각각의 영역에 대한 설명을 해보겠다.
즉, 프로그램은 코드 덩어리 파일이며 이 프로그램을 실행한 것이 바로 프로세스 이다.
프로세스의 특징은 다음과 같다.
스레드란, 프로세스 내에서 실행되는 여러 흐름의 단위이다. 즉, 프로세스의 특정한 수행 경로이며, 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.
스레드는 프로세스의 공유적인 한계점을 극복하기 위해 만들어지 개념이기 때문에, 프로세스와는 달리 서로 메모리를 공유한다. 즉, 스레드 끼리는 프로세스의 자원을 공유하며 프로세스 실행 흐름의 일부가 되는 것이다.
스레드의 특징은 다음과 같다.
지금까지 살펴본 프로그램과 프로세스와 스레드의 개념을 코드에 비유하여 정리해보면
프로세스와 스레드의 차이를 설명하자면 다음과 같이 말할 수 있을것 같다.
프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이며, 스레드는 할당 받은 자원을 이용하는 실행의 기본 단위이고 프로세스 내에 여러개 생길 수 있다. 어플리케이션 하나가 프로세스라면, 그 안에서의 분기 처리가 스레드가 되는 셈이다.
일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업을 수행하게 된다. 하지만 스프링은 멀티 스레딩 방식으로 동작하는데, 멀티 스레딩은 싱글 스레딩과 무엇이 다를까?
멀티 스레드는 CPU의 최대 활용을 위해 프로그램의 둘 이상을 동시에 실행하는 기술이다. 즉, 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것을 의미한다.
이러한 작업은 컨텍스트 스위칭(Context Switching)을 통해서 이뤄진다. 하나의 스레드에서 다음 스레드로 이동을 하면서, 컨텍스트 스위칭이 일어난다. 그리고, 스위칭이 일어나면서 부분적으로 조금씩 조금씩 각각의 스레드에 대한 작업을 끝나게 된다.
다시 말해서, 컨텍스트 스위칭이 엄청 빠르게 일어나면서, 유저의 시선에서는 프로그램들이 동시에 수행되는 것처럼 보인다.
Spring은 기본적으로 Thread-safe 하지 않은 환경이라고 한다. 즉, Spring 자체는 Thread-safe 하지 않지만, 우리가 흔히 널리 퍼져 알고 있는 Spring의 사용 방법이 바로 Thread-safe 한 방법이기 때문에, 이에 대한 문제를 느낄 수 없었다는 것이다.
스프링 부트의 핵심은 아래와 같다.
💡 build.gradle 파일 내용에 따라 클래스 패스, 어노테이션, 기타 자바 구성 클래스를 보고 적합한 앱으로 맞춤하는 자동구성스프링부트의 시작점은 Application.java 파일이다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringProjectApplication {
public static void main(String[] args) {
SpringApplication.run(SpringProjectApplication.class, args);
}
}
먼저 @SpringBootApplication 어노테이션에 주목해야 한다.
이 어노테이션은 @Configuration, @EnableAutoConfiguration, @ComponentScan 이 합쳐진 것이다. 이를 통해 전체 Application Component를 식별한다.
따라서 순서를 보면