[SB_BASIC] BasicApplication 동작방식

junghan·2023년 5월 17일
0

SpringBootProject

목록 보기
4/35
post-thumbnail

사실상 Spring boot의 hello world 격인 Basic Application을 명확하게 알고가야하지 않을까? 라는 생각이 들어 정리하기로 마음먹었습니다.

Spring boot 스타터로 스프링부트 프로젝트를 생성할 경우 아래와 같이 main이 자동으로 생성되는데, 기본적으로 @SpringBootApplication을 주입한 상태로 BasicApplication클래스가 주어지는 것을 볼 수 있습니다.

package com.springboot.basic;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BasicApplication {

	public static void main(String[] args) {
		SpringApplication.run(BasicApplication.class, args);
	}

}

위의 코드는 Spring Boot 프로젝트의 기본 구조와 엔트리 포인트를 나타내는 클래스입니다. 코드를 하나씩 살펴보면서 각 부분의 기능과 내부 동작 방식에 대해 설명해보겠습니다.

  1. 패키지 및 import 선언:

    • com.springboot.basic 패키지에 BasicApplication 클래스를 정의합니다.
    • org.springframework.boot.SpringApplication 클래스와 org.springframework.boot.autoconfigure.SpringBootApplication 어노테이션을 import합니다.

  2. @SpringBootApplication 어노테이션:

    • 이 어노테이션은 Spring Boot 애플리케이션을 실행하기 위해 필요한 구성을 자동으로 처리하는 편리한 기능을 제공합니다.
    • 이 어노테이션은 @Configuration, @EnableAutoConfiguration, @ComponentScan 세 가지 어노테이션을 하나로 묶은 메타 어노테이션입니다.
    • @Configuration: 애플리케이션의 구성 요소를 정의하는 클래스임을 나타냅니다.
    • @EnableAutoConfiguration: 클래스경로와 빈 설정을 기반으로 스프링 부트의 자동 구성을 활성화합니다.
    • @ComponentScan: @Component, @Service, @Repository 등과 같은 컴포넌트를 검색하고 스프링에 등록합니다.


  3. BasicApplication 클래스:

    • Spring Boot 애플리케이션의 엔트리 포인트로 사용되는 클래스입니다.
    • public static void main(String[] args) 메서드를 포함하고 있습니다.
    • SpringApplication.run(BasicApplication.class, args) 메서드를 호출하여 애플리케이션을 실행합니다.
    • BasicApplication 클래스는 @SpringBootApplication 어노테이션이 있는 패키지와 하위 패키지에 있는 구성 요소를 검색하고 구성합니다.

  4. SpringApplication.run() 메서드:
    - Spring Boot 애플리케이션을 실행하는 역할을 합니다.
    - BasicApplication.class는 애플리케이션의 주 구성 클래스를 나타냅니다.
    - args는 프로그램 실행 시 전달되는 명령행 인수(arguments)입니다.


    Spring Boot는 내부적으로 다음과 같은 동작 방식을 따릅니다:

  • @SpringBootApplication 어노테이션이 선언된 클래스에서 main() 메서드를 실행합니다.
  • SpringApplication.run() 메서드가 호출되면 스프링 부트 애플리케이션 컨텍스트가 생성됩니다.
  • 컨텍스트는 애플리케이션을 구성하는 컴포넌트를 검색하고 구성합니다




그렇다면 위 개념을 토대로 전체적으로 IntelliJ를 사용하여 Spring Boot 애플리케이션을 실행할 때, 어떤 단계를 걸쳐 빌드되고 실행되는지 설명해보겠습니다.
  1. 소스 코드 및 프로젝트 구성:
    • IntelliJ에서는 Maven 또는 Gradle과 같은 빌드 도구를 사용하여 프로젝트를 관리하는 것을 권장합니다.
    • Maven 또는 Gradle을 사용하여 프로젝트를 구성하고 필요한 의존성을 정의합니다.
    • 소스 코드를 작성하고 프로젝트 디렉토리에 저장합니다.

  2. Spring Boot 애플리케이션 실행 구성:
    • IntelliJ의 상단 메뉴에서 "Run" 또는 "Run Configuration"을 선택합니다.
    • "Edit Configurations" 대화상자가 열리면 "+" 버튼을 클릭하여 새로운 구성을 추가합니다.
    • "Application"을 선택하고 "Main class" 옵션에 BasicApplication 클래스를 선택합니다.

  3. 애플리케이션 실행:
    • IntelliJ에서 "Run" 버튼을 클릭하거나 Shift+F10 키를 눌러 애플리케이션을 실행합니다.
    • IntelliJ는 Maven 또는 Gradle을 사용하여 필요한 종속성을 가져오고 빌드합니다.
    • 애플리케이션 실행 시 BasicApplication 클래스의 main() 메서드가 호출됩니다.
    • SpringApplication.run() 메서드가 실행되면 스프링 부트 애플리케이션 컨텍스트가 생성됩니다.

  4. 애플리케이션 컨텍스트 생성:
    • 스프링 부트 애플리케이션 컨텍스트는 애플리케이션을 구성하는 컴포넌트를 검색하고 구성합니다.
    • 컨텍스트는 @SpringBootApplication 어노테이션이 선언된 클래스와 해당 클래스가 속한 패키지를 스캔합니다.
    • 컴포넌트 스캔을 통해 @Component, @Service, @Repository 등과 같은 어노테이션이 지정된 클래스를 찾고 스프링 컨테이너에 등록합니다.
    • 등록된 빈(Bean)은 스프링 애플리케이션에서 사용할 수 있습니다.

  5. 애플리케이션 실행 및 서버 시작 :
    • 애플리케이션은 이제 지정된 포트에서 수신 대기하고 클라이언트의 요청을 처리합니다.
    • 요청이 들어오면 내장 웹 서버는 해당 요청을 애플리케이션에 전달합니다.
    • 애플리케이션은 요청을 처리하기 위해 컨트롤러, 서비스, 데이터 액세스 계층 등과 같은 등록된 빈(Bean)을 사용합니다.
    • 요청에 따라 애플리케이션은 비즈니스 로직을 수행하고 데이터를 처리하여 결과를 생성합니다.

  6. 응답 반환:
    • 애플리케이션은 요청 처리 후 생성된 응답을 내장 웹 서버에 반환합니다.
    • 내장 웹 서버는 해당 응답을 클라이언트에게 다시 전송합니다.

  7. 애플리케이션 종료:
    • 애플리케이션 실행 중 Ctrl+C나 IntelliJ의 "Stop" 버튼을 클릭하여 애플리케이션을 종료할 수 있습니다.
    • 애플리케이션 종료 시 내장 웹 서버도 함께 종료됩니다.

IntelliJ는 Spring Boot 애플리케이션을 실행하기 위해 Maven 또는 Gradle을 사용하여 필요한 종속성을 가져오고 빌드합니다. 또한 IntelliJ는 내장된 서버를 시작하고 애플리케이션을 구성하기 위해 Spring Boot의 자동 구성 기능을 활용합니다. 이렇게 함으로써 개발자는 별도의 외부 서버 구성 없이 간단하게 Spring Boot 애플리케이션을 실행하고 개발할 수 있습니다




컨텍스트 생성후 애플리케이션이 실행 되는데, 이는 Spring Boot에서 내장 톰캣(Embedded Tomcat)을 사용하여 웹 서버를 실행했기 때문입니다. 아래는 내장 웹서버가 호출되는 구조 및 동작방식입니다.

  1. 내장 톰캣 설정:
    • Spring Boot는 내장 톰캣을 자동으로 구성하고 필요한 종속성을 포함시킵니다.
    • Maven 또는 Gradle을 통해 필요한 의존성을 가져오고 빌드하면 내장 톰캣 라이브러리가 클래스패스에 추가됩니다.

  2. 애플리케이션 실행:
    • SpringApplication.run() 메서드를 호출하여 애플리케이션을 실행합니다.
    • 내장 톰캣은 Spring Boot 애플리케이션의 클래스패스에서 Tomcat 클래스를 찾아 사용합니다.

  3. 톰캣 서버 시작:
    • 내장 톰캣은 지정된 포트에서 들어오는 HTTP 요청을 처리하기 위해 서버 소켓을 열고 대기합니다.
    • 클라이언트의 요청이 들어오면 내장 톰캣은 해당 요청을 받아들이고 처리할 쓰레드를 생성합니다.

  4. 요청 처리:
    • 내장 톰캣은 받은 요청을 스프링 MVC(또는 다른 웹 프레임워크)에 전달합니다.
    • 스프링 MVC는 URL 매핑, 컨트롤러, 서비스, 데이터 액세스 계층 등과 같은 구성 요소를 사용하여 요청을 처리합니다.
    • 스프링 MVC는 컨트롤러를 선택하고 해당 컨트롤러의 메서드를 호출하여 요청을 처리하고 응답을 생성합니다.

  5. 응답 반환:
    • 스프링 MVC는 처리된 요청에 대한 응답을 생성합니다.
    • 내장 톰캣은 생성된 응답을 클라이언트에게 반환합니다.

  6. 톰캣 서버 종료:
    • 애플리케이션이 종료되거나 내장 톰캣 서버가 종료되면 내장 톰캣은 서버 소켓을 닫고 실행 중인 쓰레드를 종료합니다.

내장 톰캣은 Spring Boot 애플리케이션의 클래스패스에서 Tomcat 라이브러리를 찾아 사용하며, 별도의 톰캣 설치나 구성 없이 애플리케이션을 실행할 수 있습니다. 이는 개발 환경에서 간편한 실행과 배포를 가능하게 해주는 Spring Boot의 특징 중 하나입니다.

profile
42seoul, blockchain, web 3.0

0개의 댓글