본문 바로가기
번역/Spring Boot 공식문서

[Spring Boot] 6. Developing with Spring Boot (6.1 부터 ~ 6.3 까지) | 공식 문서 번역

by 독서왕뼝아리 2023. 5. 26.
영어 공부 && 취미로 공식 문서 번역합니다.
의역, 오역 주의!!!!!!!!
영어 못함

원문 : https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

 


이번 장에서는 Spring Boot를 사용하는 방법을 더욱 자세하게 다룰 것입니다. 빌드 시스템과 자동 설정, 어플리케이션 실행과 같은 주제들 말이죠. 우리는 최고의 Spring Boot 예제를 제공할 것입니다. 개발을 쉽게 만들어줄 라이브러리를 사용하는 것만 빼면 Spring Boot와 별 다른 차이점은 없습니다.

Spring Boot를 처음 접한다면 이번 장을 시작하기 앞서 꼭 Getting Started 가이드를 읽어주시기 바랍니다.

 

6.1. Build Systems

의존성 관리를 위해, "Maven 중심의" 프로젝트를 다루기 위해 Maven과 Gradle 두 가지 빌드 시스템을 강력하게 추천합니다. 심지어 Ant 같은 빌드 시스템으로 구현된 프로젝트를 구동시킬 순 있지만 잘 호환되지는 않습니다.

 

6.1.1. Dependency Management

Spring Boot 각 버전은 체계화된 의존성 리스트를 제공합니다. 의존성을 사용하기 위해 빌드 설정에 어떠한 버전을 입력하지 않아도 됩니다. Spring Boot가 자동으로 관리하기 때문입니다. Spring Boot가 스스로 업그레이드 한다면, 이런 의존성 또한 같이 업그레이드 될 것입니다.

  물론 필요하다면 버전을 명시해 Spring Boot가 추천하는 버전을 오버라이드 할 수 있습니다.

의존성 리스트는 모든 검증된 서드파티와 Spring Boot를 쓸 수 있는 Spring 모듈을 포함하고 있습니다. Maven과 Gradle을 사용하면 이 리스트는 자원의 기본적인 영수증(?)처럼 사용 가능합니다.

  Spring Boot 각 버전은 Spring 프레임워크의 기본 버전과 연결돼 있습니다. 우리는 Spring Boot 버전을 명시하지 않는 것을 강력히 추천합니다.

 

6.1.2. Maven

Maven으로 Spring Boot를 이용하는 법을 알고 싶다면 Spring Boot's Maven 플러그인 문서를 확인하세요:

 

6.1.3. Gradle

Gradle로 Spring Boot를 이용하는 법을 알고 싶다면 Spring Boot's Gradle 플러그인 문서를 확인하세요:

 

6.1.4. Ant

Apache Ant+Ivy를 사용하면 Spring Boot를 빌드할 수 있습니다. Spring-boot-antlib "AntLib" 모듈 또한 Ant가 실행가능한 jar 파일을 만드는 것을 돕습니다.

의존성을 선언하려면 일반적인 ivy.xml 파일은 다음과 같습니다.:

<ivy-module version="2.0">
    <info organisation="org.springframework.boot" module="spring-boot-sample-ant" />
    <configurations>
        <conf name="compile" description="everything needed to compile this module" />
        <conf name="runtime" extends="compile" description="everything needed to run this module" />
    </configurations>
    <dependencies>
        <dependency org="org.springframework.boot" name="spring-boot-starter"
            rev="${spring-boot.version}" conf="compile" />
    </dependencies>
</ivy-module>
 

build.xml은 다음 예제와 같습니다:

<project
    xmlns:ivy="antlib:org.apache.ivy.ant"
    xmlns:spring-boot="antlib:org.springframework.boot.ant"
    name="myapp" default="build">

    <property name="spring-boot.version" value="3.0.4" />

    <target name="resolve" description="--> retrieve dependencies with ivy">
        <ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" />
    </target>

    <target name="classpaths" depends="resolve">
        <path id="compile.classpath">
            <fileset dir="lib/compile" includes="*.jar" />
        </path>
    </target>

    <target name="init" depends="classpaths">
        <mkdir dir="build/classes" />
    </target>

    <target name="compile" depends="init" description="compile">
        <javac srcdir="src/main/java" destdir="build/classes" classpathref="compile.classpath" />
    </target>

    <target name="build" depends="compile">
        <spring-boot:exejar destfile="build/myapp.jar" classes="build/classes">
            <spring-boot:lib>
                <fileset dir="lib/runtime" />
            </spring-boot:lib>
        </spring-boot:exejar>
    </target>
</project>
 
  만약 spring-boot-antlib 모듈을 사용하고 싶지 않다면 Build an Executable Archive From Ant without Using spring-boot-antlib “How-to” 부분을 확인하세요.

 

6.1.5. Starters

Starters는 애플리케이션에 포함할 수 있는 편리한 의존성 descriptor 입니다. 모든 Spring 을 위한 one-stop shop에 가서 샘플코드를 작성할 필요 없이 복사-붙여넣기를 통해 기술을 사용할 수 있습니다. 예를 들어 당신이 Spring과 데이터베이스 접근을 위해 JPA를 사용하고 싶으면, spring-boot-starter-data-jpa 의존성을 프로젝트에 추가하세요

 

Starters는 많은 의존성을 포함하고 있습니다. 동시에 그리고 빠르게 프로젝트에서 실행할 수 있게 돕습니다.

 

 

Starter의 종류를 알아봅시다.

 

모든 공식적인 starter는 네이밍 패턴이 다음과 같습니다; spring-boot-starter-*, 이때 *은 애플리케이션의 특정한 타입입니다. 이런 네임 구조는 개발자들이 starter에서 찾으려고 할 때 돕기 위해 의도된 것입니다. 다양한 IDE에서 Maven 통합은 개발자들이 의존성 이름을 검색하게 만듭니다. 예를 들어, 이클립스 또는 Spring 툴 플러그인이 설치되어 있다면,  POM 에디터에서 ctrl+space 만으로 "spring-boot-starter" 타입을 완성시킬 수 있습니다.

Creating Your Own Starter”에서 설명한대로 서드 파티 starter는 spring-boot 로 시작하면 안 됩니다. Spring Boot 공식 artifact로 취급받기 때문입니다. 아무튼, 서드 파티 starter는 일반적으로 프로젝트 이름으로 시작합니다. 예를 들어, 'thridpartyproject' 로 불리는 서드 파티 starter 프로젝트는 'thridpartyproject-spring-boot-starter'로 이름짓습니다.

다음의 애플리케이션 starter은 Spring Boot org.springframework.boot.group 하에서 공식적으로 지원하는 것들입니다.

 

Table 1. Spring Boot application startersNameDescription
spring-boot-starter 로깅과 YAML, 자동 설정을 지원하는 Core starter
spring-boot-starter-amqp AMQP와 Rabbit MQ를 위한 starter
spring-boot-starter-aop AOP를 위한 Spring AOP와 AspectJ starter
spring-boot-starter-artemis Apache Artemis을 사용하는 JMS 메시징을 위한 starter
spring-boot-starter-batch Spring Batch를 위한 starter
spring-boot-starter-cache Spring Framework의 캐싱을 돕는 starter
spring-boot-starter-data-cassandra Cassandra 분산 데이터 베이스와 Spring Data Cassandra를 위한 starter
spring-boot-starter-data-cassandra-reactive Cassandra 분산 데이터베이스와 Spring Data Cassandra Reactive를 위한 starter
spring-boot-starter-data-couchbase Couchbase 문서-지향 데이터 베이스와 Spring Data Couchbase를 위한 starter
spring-boot-starter-data-couchbase-reactive Couchbase 문서-지향 데이터베이스와 Spring Data Couchbase Reactive를 위한 스타터
spring-boot-starter-data-elasticsearch Elasticsearch 와 분석 엔진과 Spring Data Elasticsearch 를 위한 스타터
spring-boot-starter-data-jdbc Spring Data JDBC를 위한 스타터
spring-boot-starter-data-jpa 하이버네이트와 Spring Data JPA를 위한 스타터
spring-boot-starter-data-ldap Spring Data LDAP를 위한 스타터
spring-boot-starter-data-mongodb 하...식빵...
for 문서-지향 데이터베이스 몽고디비
spring-boot-starter-data-mongodb-reactive MongoDB document-oriented database, Spring Data MongoDB Reactive
spring-boot-starter-data-neo4j Neo4j graph database, Spring Data Neo4j
spring-boot-starter-data-r2dbc Spring Data R2DBC
spring-boot-starter-data-redis Redis key-value data store with Spring Data Redis and the Lettuce client
spring-boot-starter-data-redis-reactive Redis key-value data store with Spring Data Redis reactive and the Lettuce client
spring-boot-starter-data-rest REST 기반 Spring Data repository, Spring Data REST
spring-boot-starter-freemarker MVC 웹 애플리케이션 빌딩을 위해 사용하는 FreeMarker 뷰
spring-boot-starter-graphql Spring GraphQL
spring-boot-starter-groovy-templates MVC web, Groovy Templates views
GG... 못해먹겠다.
spring-boot-starter-hateoas Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS
spring-boot-starter-integration Starter for using Spring Integration
spring-boot-starter-jdbc Starter for using JDBC with the HikariCP connection pool
spring-boot-starter-jersey Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to spring-boot-starter-web
spring-boot-starter-jooq Starter for using jOOQ to access SQL databases with JDBC. An alternative to spring-boot-starter-data-jpa or spring-boot-starter-jdbc
spring-boot-starter-json Starter for reading and writing json
spring-boot-starter-mail Starter for using Java Mail and Spring Framework’s email sending support
spring-boot-starter-mustache Starter for building web applications using Mustache views
spring-boot-starter-oauth2-client Starter for using Spring Security’s OAuth2/OpenID Connect client features
spring-boot-starter-oauth2-resource-server Starter for using Spring Security’s OAuth2 resource server features
spring-boot-starter-quartz Starter for using the Quartz scheduler
spring-boot-starter-rsocket Starter for building RSocket clients and servers
spring-boot-starter-security Starter for using Spring Security
spring-boot-starter-test Starter for testing Spring Boot applications with libraries including JUnit Jupiter, Hamcrest and Mockito
spring-boot-starter-thymeleaf Starter for building MVC web applications using Thymeleaf views
spring-boot-starter-validation Starter for using Java Bean Validation with Hibernate Validator
spring-boot-starter-web Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container
spring-boot-starter-web-services Starter for using Spring Web Services
spring-boot-starter-webflux Starter for building WebFlux applications using Spring Framework’s Reactive Web support
spring-boot-starter-websocket Starter for building WebSocket applications using Spring Framework’s MVC WebSocket support

추가적으로 starter는 생산(Production)용 기능을 추가할 수 있습니다 production ready:

 

Table 2. Spring Boot production startersNameDescription
spring-boot-starter-actuator 모니터링과 관리를 돕는 프로덕션 준비기능인 Spring Boot Actuator를 위한 스타터

 

마지막으로 Spring Boot는 다음 제외하거나 특정한 기능으로 변경할 수 있는 스타터를 포함합니다. 

Table 3. Spring Boot technical startersNameDescription
spring-boot-starter-jetty spring-boot-starter-tomcat을 대체하는 내장 서블릿 컨테이너 Jetty 스타터
spring-boot-starter-log4j2 spring-boot-starter-logging를 대체하는 로깅 스타터
spring-boot-starter-logging 기본 로깅을 지원하는 Logback 스타터
spring-boot-starter-reactor-netty 내장 리액티브 HTTP 서버인 Reactor Netty 스타터
spring-boot-starter-tomcat 내장 서블릿 컨테이너 Tomcat을 사용하기 위한 스타터.
spring-boot-starter-web의 기본 내장 컨테이너로 사용된다.
spring-boot-starter-undertow spring-boot-starter-tomcat를 대체하기 위한 Undertow 내장 서블릿 컨테이너 스타터

 

6.2. Structuring Your Code

Spring Boot는 어떠한 특정 코드 짜임을 필요로 하지 않습니다. 하지만 가장 좋은 방법을 알려드리겠습니다.

6.2.1.  “default” 패키지의 사용

클래스에 패키지 선언이 없으면 그 클래스를 "default" 패키지로 인식합니다. "default" 패키지 사용은 일반적으로 지양하고 피해야 합니다. 스프링 부트 사용함에 있어 @ComponentScan, @ConfigurationPropertiesScan, @EntityScan, or @SpringBootApplication 관련해 특정한 문제를 일으키기 때문입니다.

When a class does not include a package declaration, it is considered to be in the “default package”. The use of the “default package” is generally discouraged and should be avoided. It can cause particular problems for Spring Boot applications that use the  annotations, since every class from every jar is read.

  Java 패키지 네이밍 컨벤션과 com.example.project 같은 제공되는 도메인을 사용하는 것을 추천합니다.

6.2.2. 메인 Application 클래스의 위치에 관해

일반적으로 메인 application 클래스를 Root 패키지 위에 위치하기를 추천합니다. @SpringBootApplication annotation는 대체적으로 메인 클래스에 위치합니다. 그리고 그 클래스를 절대적으로 기본 "search package"로 설정합니다. 예를 들어 JPA application을 사용한다고 가정해보죠. @SpringBootApplication의 패키지 클래스는 @Entity 어노테이션을 탐색합니다. 루트 패키지를 사용하면 오직 당신의 프로젝트에서 컴포넌트 스캔을 적용할 수 있습니다.

  @SpringBootApplicaton 어노테이션을 사용하지 않기를 원하시면, @EnableAutoConfiguration과 @ComponentScan 어노테이션을 따로 정의하여 사용하십시오.

다음 리스트는 일반적인 레이아웃을 보여줍니다:

com
 +- example
     +- myapplication
         +- MyApplication.java
         |
         +- customer
         |   +- Customer.java
         |   +- CustomerController.java
         |   +- CustomerService.java
         |   +- CustomerRepository.java
         |
         +- order
             +- Order.java
             +- OrderController.java
             +- OrderService.java
             +- OrderRepository.java

MyApplication.java 파일은 다음과 같이 @SpringBootApplication를 포함해 메인 메서드를 선언하고 있습니다.

@SpringBootApplication
public class MyApplication {

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

}
 

6.3. 클래스 설정하기

Spring Boot는 Java 기반의 설정을 선호합니다. 비록 SpringApplication은 XML로 사용하지만 우리는 주요 소스는 단일의 @Configuration 클래스를 사용할 것을 추천합니다. 대게 메인 메서드가 정의된 클래스는 @Configuration 클래스로써 좋은 후보자입니다.

  인터넷에 발행된 많은 Spring 예제들이 XML 설정을 사용해왔습니다. 가능하다면 Java 기반의 설정을 균형적으로 사용해볼 것을 추천합니다. Enable* 어노테이션을 검색하는 것이 도움이 될 것입니다.

6.3.1. 추가적인 Configuration 클래스 가져오기

모든 @Configuration 설정들을 하나의 클래스에 작성할 필요 없습니다. @Import 어노테이션을 사용해 추가적인 설정 클래스를 만들 수 있습니다. 대안으로 @ComponentScan 어노테이션을 이용해, 자동으로 모든 Spring @Configuration 컴포넌트를 찾아낼 수 있습니다.

6.3.2. XML Configuration 가져오기

XML 기반 설정을 사용해야만 한다면, 마찬가지로 @Configuration 클래스와 시작하는 것을 추천합니다. 그리고 @ImportResource 어노테이션과 함께 사용해 XML 설정 파일을 불러 올 수 있습니다.