스프링 스터디(with 큐시즘 개발팀) - 4주차

PM/iOS Developer KimKU·2022년 10월 3일
0

Spring Study

목록 보기
4/4
post-thumbnail

Spring Study

1. 프로세스와 스레드는 각각 무엇이고, 둘의 차이는 무엇인가

먼저 프로세스와 스레드를 알아보기 전에 프로그램 이라는 개념에 대해 알아야 한다.

프로그램

프로그램이란, 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가지 않은 정적인 상태를 말한다. 즉, 메모리에 올라가지 않는 상태이기 때문에 아직 운영체제로부터 독립적인 메모리 공간을 할당받지 않은 상태이며 정적인 상태이기 때문에 아직 실행되지 않고 가만히 있는 상태이다.

즉, 그냥 코드 덩어리라고 할 수 있다.

프로세스

프로세스란, 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램이다. 컴퓨터에서 실행되고 있다는 것은 운영체제로부터 독립적인 메모리 공간을 할당받았다는 것이며, 실행되고 있기 때문에 동적인 상태이다.

아래 그림은 프로세스를 나타낸 모습이다.

ㅇ

프로세스의 각각의 영역에 대한 설명을 해보겠다.

  • Code: 코드 자체를 구성하는 메모리 영역(프로그램 명령)
  • Data: 전역 변수, 정적, 변수, 배열 등의 데이터(초기화된 데이터)
  • Stack: 지역 변수, 매개 변수, 리턴 값 등의 임시 데이터(임시 메모리 영역)
  • Heap: 동적 할당 시 사용(new(), malloc() 등)

ㄴ

즉, 프로그램은 코드 덩어리 파일이며 이 프로그램을 실행한 것이 바로 프로세스 이다.

프로세스의 특징은 다음과 같다.

  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 가진다.
  • 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
  • 각각의 프로세스는 별도의 주소 공간에서 실행되고, 기본적으로 서로 다른 프로세스의 자원에 접근할 수 없다.(운영체제에서 안정성을 위해 이렇게 설계됨)
  • 다른 프로세스의 자원에 접근하기 위해서는 프로세스 간 통신(IPC)을 이용해야 한다.

스레드

스레드란, 프로세스 내에서 실행되는 여러 흐름의 단위이다. 즉, 프로세스의 특정한 수행 경로이며, 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.

  • 프로세스 내에서 Stack만 따로 할당받고, Code, Data, Heap 영역은 공유하는 스레드이다.

ㄷ

스레드는 프로세스의 공유적인 한계점을 극복하기 위해 만들어지 개념이기 때문에, 프로세스와는 달리 서로 메모리를 공유한다. 즉, 스레드 끼리는 프로세스의 자원을 공유하며 프로세스 실행 흐름의 일부가 되는 것이다.

스레드의 특징은 다음과 같다.

  • 스레드는 프로세스 내에서 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내의 스레드 끼리 서로 공유한다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 스레드도 그 변경된 결과를 즉시 볼 수 있다.

지금까지 살펴본 프로그램프로세스스레드의 개념을 코드에 비유하여 정리해보면

  • 프로그램은 아직 실행되지 않은 실행 파일로써 코드 덩어리라고 볼 수 있고
  • 프로세스는 이러한 프로그램(코드 덩어리)을 실행한 것이라고 볼 수 있고
  • 스레드는 이 코드의 일부분(main문, 함수 등)으로 볼 수 있다.

프로세스와 스레드의 차이를 설명하자면 다음과 같이 말할 수 있을것 같다.

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이며, 스레드는 할당 받은 자원을 이용하는 실행의 기본 단위이고 프로세스 내에 여러개 생길 수 있다. 어플리케이션 하나가 프로세스라면, 그 안에서의 분기 처리가 스레드가 되는 셈이다.

2. 스프링은 멀티 스레딩 방식으로 동작하는데, 이들 간의 Thread-safe 할 수 있는 이유는 무엇인가

일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업을 수행하게 된다. 하지만 스프링은 멀티 스레딩 방식으로 동작하는데, 멀티 스레딩은 싱글 스레딩과 무엇이 다를까?

멀티 스레드(Multi Thread)

멀티 스레드는 CPU의 최대 활용을 위해 프로그램의 둘 이상을 동시에 실행하는 기술이다. 즉, 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것을 의미한다.

이러한 작업은 컨텍스트 스위칭(Context Switching)을 통해서 이뤄진다. 하나의 스레드에서 다음 스레드로 이동을 하면서, 컨텍스트 스위칭이 일어난다. 그리고, 스위칭이 일어나면서 부분적으로 조금씩 조금씩 각각의 스레드에 대한 작업을 끝나게 된다.

다시 말해서, 컨텍스트 스위칭이 엄청 빠르게 일어나면서, 유저의 시선에서는 프로그램들이 동시에 수행되는 것처럼 보인다.

멀티 스레드의 장점

  • 응답성: 프로그램의 일부분(스레드 중 하나)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가한다.
  • 경제성: 프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원 소모가 줄어든다.
  • 멀티프로세서의 활용: 다중 CPU 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있으므로 병렬성이 증가한다.

멀티 스레드의 장점

  • 컨텍스트 스위칭, 동기화 등의 이유 때문에 싱글 코어 멀티 스레딩은 스레드 생성 시간이 오히려 오버헤드로 작용해 단일 스레드보다 느리다.
  • 공유하는 자원에 동시에 접근하는 경우, 프로세스와는 달리 스레드는 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 따라서 동기화가 필요하다.
  • 멀티 스레딩을 위해서는 운영체제의 지원이 필요하다.

Spring에서의 Thread-safe(???)

Spring은 기본적으로 Thread-safe 하지 않은 환경이라고 한다. 즉, Spring 자체는 Thread-safe 하지 않지만, 우리가 흔히 널리 퍼져 알고 있는 Spring의 사용 방법이 바로 Thread-safe 한 방법이기 때문에, 이에 대한 문제를 느낄 수 없었다는 것이다.

3. 스프링 프로젝트를 실행 Run 하면 그 시작점은 어디인가

스프링 부트의 핵심은 아래와 같다.

💡 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 어노테이션에 주목해야 한다.

@SpringBootApplication

이 어노테이션은 @Configuration, @EnableAutoConfiguration, @ComponentScan 이 합쳐진 것이다. 이를 통해 전체 Application Component를 식별한다.

따라서 순서를 보면

  1. classPath를 조사해서 spring-boot-starter-seb 스타터가 선언된 것을 인지한 스프링부트는 웹애플리케이션을 구성한다.
  2. 어노테이션(@RestController, @Server, @Repository, …)를 스캔한다.
  3. spring-boot-starter-web 의존체 중 하나인 톰캣으로 앱을 띄운다.
profile
With passion and honesty

0개의 댓글