Spring

[배워서 바로 쓰는 스프링 부트2] 1.1 스프링 부트의 기초

nineDeveloper 2020. 9. 5. 21:33
728x90

1.1 스프링 부트의 기초

  • 스타터: 의존관계(dependency)를 간단하게 정의하는 모듈
  • 빌드 도구: 버전 해결 등 개발을 효율화하는 플러그인
  • 구성 클래스: XML이 아닌 애너테이션과 자바로 설정을 작성
  • 자동 구성: 디폴트 구성이 적용되며 필요한 부분만 설정하면 됨
  • 메인 애플리케이션 클래스: 자바 명령으로 내장된 톰캣을 실행
  • 설정 파일: 속성을 외부 파일에 정의할 수 있으며 동작 사용을 쉽게 변경할 수 있음

빌드도구

  • 그레이들은 스크립트를 작성하는 빌드 도구이므로 아파치 앤트처럼 작업을 자유롭게 작성할 수 있다
  • 멀티 프로젝트를 구성할 때 하위 프로젝트에 대해 일괄로 설정하고 필요에 따라 개별적으로 설정할 수 있어 스크립트의 작성량이 메이븐보다 적다
  • 메이븐은 특수한 처리가 필요할 때 독자적인 플러그인으로 구현해야 하지만 그레이들은 스크립트를 작성하는 것만으로도 대응 가능하다

메이븐

부모 프로젝트 지정

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
    <type>pom</type>
</dependency>

자바 컴파일러 준수 레벨의 디폴트값은 1.8 버전 11로 변경하려면 아래와 같이 지정

<properties>
  <java.version>11</java.version>
</properties>

그레이들

스프링 부트 2.0.x는 그레이들 4.0이상을 지원

표준 그레이들 빌드 스크립트
  1. spirng-boot-gradle-plugin을 빌드 스크립트의 의존관계에 추가
  2. spring-boot-gradle-plugindependency-management 플러그인 이용을 선언
  3. 자바 컴파일러 준수 레벨을 디폴트값 1.8에서 11로 변경
  4. 문자 코드로 UTF-8을 지정
  5. 스타터를 애플리케이션의 의존관계에 추가
  6. 테스트용 스타터를 애플리케이션의 의존관게에 추가
buildscript {
    ext {
        springBootVersion = "2.0.6.RELEASE"
        groovyVersion = "2.5.3"
    }
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        // 1. `spirng-boot-gradle-plugin`을 빌드 스크립트의 의존관계에 추가
        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
    }
}

apply plugin: "java"
// 2. `spring-boot-gradle-plugin` 플러그인 이용을 선언
apply plugin: "org.springframework.boot"
// 2. dependency-management 플러그인 이용을 선언
apply plugin: "io.spring.dependency-management" // 2

// 3. 자바 컴파일러 준수 레벨을 디폴트값 1.8에서 11로 변경
sourceCompatibility = 11
// 3. 자바 컴파일러 준수 레벨을 디폴트값 1.8에서 11로 변경
targetCompatibility = 11
// 4. 문자 코드로 UTF-8을 지정
[compileJava, compileTestJava, compileGroovy, compileTestGroovy]*.options*.encoding = "UTF-8"

repositories {
    jcenter()
}

dependencyManagement {
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}

dependencies {
  // 5. 스타터를 애플리케이션의 의존관계에 추가
  compile "org.springframework.boot:spring-boot-starter-thymeleaf"
  // 6. 테스트용 스타터를 애플리케이션의 의존관게에 추가
  testCompile "org.springframework.boot:spring-boot-starter-test"
}

의존관계 관리

의존 라이브러리의 버전 덮어쓰기(build.gradle)

ext["groovy.version"] = groovyVersion

ext는 그레이들의 확장속성

확장 속성에 각 라이브러리 버전이 설정되어 있어 사용할 라이브러리의 버전을 변경하려면 버전값을 덮어 써야 함

구성 클래스

XML로 구성하기
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.sample.web" />

    <mvc:annotation-driven />
    <mvc:resources mapping="/static/**" location="/WEB-INF/static/" />

</beans>
JavaConfig로 구성하기
// 디폴트 설정을 위해 아무것도 설정하지 않는다
@Configuration
public class ApplicationConfig implements WebMvcConfigurer {

}

@SpringBootApplication(scanBasePackages = { "com.sample.web" })
public class Application {

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

자동 구성

자동 구성을 사용하려면 @EnableAutoConfiguration 또는 @SpringBootApplication 애너테이션을 부여
현재 어떤 자동 구성이 적용되었는지 알고 싶다면 인수어 --debug를 지정해 애플리케이션을 실행하면 자동 구성 보고서가 콘솔에 출력됨

특정 자동 구성을 비활성화하려면 exclude 속성으로 제외

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc;
import org.springframework.context.annotation.*;

@Configuration
// DataSourceAutoConfiguration 자동 구성 비활성화
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {
}

메인 애플리케이션 클래스

메인 애플리케이션 클래스

@SpringBootApplication@EnableAutoConfiguration@ComponentScan의 속성을 포함하고 있음

package com.sample.web;

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

import com.sample.ComponentScanBasePackage; // 상위 패키지를 스캔의 기준으로 한다

// @Configuration, @EnableAutoConfiguration, @ComponentScan을 지정한 것과 동일
@SpringBootApplication(scanBasePackageClasses = {ComponentScanBasePackage.class })
@RestController // 원래 컨트롤러에 작성할 애너테이션
public class Application {

    @RequestMapping("/") // 원래 컨트롤러에 작성할 메서드
    public String hello() {
        return "Hello World";
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
컴포넌트 스캔의 기준이 되는 패키지 지정하기
package com.sample;

/**
 * 컴포넌트 스캔용으로 basePackages를 설정한다
 */
public class ComponentScanBasePackage {
}

설정 파일

애플리케이션 실행 시 다음 위치에 있는 application.properties 설정 파일을 읽어 들임

  1. 현재 디렉터리의 /config 서브 디렉터리
  2. 현재 디렉터리
  3. 클래스 경로의 /config 패키지
  4. 클래스 경로의 루트

환경 설정 별로 나누고 싶은 경우에는 application-{profile}.properties의 명명 규칙으로 설정파일을 만듬
프로파일별 설정은 application.properties 설정을 덮어씀

속성 형식 설정

foo.remote-address=192.168.1.1
foo.security.username=admin

YAML 형식 설정

foo:
  remote-address: 192.168.1.1
  security:
    username: admin
@ConfigurationProperties를 사용하여 프로그램에서 설정값 이용하기
@Component
@ConfigurationProperties(prefix="foo")
@Validated
public class SomePojo {

  @NotNull
  InetAddress remoteAddress;

  @Valid
  Security security = new Security();

  public static class Security {

    @NotEmpty
    String username;

    // 게터(getters)와 세터(setters)
  }
}

@Validated 애너테이션을 작성하면 빈 검증(bean Validation)으로 속성값을 체크

@ConfigurationProperties 애너테이션을 이용하면 클래스의 변수와 설정 파일의 키가 정확히 일치하지 않아도 느슨하게 바인딩 됨

  • foo.remoteAddress
  • foo.remote-address
  • foo.remote_address
  • FOO_REMOTE_ADDRESS
@Value를 사용하여 프로그램에서 설정값 사용하기
@Component
public class SomePojo {

  @Value("${foo.remote-address}")
  String remoteAddress;

  @Value("${foo.security.username}")
  String securityUsername;
}

설정값 전달하기

환경 변수로 설정값 전달하기

$ SPRING_APPLICATION_JSON='{"acme":{"name":"test"}}' java -jar myapp.jar

시스템 속성으로 설정값 전달하기

$ java -Dspring.application.json='{"name":"test"}' - jar myapp.jar

명령줄 인수로 설정값 전달하기

$ java -jar myapp.jar --spring.application.json='{"name":"test"}'

애플리케이션 실행하기

인텔리제이에서 실행시 인수를 전달하고 싶다면 Run Configuration에서 설정

배치 작업명을 인수로 전달하기(build.gradle)
project(":sample-batch") {
  bootRun {
    // 프로젝트 속성을 인수로 건넨다
    if (project.hasProperty("args")) {
      args project.args.split("\\s+")
    }
  }

  dependencies {
    ...
  }
}
728x90