Akashic Records

@SpringBootApplication 본문

Spring for Beginners

@SpringBootApplication

Andrew's Akashic Records 2024. 2. 13. 16:52
728x90

The new, simplified illustration showcasing the structure of the Spring Framework as a minimalist garden is ready. This visualization aims to clearly and elegantly represent the modular design of the framework through the metaphor of a garden, emphasizing the harmonious integration of its various components.

@SpringBootApplication 어노테이션은 Spring Boot 애플리케이션의 핵심적인 부분으로, 여러 기능을 한데 묶은 편리한 어노테이션입니다. 주로 애플리케이션의 메인 클래스에 선언되며, Spring Boot 애플리케이션의 시작점으로 사용됩니다. 이 어노테이션은 다음 세 가지 주요 어노테이션을 포함하는 메타 어노테이션(meta-annotation)입니다:

1. @EnableAutoConfiguration

  • Spring Boot의 자동 구성(auto-configuration) 메커니즘을 활성화합니다.
  • 클래스패스(classpath) 설정, 다양한 빈(bean) 설정, 다양한 속성 설정 등 애플리케이션을 위한 기본적인 설정을 자동으로 구성해 줍니다.
  • 예를 들어, Spring MVC가 클래스패스에 있으면, Spring Boot는 자동으로 웹 애플리케이션을 구성하기 위해 필요한 빈들을 설정합니다.

2. @ComponentScan

  • @Component, @Service, @Repository, @Controller 등의 어노테이션이 붙은 클래스를 스캔하여 스프링 빈으로 등록합니다.
  • 이 어노테이션은 개발자가 명시적으로 빈 설정을 하지 않아도, 스프링이 자동으로 클래스를 찾아 스프링 애플리케이션 컨텍스트에 빈으로 등록하게 해줍니다.
  • 일반적으로 @SpringBootApplication을 선언한 클래스의 패키지를 기준으로 하위 패키지를 대상으로 스캔합니다.

3. @Configuration

  • 현재 클래스가 스프링의 설정 파일 역할을 함을 나타냅니다.
  • 자바 기반의 설정을 할 때 사용되며, @Bean 어노테이션을 사용하여 스프링 컨테이너에 빈을 등록할 수 있습니다.

사용 예시

package com.example.myapp;

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

@SpringBootApplication // <== 이 어노테이션으로 인해 @EnableAutoConfiguration, @ComponentScan, @Configuration이 활성화됩니다.
public class MyAppApplication {

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

@SpringBootApplication 어노테이션을 사용함으로써, Spring Boot 애플리케이션을 간단하게 구성할 수 있으며, Spring의 핵심 기능인 의존성 주입, 자동 구성, 컴포넌트 스캔 등을 손쉽게 사용할 수 있습니다. 이는 Spring Boot가 제공하는 "convention over configuration" 접근 방식의 좋은 예시입니다.

 

@SpringBootApplication 어노테이션은 Spring Boot 애플리케이션을 개발할 때 광범위하게 사용되며, 그 안에는 여러 가지 설정과 기능이 내장되어 있습니다. 이 어노테이션은 사실상 @EnableAutoConfiguration, @ComponentScan, 그리고 @Configuration 세 가지 주요 어노테이션의 기능을 합쳐 놓은 것으로, Spring Boot 애플리케이션의 자동 구성, 구성 클래스 선언, 그리고 컴포넌트 스캔을 촉진합니다. 여기에는 다양한 사용자 정의 설정이 포함될 수 있습니다:

1. 자동 구성 오버라이딩 (Auto-configuration Override)

  • @SpringBootApplication으로 활성화된 자동 구성은 특정 조건에 따라 적용됩니다. 개발자는 application.properties 또는 application.yml 파일을 사용하여 이러한 자동 구성을 오버라이드하거나 조정할 수 있습니다.
  • 예를 들어, 내장 톰캣 서버의 포트를 변경하고 싶다면 application.properties 파일에 server.port=8081과 같이 설정합니다.

2. 특정 자동 구성 클래스 제외 (Exclude Specific Auto-configuration Classes)

  • 특정 자동 구성 클래스를 제외하려면, @SpringBootApplication 어노테이션의 exclude 속성을 사용합니다.
    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
    public class MyAppApplication {
      // ...
    }
  • 위 예제는 데이터 소스 자동 구성을 애플리케이션에서 제외합니다.

3. 컴포넌트 스캔 베이스 패키지 지정 (Specifying Base Packages for Component Scan)

  • @ComponentScan의 기능을 사용하여 스캔할 베이스 패키지를 지정할 수 있습니다. 이는 @SpringBootApplication 어노테이션에 scanBasePackages 속성을 설정하여 수행할 수 있습니다.
    @SpringBootApplication(scanBasePackages = "com.example.package")
    public class MyAppApplication {
      // ...
    }
  • 이 설정은 Spring이 지정된 패키지와 그 하위 패키지에서 컴포넌트, 서비스, 구성 등을 스캔하도록 합니다.

4. 환경에 따른 구성 분리 (Profile-specific Configuration)

  • 애플리케이션의 실행 환경(예: 개발, 테스트, 운영)에 따라 다른 구성을 적용할 수 있습니다. @Profile 어노테이션을 사용하여 환경별로 다른 빈을 등록하거나, application-{profile}.properties 파일을 통해 환경별로 다른 설정을 적용할 수 있습니다.

5. 애플리케이션 이벤트와 리스너 (Application Events and Listeners)

  • 애플리케이션의 생명주기 이벤트(예: 시작됨, 준비됨, 종료됨)를 감지하고 반응하는 리스너를 정의할 수 있습니다. 이는 ApplicationRunner 또는 CommandLineRunner 인터페이스를 구현함으로써 시작 시점에 특정 코드를 실행할 수 있게 해줍니다.

6. 외부 구성 (Externalized Configuration)

  • 애플리케이션의 구성을 외부화하여, 코드 변경 없이 다양한 환경에서 애플리케이션을 유연하게 구성할 수 있습니다. @Value, @ConfigurationProperties 등을 사용하여 외부 설정 

Spring Boot 애플리케이션의 구조

Spring Boot 3는 Spring Framework 6를 기반으로 하며, Java 17 이상을 요구합니다. 이 버전은 모듈화, 자동 구성, 보안 개선, 리액티브 프로그래밍 지원 등을 포함하여 현대적인 마이크로서비스 아키텍처와 클라우드 네이티브 애플리케이션 개발을 위한 많은 기능을 제공합니다. Spring Boot 애플리케이션의 구조는 간결하면서도 확장 가능하게 설계되어 있어, 개발자가 비즈니스 로직에 집중할 수 있게 도와줍니다.

Spring Boot 3의 주요 구조 요소

1. 프로젝트 구조

Spring Boot 애플리케이션의 표준 프로젝트 구조는 다음과 같습니다:

  • src/main/java/: 애플리케이션의 Java 소스 코드가 위치합니다.
  • src/main/resources/: 정적 리소스(HTML, CSS, JS 등), 뷰 템플릿, 그리고 application.propertiesapplication.yml 같은 구성 파일이 위치합니다.
  • src/test/java/: 단위 테스트 및 통합 테스트를 위한 테스트 코드가 위치합니다.

2. 의존성 관리

Gradle 또는 Maven을 사용하여 프로젝트의 의존성을 관리합니다. Spring Boot 스타터(Starter) 의존성을 통해 필요한 라이브러리를 쉽게 추가할 수 있습니다.

3. 자동 구성 (Auto-configuration)

Spring Boot는 클래스패스에 있는 라이브러리와 애플리케이션의 구성 설정을 기반으로 애플리케이션을 자동으로 구성합니다. 예를 들어, Spring MVC가 클래스패스에 있으면 웹 애플리케이션을 위한 기본 설정이 자동으로 적용됩니다.

4. 내장 서버

Spring Boot는 내장 Tomcat, Jetty, 또는 Undertow 서버를 사용하여 애플리케이션을 손쉽게 실행할 수 있게 합니다. 별도의 웹 서버 설치 없이 애플리케이션을 개발하고 테스트할 수 있습니다.

5. 애플리케이션 설정

application.properties 또는 application.yml 파일을 통해 애플리케이션의 다양한 설정을 쉽게 관리할 수 있습니다. 데이터베이스 연결, 로깅 수준, 서버 포트 등을 설정할 수 있습니다.

6. 리액티브 프로그래밍 지원

Spring WebFlux를 통해 비동기적이고 논블로킹 방식의 웹 애플리케이션을 구축할 수 있습니다. 이는 리액티브 프로그래밍을 지원하여, 높은 동시성 처리와 성능 향상을 가능하게 합니다.

7. 보안

Spring Security를 통해 애플리케이션의 보안을 강화할 수 있습니다. 인증, 권한 부여, OAuth2, JWT 등의 보안 기능을 쉽게 구현할 수 있습니다.

8. 마이크로서비스 및 클라우드 지원

Spring Cloud와의 통합을 통해 서비스 발견, 구성 관리, 클라우드 배포 등 마이크로서비스 아키텍처를 위한 다양한 기능을 사용할 수 있습니다.

Spring Boot 3는 이러한 구조와 기능을 통해 개발자가 현대적인 애플리케이션을 빠르게 개발하고, 쉽게 배포할 수 있는 환경을 제공합니다.

 

build.gradle 파일에 JPA (Java Persistence API) 의존성을 추가하는 것은 Spring Boot 애플리케이션에서 데이터베이스 작업을 쉽게 하기 위한 중요한 단계입니다. Spring Boot에서는 Spring Data JPA를 사용하여 JPA의 구현을 간소화하고, 데이터베이스와의 상호작용을 더 쉽게 만듭니다.

 

아래는 build.gradle 파일에 Spring Data JPA 의존성을 추가하는 방법을 보여줍니다. 이 예제에서는 Gradle을 사용하고 있으며, Spring Boot 프로젝트를 위한 기본 설정이 이미 적용되어 있다고 가정합니다.

build.gradle에 Spring Data JPA 의존성 추가:

plugins {
    id 'org.springframework.boot' version '3.x.x'
    id 'io.spring.dependency-management' version '1.x.x'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2' // 내장형 H2 데이터베이스를 예시로 사용
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

여기서 주목해야 할 부분은 다음과 같습니다:

  • org.springframework.boot:spring-boot-starter-data-jpa: Spring Data JPA와 함께 작동하기 위해 필요한 모든 의존성을 포함하는 스프링 부트 스타터입니다. 이 스타터는 JPA를 사용하여 데이터베이스와 상호작용하는데 필요한 기본적인 설정을 자동으로 구성합니다.
  • runtimeOnly 'com.h2database:h2': 예시로, H2 데이터베이스 의존성을 추가했습니다. H2는 자바 기반의 인메모리 데이터베이스로, 개발 및 테스트 목적에 매우 유용합니다. 실제 프로덕션 환경에서는 MySQL, PostgreSQL, Oracle 등의 데이터베이스를 사용할 수 있으며, 해당 데이터베이스에 맞는 드라이버 의존성을 추가해야 합니다.

이 설정을 통해 Spring Boot 애플리케이션에서 JPA를 사용하여 데이터베이스 작업을 수행할 준비가 완료됩니다. 데이터 소스 구성, 엔티티 클래스 정의, 리포지토리 인터페이스 생성 등 다음 단계로 진행할 수 있습니다.

Spring Boot 애플리케이션에서 일반적으로 사용되는 계층적 아키텍처는 프레젠테이션(Presentation), 서비스(Service), 퍼시스턴스(Persistence) 계층으로 구성됩니다. 이러한 계층을 사용하면 애플리케이션의 관심사를 분리하여, 유지보수가 용이하고 확장성 있는 설계를 할 수 있습니다. 각 계층의 역할은 다음과 같습니다:

  • 프레젠테이션 계층: 사용자 인터페이스와 상호작용하는 부분입니다. REST API, 웹 페이지 등 사용자 또는 외부 시스템의 요청을 받아 처리합니다.
  • 서비스 계층: 비즈니스 로직을 처리합니다. 여러 DAO(Data Access Object)나 리포지토리를 조합하여 비즈니스 요구사항을 구현합니다.
  • 퍼시스턴스 계층: 데이터베이스와의 상호작용을 담당합니다. JPA, Hibernate 등을 사용하여 엔티티를 관리하고 데이터를 영구 저장합니다.

예제: 간단한 사용자 관리 애플리케이션

1. 프레젠테이션 계층 (Controller)

UserController.java 파일을 src/main/java/com/example/demo/controller 경로에 생성합니다.

package com.example.demo.controller;

import com.example.demo.service.UserService;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public List<User> getAllUsers() {
        return userService.findAllUsers();
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.saveUser(user);
    }
}

2. 서비스 계층 (Service)

UserService.java 인터페이스를 src/main/java/com/example/demo/service 경로에 생성합니다.

package com.example.demo.service;

import com.example.demo.model.User;

import java.util.List;

public interface UserService {
    List<User> findAllUsers();
    User saveUser(User user);
}

UserServiceImpl.java 구현 클래스를 같은 경로에 생성합니다.

package com.example.demo.service;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public List<User> findAllUsers() {
        return userRepository.findAll();
    }

    @Override
    public User saveUser(User user) {
        return userRepository.save(user);
    }
}

3. 퍼시스턴스 계층 (Repository)

UserRepository.java 인터페이스를 src/main/java/com/example/demo/repository 경로에 생성합니다. Spring Data JPA를 사용하여 구현합니다.

package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // 기본 CRUD 메소드와 함께 필요한 쿼리 메소드를 추가할 수 있습니다.
}

4. 모델 (Model)

User.java 엔티티 클래스를 src/main/java/com/example/demo/model 경로에 생성합니다.

package com.example.demo.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;

    // 생성자, getter, setter 생략
}

이 예제는 Spring Boot 애플리케이션에서 프레젠테이션, 서비스, 퍼시스턴스 계층을 구성하는 기본적인 방법을 보여줍니다. 각 계층은 독립적으로 기능하며, Spring의 의존성 주입을 통해 서로 연결됩니다. 이러한 분리는 코드의 재사용성과 테스트 용이성을 높여줍니다.

요청-응답 과정

Spring Boot에서 HTTP 요청이 들어오고 응답이 처리되는 과정은 여러 단계를 거치게 됩니다. 이 과정을 이해하는 것은 Spring Boot 애플리케이션의 작동 방식을 파악하는 데 도움이 됩니다. 다음은 Spring Boot에서 요청-응답 과정의 주요 단계입니다:

1. 클라이언트 요청 발생

  • 사용자(또는 클라이언트 애플리케이션)가 웹 브라우저나 HTTP 클라이언트를 통해 특정 URL로 HTTP 요청을 보냅니다. 이 요청은 GET, POST, PUT, DELETE 등의 HTTP 메소드를 포함할 수 있습니다.

2. 내장 서버 수신

  • Spring Boot 애플리케이션은 내장된 톰캣(Tomcat), 제티(Jetty), 언더토우(Undertow) 등의 웹 서버를 사용하여 HTTP 요청을 수신합니다. 애플리케이션은 특정 포트(기본값은 8080)에서 요청을 기다립니다.

3. 디스패처 서블릿(Dispatcher Servlet)

  • 수신된 요청은 먼저 디스패처 서블릿에 도달합니다. 디스패처 서블릿은 Spring MVC의 핵심 요소로, 모든 HTTP 요청을 적절한 컨트롤러로 라우팅하는 역할을 합니다.

4. 핸들러 매핑(Handler Mapping)

  • 디스패처 서블릿은 핸들러 매핑을 사용하여 요청 URL을 처리할 수 있는 컨트롤러의 메소드(핸들러)를 찾습니다. URL 패턴과 HTTP 메소드는 @RequestMapping 또는 @GetMapping, @PostMapping 등의 어노테이션을 통해 정의됩니다.

5. 컨트롤러 실행

  • 적절한 컨트롤러가 선택되면, 요청을 처리할 메소드가 실행됩니다. 이 메소드는 비즈니스 로직을 처리하고, 모델 객체를 조작하며, 응답을 생성하기 위해 서비스 계층의 메소드를 호출할 수 있습니다.

6. 서비스 계층

  • 컨트롤러는 비즈니스 로직을 처리하기 위해 서비스 계층의 메소드를 호출합니다. 서비스 계층은 비즈니스 로직을 캡슐화하고, 퍼시스턴스 계층(데이터베이스 작업)과의 상호작용을 관리합니다.

7. 데이터베이스 접근

  • 필요한 경우, 서비스 계층은 JPA, Hibernate 등을 사용하여 데이터베이스를 조회하거나 업데이트합니다. 이러한 작업은 리포지토리 계층을 통해 수행됩니다.

8. 뷰 렌더링 또는 응답 생성

  • 컨트롤러는 처리 결과를 바탕으로 응답 데이터를 생성합니다. RESTful API의 경우, JSON 또는 XML 형식의 데이터를 HTTP 응답 본문에 포함시킬 수 있습니다. 웹 애플리케이션의 경우, 뷰 템플릿 엔진(예: Thymeleaf, FreeMarker)을 사용하여 동적으로 HTML 페이지를 생성할 수 있습니다.

9. 클라이언트에 응답 전송

  • 생성된 응답은 클라이언트에게 전송됩니다. 이 응답에는 상태 코드, 응답 본문, 헤더 등이 포함될 수 있습니다.

이 과정을 통해 Spring Boot 애플리케이션은 HTTP 요청을 효과적으로 처리하고, 요청에 대한 적절한 응답을 생성하여 클라이언트에게 제공합니다.

728x90

'Spring for Beginners' 카테고리의 다른 글

Spring Security 는 처음이에요.  (1) 2024.02.27
Spring Rest API는 처음인데요.  (0) 2024.02.22
Spring JPA는 처음인데요.  (0) 2024.02.19
Spring Boot 첫 번째 예제  (0) 2024.02.13
기본 용어의 이해  (0) 2024.02.13
Comments