1. 소개

도입 이후 Spring Boot는 Spring 생태계의 핵심 플레이어였습니다. 이 프로젝트는 자동 구성 기능으로 우리 삶을 훨씬 더 쉽게 만듭니다.

이 튜토리얼에서는 면접 중에 나올 수있는 Spring Boot와 관련된 가장 일반적인 질문 중 일부를 다룰 것입니다.

2. 질문

Q1. Spring Boot는 무엇이며 주요 기능은 무엇입니까?

Spring Boot는 본질적으로 Spring Framework 위에 구축 된 신속한 애플리케이션 개발을위한 프레임 워크입니다. 자동 구성 및 임베디드 애플리케이션 서버 지원, 광범위한 문서 및 커뮤니티 지원이 결합 된 Spring Boot는 현재 Java 에코 시스템에서 가장 인기있는 기술 중 하나입니다.

다음은 몇 가지 두드러진 기능입니다.

  • Starters – 이동 중에 관련 의존성을 포함하는 의존성 설명자 세트
  • 자동 구성 – 클래스 경로에 존재하는 의존성을 기반으로 애플리케이션을 자동으로 구성하는 방법
  • 액추에이터 – 모니터링과 같은 생산 준비 기능 확보
  • Security
  • 벌채 반출

Q2. Spring과 Spring Boot의 차이점은 무엇입니까?

Spring Framework는 웹 애플리케이션 개발을 더 쉽게 만드는 여러 기능을 제공합니다. 이러한 기능에는 의존성 주입, 데이터 바인딩, 측면 지향 프로그래밍, 데이터 액세스 등이 포함됩니다.

수년에 걸쳐 Spring은 점점 더 복잡해지고 있으며 이러한 애플리케이션에 필요한 구성의 양은 위협적 일 수 있습니다. 이것이 Spring Boot가 유용한 곳입니다. Spring 애플리케이션을 쉽게 구성 할 수 있습니다.

본질적으로 Spring은 의견 이없는 반면 Spring Boot는 플랫폼과 라이브러리에 대한 독단적 인 관점을 취하므로 빠르게 시작할 수 있습니다.

Spring Boot가 제공하는 가장 중요한 두 가지 이점은 다음과 같습니다.

  • 클래스 경로에서 찾은 아티팩트를 기반으로 애플리케이션 자동 구성
  • Security 또는 상태 확인과 같이 프로덕션 애플리케이션에 공통적 인 비 기능적 기능 제공

vanilla Spring과 Spring Boot 간의 자세한 비교는 다른 튜토리얼 중 하나를 확인하십시오 .

Q3. Maven으로 Spring Boot 애플리케이션을 어떻게 설정할 수 있습니까?

다른 라이브러리와 마찬가지로 Maven 프로젝트에 Spring Boot를 포함 할 수 있습니다. 그러나 가장 좋은 방법은 spring-boot-starter-parent 프로젝트 에서 상속 하고 Spring Boot starters에 대한 의존성을 선언하는 것 입니다. 이렇게하면 프로젝트가 Spring Boot의 기본 설정을 재사용 할 수 있습니다.

spring-boot-starter-parent 프로젝트를 상속하는 것은 간단합니다 . pom.xml에 부모 요소 만 지정하면 됩니다 .

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.0.RELEASE</version>
</parent>

Maven Central 에서 spring-boot-starter-parent 의 최신 버전을 찾을 수 있습니다  .

시작 상위 프로젝트를 사용하는 것은 편리하지만 항상 가능한 것은 아닙니다. 예를 들어, 우리 회사가 모든 프로젝트가 표준 POM에서 상속하도록 요구하는 경우에도 사용자 정의 부모를 사용하여 Spring Boot의 의존성 관리의 이점을 누릴 수 있습니다 .

Q4. Spring Initializr는 무엇입니까?

Spring Initializr는 Spring Boot 프로젝트를 생성하는 편리한 방법입니다.

Spring Initializr 사이트 로 이동하여 의존성 관리 도구 (Maven 또는 Gradle), 언어 (Java, Kotlin 또는 Groovy), 패키징 체계 (Jar 또는 War), 버전 및 의존성을 선택하고 프로젝트를 다운로드 할 수 있습니다.

이를 통해 골격 프로젝트가 생성 되고 설정 시간이 절약되므로 비즈니스 로직 추가에 집중할 수 있습니다.

IDE의 새 프로젝트 마법사 (예 : STS 또는 STS 플러그인이있는 Eclipse)를 사용하여 Spring Boot 프로젝트를 만드는 경우에도 내부적으로 Spring Initializr를 사용합니다.

Q5. 어떤 스프링 부트 스타터를 사용할 수 있습니까?

각 스타터는 우리가 필요로하는 모든 Spring 기술에 대한 원 스톱 숍 역할을합니다. 그런 다음 다른 필수 의존성을 전 이적으로 가져와 일관된 방식으로 관리합니다.

모든 스타터는 org.springframework.boot 그룹에 있으며 이름은 spring-boot-starter-로 시작 합니다. 이 이름 지정 패턴을 사용하면 특히 이름으로 의존성 검색을 지원하는 IDE로 작업 할 때 스타터를 쉽게 찾을 수 있습니다.

이 글을 쓰는 시점에 우리가 처분 할 수있는 선발자는 50 개가 넘습니다. 가장 일반적으로 사용되는 것은 다음과 같습니다.

  • spring-boot-starter :  자동 구성 지원, 로깅 및 YAML을 포함한 핵심 스타터
  • spring-boot-starter-aop :  Spring AOP 및 AspectJ를 사용한 aspect 지향 프로그래밍을위한 스타터
  • spring-boot-starter-data-jpa :  Hibernate에서 SpringData JPA를 사용하기위한 시작
  • spring-boot-starter-security :  Spring Security 사용을위한 스타터
  • spring-boot-starter-test :  스프링 부트 애플리케이션 테스트를위한 스타터
  • spring-boot-starter-web :  RESTful을 포함한 웹 구축을위한 스타터, Spring MVC를 사용하는 애플리케이션

전체 시작 List은 이 저장소 를 참조하십시오 .

Spring Boot 스타터에 대한 자세한 내용은 Intro to Spring Boot Starters를 참조하십시오 .

Q6. 특정 자동 구성을 비활성화하는 방법?

특정 자동 구성을 비활성화 하려면 @EnableAutoConfiguration 어노테이션 exclude 속성을 사용하여 표시 할 수 있습니다 . 예를 들어이 코드 조각은 DataSourceAutoConfiguration을 무력화합니다 .

// other annotations
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }

우리가 가진 자동 구성을 사용하는 경우 @SpringBootApplication의 이 - 어노테이션 @EnableAutoConfiguration을 메타 어노테이션로를 - 우리가 할 수 같은 이름의 속성을 비활성화 자동 설정 :

// other annotations
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }

spring.autoconfigure.exclude 환경 속성을 사용하여 자동 구성을 비활성화 할 수도 있습니다. application.properties 파일 의이 설정은 이전과 동일한 작업을 수행합니다.

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Q7. 사용자 지정 자동 구성을 등록하는 방법은 무엇입니까?

자동 구성 클래스를 등록하려면 META-INF / spring.factories 파일 EnableAutoConfiguration아래에 정규화 된 이름이 나열되어 있어야 합니다.

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfigure.CustomAutoConfiguration

Maven으로 프로젝트를 빌드하는 경우 해당 파일은 resources / META-INF 디렉토리에 배치되어야하며 , 패키지 단계 에서 언급 된 위치에있게됩니다 .

Q8. Bean이 존재할 때 자동 구성을 취소하는 방법은 무엇입니까?

빈이 이미 존재하는 경우 자동 구성 클래스가 백 오프하도록 지시하려면 @ConditionalOnMissingBean 어노테이션을 사용할 수 있습니다  . 이 어노테이션의 가장 눈에 띄는 속성은 다음과 같습니다.

  • value : 확인할 빈의 종류
  • name : 확인할 빈의 이름

@Bean으로 장식 된 메소드에 배치 될 때 대상 유형은 메소드의 리턴 유형으로 기본 설정됩니다.

@Configuration
public class CustomConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public CustomService service() { ... }
}

Q9. Spring Boot 웹 애플리케이션을 Jar 및 War 파일로 배포하는 방법은 무엇입니까?

전통적으로 우리는 웹 애플리케이션을 WAR 파일로 패키징 한 다음 외부 서버에 배포합니다. 이렇게하면 동일한 서버에서 여러 응용 프로그램을 정렬 할 수 있습니다. CPU와 메모리가 부족했던시기에 이것은 리소스를 절약 할 수있는 좋은 방법이었습니다.

그러나 상황이 바뀌 었습니다. 컴퓨터 하드웨어는 현재 상당히 저렴하며 서버 구성에 관심이 집중되었습니다. 배포 중에 서버를 구성하는 작은 실수는 치명적인 결과를 초래할 수 있습니다.

Spring 은 웹 애플리케이션을 실행 가능한 JAR로 패키징하는 플러그인, 즉 spring-boot-maven-plugin 을 제공하여이 문제를 해결합니다 . 이 플러그인을 포함하려면 pom.xml에 플러그인 요소를 추가하면 됩니다 .

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

이 플러그인을 사용하면 패키지 단계를 실행 한 후 fat JAR을 얻을 수  있습니다. 이 JAR에는 임베디드 서버를 포함하여 필요한 모든 의존성이 포함되어 있습니다. 따라서 더 이상 외부 서버 구성에 대해 걱정할 필요가 없습니다.

그런 다음 일반적인 실행 가능한 JAR처럼 애플리케이션을 실행할 수 있습니다.

 JAR 파일을 빌드 하려면 pom.xml 파일 패키징 요소 jar설정해야  합니다.

<packaging>jar</packaging>

이 요소를 포함하지 않으면 기본적으로 jar로 설정 됩니다.

WAR 파일을 빌드하려면 패키징  요소를 war로 변경하십시오 .

<packaging>war</packaging>

그리고 패키지 파일에서 컨테이너 의존성을 유지하십시오.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

Maven 패키지 단계를 실행하면 배포 가능한 WAR 파일이 생성됩니다.

Q10. 명령 줄 애플리케이션에 Spring Boot를 사용하는 방법?

다른 Java 프로그램과 마찬가지로 Spring Boot 명령 줄 애플리케이션에는 기본 메서드 가 있어야합니다  . 이 메소드는 애플리케이션을 부트 스트랩하기 위해 SpringApplication # run 메소드를 호출하는 진입 점 역할을합니다 .

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class);
        // other statements
    }
}

SpringApplication의 클래스는 Spring 컨테이너 및 자동 구성합니다 Bean을 발생합니다.

기본 구성 소스로 작동 하려면 구성 클래스를 run 메서드에 전달해야합니다 . 관례 상이 인수는 엔트리 클래스 자체입니다.

run 메소드를 호출 한 후 일반 프로그램에서와 같이 다른 명령문을 실행할 수 있습니다.

Q11. 외부 구성의 가능한 소스는 무엇입니까?

Spring Boot는 외부 구성을 지원하므로 다양한 환경에서 동일한 애플리케이션을 실행할 수 있습니다. 속성 파일, YAML 파일, 환경 변수, 시스템 속성 및 명령 줄 옵션 인수를 사용하여 구성 속성을 지정할 수 있습니다.

그런 다음 @Value 어노테이션, @ConfigurationProperties 어노테이션을 통해 바인딩 된 객체 또는 환경 추상화를 사용하여 이러한 속성에 액세스 할 수 있습니다 .

Q12. Spring Boot가 완화 된 바인딩을 지원한다는 것은 무엇을 의미합니까?

Spring Boot의 완화 된 바인딩 은 구성 속성의 유형 안전 바인딩에 적용 할 수 있습니다 .

완화 된 바인딩을 사용하면 속성 키가 속성 이름과 정확히 일치 할 필요가 없습니다. 이러한 환경 속성은 camelCase, kebab-case, snake_case 또는 밑줄로 구분 된 단어와 함께 대문자로 작성 될 수 있습니다.

예를 들어 @ConfigurationProperties 어노테이션이 있는 Bean 클래스의 특성 이름이 myProp 인 경우 myProp , my-prop , my_prop 또는 MY_PROP 와 같은 환경 특성에 바인딩 될 수 있습니다 .

Q13. Spring Boot Devtools무엇사용됩니까?

Spring Boot Developer Tools 또는 DevTools는 개발 프로세스를 더 쉽게 만들어주는 도구 모음입니다. 이러한 개발 시간 기능을 포함하려면 pom.xml 파일에 의존성을 추가하기 만하면 됩니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

스프링 부팅 DevTools로의 모듈은 자동으로 생산에 응용 프로그램이 실행되는 경우 사용할 수 없습니다. 아카이브 재 패키징은 기본적으로이 모듈도 제외합니다. 따라서 최종 제품에 오버 헤드가 발생하지 않습니다.

기본적으로 DevTools는 개발 환경에 적합한 속성을 적용합니다. 이러한 속성은 템플릿 캐싱을 비활성화하고 웹 그룹에 대한 디버그 로깅을 활성화하는 등의 작업을 수행합니다. 결과적으로 속성을 설정하지 않고도이 합리적인 개발 시간 구성을 갖게됩니다.

DevTools를 사용하는 애플리케이션은 클래스 경로의 파일이 변경 될 때마다 다시 시작됩니다. 이것은 수정에 대한 빠른 피드백을 제공하므로 개발에 매우 ​​유용한 기능입니다.

기본적으로보기 템플릿을 포함한 정적 리소스는 재시작을 설정하지 않습니다. 대신 리소스 변경으로 인해 브라우저 새로 고침이 트리거됩니다. 이는 DevTools에 포함 된 내장 된 LiveReload 서버와 상호 작용하기 위해 브라우저에 LiveReload 확장이 설치된 경우에만 발생할 수 있습니다.

이 주제에 대한 자세한 내용 은 Spring Boot DevTools 개요 를 참조하세요 .

Q14. 통합 테스트를 작성하는 방법?

Spring 애플리케이션에 대한 통합 테스트를 실행할 때 ApplicationContext 가 있어야합니다 .

우리의 삶을 더 쉽게 만들기 위해 Spring Boot는 테스트를위한 특별한 어노테이션을 제공합니다 –  @SpringBootTest . 이 어노테이션은 해당 클래스 속성으로 표시된 구성 클래스에서 ApplicationContext작성 합니다.

경우에 클래스 속성은 기본 구성 클래스, Spring 부트 검색 설정되어 있지 않습니다. 검색은 @SpringBootApplication 또는 @SpringBootConfiguration 어노테이션이 달린 클래스를 찾을 때까지 테스트가 포함 된 패키지에서 시작됩니다 .

자세한 지침 은 Spring Boot 에서의 테스트에 대한 자습서를 확인하십시오 .

Q15 . 스프링 부트 액추에이터는 무엇에 사용됩니까?

기본적으로 Actuator는 프로덕션 준비 기능을 활성화하여 Spring Boot 애플리케이션에 생명을 불어 넣습니다. 이러한 기능을 통해 애플리케이션이 프로덕션 환경에서 실행될 때 모니터링하고 관리 할 수 있습니다.

Spring Boot Actuator를 프로젝트에 통합하는 것은 매우 간단합니다. 우리가해야 할 일은  pom.xml 파일 spring-boot-starter-actuator 스타터를 포함하는 것입니다 :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Spring Boot Actuator는 HTTP 또는 JMX 엔드 포인트를 사용하여 운영 정보를 노출 할 수 있습니다. 하지만 대부분의 애플리케이션은 HTTP를 사용하며, 여기서 엔드 포인트의 ID와 / actuator 접두사는 URL 경로를 형성합니다.

다음은 Actuator가 제공하는 가장 일반적인 내장 엔드 포인트 중 일부입니다.

  • env :  환경 속성을 노출합니다.
  • health :  애플리케이션 상태 정보를 표시합니다.
  • httptrace :  HTTP 추적 정보를 표시합니다.
  • info :  랜덤의 애플리케이션 정보를 표시합니다.
  • 메트릭 :  메트릭 정보를 표시합니다.
  • 로거 :  애플리케이션에서 로거 구성을 표시하고 수정합니다.
  • mappings :  모든 @RequestMapping 경로 List을 표시 합니다.

자세한 내용은 Spring Boot Actuator 튜토리얼참조하십시오 .

Q16. 속성 또는 YAML을 사용하여 스프링 부트 프로젝트를 구성하는 더 좋은 방법은 무엇입니까?

YAML은 다음과 같은 속성 파일에 비해 많은 이점을 제공합니다.

  • 더 명확하고 더 나은 가독성
  • 더 좋고 더 읽기 쉬운 형식으로 표현되는 계층 적 구성 데이터에 적합합니다.
  • 맵, List 및 스칼라 유형 지원
  • 동일한 파일에 여러 프로필포함 할 수 있습니다 (Spring Boot 2.4.0부터 속성 파일에도 가능).

그러나 들여 쓰기 규칙으로 인해 작성하는 것이 약간 어렵고 오류가 발생하기 쉽습니다.

자세한 내용과 작업 샘플은 Spring YAML 대 속성 자습서 를 참조하세요 .

Q17. Spring Boot가 제공하는 기본 어노테이션은 무엇입니까?

Spring Boot가 제공하는 기본 어노테이션은 org.springframework.boot.autoconfigure 및 하위 패키지에 있습니다. 다음은 몇 가지 기본 사항입니다.

  • @EnableAutoConfiguration – Spring Boot가 클래스 경로에서 자동 구성 Bean을 찾고 자동으로 적용하도록합니다.
  • @SpringBootApplication – 부팅 응용 프로그램의 기본 클래스를 나타내는 데 사용됩니다. 이 어노테이션은 @Configuration@EnableAutoConfiguration@ComponentScan 어노테이션을 기본 속성 과  결합 합니다.

Spring Boot Annotations 는 주제에 대한 더 많은 통찰력을 제공합니다.

Q18. Spring Boot에서 기본 포트를 어떻게 변경할 수 있습니까?

다음 방법 중 하나를 사용하여 Spring Boot에 포함 된 서버의 기본 포트를 변경할있습니다 .

  • 속성 파일 사용 – server.port 속성을 사용하여 application.properties (또는 application.yml ) 파일 에서이를 정의 할 수 있습니다.
  • 프로그래밍 방식 – 기본 @SpringBootApplication 클래스 에서 SpringApplication 인스턴스 server.port설정할 수 있습니다.
  • 명령 줄 사용-응용 프로그램을 jar 파일로 실행할 때 server.port를 java 명령 인수로 설정할 수 있습니다.
    java -jar -Dserver.port=8081 myspringproject.jar
    

Q19. Spring Boot는 어떤 임베디드 서버를 지원하며 기본값을 변경하는 방법은 무엇입니까?

현재 Spring MVC는 Tomcat, Jetty 및 Undertow를 지원합니다 . Tomcat은 Spring Boot의 스타터 에서 지원하는 기본 애플리케이션 서버 입니다.

Spring WebFlux는 Reactor Netty를 기본으로 사용하여 Reactor Netty , Tomcat, Jetty 및 Undertow지원합니다 .

Spring MVC에서 기본값을 변경하려면 Jetty에 대해 가정 해 보겠습니다. Tomcat을 제외하고 의존성에 Jetty를 포함해야합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

마찬가지로 WebFlux의 기본값을 UnderTow로 변경하려면 Reactor Netty를 제외하고 UnderTow를 의존성에 포함해야합니다.

“Comparing embedded servlet contains in Spring Boot” 에는 Spring MVC와 함께 사용할 수있는 다양한 임베디드 서버에 대한 자세한 내용이 포함되어 있습니다.

Q20. 왜 스프링 프로필이 필요한가요?

기업용 애플리케이션을 개발할 때 일반적으로 Dev, QA 및 Prod와 같은 여러 환경을 처리합니다. 이러한 환경의 구성 속성은 다릅니다.

예를 들어, Dev 용으로 내장 된 H2 데이터베이스를 사용할 수 있지만 Prod는 독점 Oracle 또는 DB2를 가질 수 있습니다. DBMS가 환경 전반에 걸쳐 동일하더라도 URL은 분명히 다를 것입니다.

이를 쉽고 깔끔하게 만들기 위해 Spring은 각 환경에 대한 구성을 분리하는 데 도움이되는 프로파일을 제공합니다 . 이를 프로그래밍 방식으로 유지하는 대신 속성을 application-dev 와 같은 별도의 파일에 보관할 수 있습니다 . 속성응용 제품. 속성 . 기본 application.propertie는 spring을 사용하는 현재 활성 프로필을 가리 킵니다 . 프로필 . 올바른 구성이 선택되도록 활성화 됩니다.

Spring Profiles 는이 주제에 대한 포괄적 인보기를 제공합니다.

3. 결론

이 튜토리얼에서는 기술 인터뷰에서 직면 할 수있는 Spring Boot에 대한 가장 중요한 몇 가지 질문을 살펴 보았습니다. 그들이 꿈의 직업을 얻는 데 도움이되기를 바랍니다.