Spring Boot 인터뷰 질문

1. 소개

도입 이후 Spring Boot는 Spring 생태계에서 핵심적인 역할을 해왔습니다. 이 프로젝트는 자동 구성 기능으로 우리 삶을 훨씬 더 쉽게 만듭니다.

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

2. 질문

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

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

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

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

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

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

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

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

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

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

vanilla Spring과 Spring Boot를 자세히 비교하려면 다른 튜토리얼 중 하나를 확인하십시오.

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

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

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

 org.springframework.boot spring-boot-starter-parent 2.3.0.RELEASE 

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를 사용하는 애플리케이션

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

Spring Boot 스타터에 대한 자세한 정보는 Intro to Spring Boot Starters를 참조하십시오.

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

If we want to disable a specific auto-configuration, we can indicate it using the exclude attribute of the @EnableAutoConfiguration annotation. For instance, this code snippet neutralizes DataSourceAutoConfiguration:

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

If we enabled auto-configuration with the @SpringBootApplication annotation — which has @EnableAutoConfiguration as a meta-annotation — we could disable auto-configuration with an attribute of the same name:

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

We can also disable an auto-configuration with the spring.autoconfigure.exclude environment property. This setting in the application.properties file does the same thing as before:

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

Q7. How to Register a Custom Auto-Configuration?

To register an auto-configuration class, we must have its fully-qualified name listed under the EnableAutoConfiguration key in the META-INF/spring.factories file:

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

If we build a project with Maven, that file should be placed in the resources/META-INF directory, which will end up in the mentioned location during the package phase.

Q8. How to Tell an Auto-Configuration to Back Away When a Bean Exists?

To instruct an auto-configuration class to back off when a bean is already existent, we can use the @ConditionalOnMissingBean annotation. The most noticeable attributes of this annotation are:

  • value: The types of beans to be checked
  • name: The names of beans to be checked

When placed on a method adorned with @Bean, the target type defaults to the method's return type:

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

Q9. How to Deploy Spring Boot Web Applications as Jar and War Files?

Traditionally, we package a web application as a WAR file, then deploy it into an external server. Doing this allows us to arrange multiple applications on the same server. During the time that CPU and memory were scarce, this was a great way to save resources.

However, things have changed. Computer hardware is fairly cheap now, and the attention has turned to server configuration. A small mistake in configuring the server during deployment may lead to catastrophic consequences.

Spring tackles this problem by providing a plugin, namely spring-boot-maven-plugin, to package a web application as an executable JAR. To include this plugin, just add a plugin element to pom.xml:

 org.springframework.boot spring-boot-maven-plugin 

With this plugin in place, we'll get a fat JAR after executing the package phase. This JAR contains all the necessary dependencies, including an embedded server. Thus, we no longer need to worry about configuring an external server.

We can then run the application just like we would an ordinary executable JAR.

Notice that the packaging element in the pom.xml file must be set to jar to build a JAR file:

jar

If we don't include this element, it also defaults to jar.

In case we want to build a WAR file, change the packaging element to war:

war

And leave the container dependency off the packaged file:

 org.springframework.boot spring-boot-starter-tomcat provided 

After executing the Maven package phase, we'll have a deployable WAR file.

Q10. How to Use Spring Boot for Command Line Applications?

Just like any other Java program, a Spring Boot command line application must have a main method. This method serves as an entry point, which invokes the SpringApplication#run method to bootstrap the application:

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

The SpringApplication class then fires up a Spring container and auto-configures beans.

Notice we must pass a configuration class to the run method to work as the primary configuration source. By convention, this argument is the entry class itself.

After calling the run method, we can execute other statements as in a regular program.

Q11. What Are Possible Sources of External Configuration?

Spring Boot provides support for external configuration, allowing us to run the same application in various environments. We can use properties files, YAML files, environment variables, system properties, and command-line option arguments to specify configuration properties.

We can then gain access to those properties using the @Value annotation, a bound object via the @ConfigurationProperties annotation, or the Environment abstraction.

Q12. What Does it Mean that Spring Boot Supports Relaxed Binding?

Relaxed binding in Spring Boot is applicable to the type-safe binding of configuration properties.

With relaxed binding, the key of a property doesn't need to be an exact match of a property name. Such an environment property can be written in camelCase, kebab-case, snake_case, or in uppercase with words separated by underscores.

For example, if a property in a bean class with the @ConfigurationProperties annotation is named myProp, it can be bound to any of these environment properties: myProp, my-prop, my_prop, or MY_PROP.

Q13. What is Spring Boot Devtools Used For?

Spring Boot Developer Tools, or DevTools, is a set of tools making the development process easier. To include these development-time features, we just need to add a dependency to the pom.xml file:

 org.springframework.boot spring-boot-devtools 

The spring-boot-devtools module is automatically disabled if the application runs in production. The repackaging of archives also excludes this module by default. Hence, it won't bring any overhead to our final product.

By default, DevTools applies properties suitable to a development environment. These properties disable template caching, enable debug logging for the web group, and so on. As a result, we have this sensible development-time configuration without setting any properties.

Applications using DevTools restart whenever a file on the classpath changes. This is a very helpful feature in development, as it gives quick feedback for modifications.

By default, static resources, including view templates, don't set off a restart. Instead, a resource change triggers a browser refresh. Notice this can only happen if the LiveReload extension is installed in the browser to interact with the embedded LiveReload server that DevTools contains.

For further information on this topic, please see Overview of Spring Boot DevTools.

Q14. How to Write Integration Tests?

When running integration tests for a Spring application, we must have an ApplicationContext.

To make our life easier, Spring Boot provides a special annotation for testing – @SpringBootTest. This annotation creates an ApplicationContext from configuration classes indicated by its classes attribute.

In case the classes attribute isn't set, Spring Boot searches for the primary configuration class. The search starts from the package containing the test up until it finds a class annotated with @SpringBootApplication or @SpringBootConfiguration.

For detailed instructions, check out our tutorial on testing in Spring Boot.

Q15. What Is Spring Boot Actuator Used For?

Essentially, Actuator brings Spring Boot applications to life by enabling production-ready features. These features allow us to monitor and manage applications when they're running in production.

Integrating Spring Boot Actuator into a project is very simple. All we need to do is to include the spring-boot-starter-actuator starter in the pom.xml file:

 org.springframework.boot spring-boot-starter-actuator 

Spring Boot Actuator can expose operational information using either HTTP or JMX endpoints. Most applications go for HTTP, though, where the identity of an endpoint and the /actuator prefix form a URL path.

Here are some of the most common built-in endpoints Actuator provides:

  • env: Exposes environment properties
  • health: Shows application health information
  • httptrace: Displays HTTP trace information
  • info: Displays arbitrary application information
  • metrics: Shows metrics information
  • loggers: Shows and modifies the configuration of loggers in the application
  • mappings: Displays a list of all @RequestMapping paths

Please refer to our Spring Boot Actuator tutorial for a detailed rundown.

Q16. Which Is a Better Way to Configure a Spring Boot Project – Using Properties or YAML?

YAML offers many advantages over properties files, such as:

  • More clarity and better readability
  • Perfect for hierarchical configuration data, which is also represented in a better, more readable format
  • Support for maps, lists, and scalar types
  • Can include several profiles in the same file

However, writing it can be a little difficult and error-prone due to its indentation rules.

For details and working samples, please refer to our Spring YAML vs Properties tutorial.

Q17. What Are the Basic Annotations that Spring Boot Offers?

The primary annotations that Spring Boot offers reside in its org.springframework.boot.autoconfigure and its sub-packages. Here are a couple of basic ones:

  • @EnableAutoConfiguration – to make Spring Boot look for auto-configuration beans on its classpath and automatically apply them.
  • @SpringBootApplication – used to denote the main class of a Boot Application. This annotation combines @Configuration, @EnableAutoConfiguration, and @ComponentScan annotations with their default attributes.

Spring Boot Annotations offers more insight into the subject.

Q18. How Can You Change the Default Port in Spring Boot?

We can change the default port of a server embedded in Spring Boot using one of these ways:

  • using a properties file – we can define this in an application.properties (or application.yml) file using the property server.port
  • programmatically – in our main @SpringBootApplication class, we can set the server.port on the SpringApplication instance
  • using the command line – when running the application as a jar file, we can set the server.port as a java command argument:
    java -jar -Dserver.port=8081 myspringproject.jar 

Q19. Which Embedded Servers does Spring Boot Support, and How to Change the Default?

As of date, Spring MVC supports Tomcat, Jetty, and Undertow. Tomcat is the default application server supported by Spring Boot's web starter.

Spring WebFlux supports Reactor Netty, Tomcat, Jetty, and Undertow with Reactor Netty as default.

In Spring MVC, to change the default, let's say to Jetty, we need to exclude Tomcat and include Jetty in the dependencies:

 org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-tomcat     org.springframework.boot spring-boot-starter-jetty 

Similarly, to change the default in WebFlux to UnderTow, we need to exclude Reactor Netty and include UnderTow in the dependencies.

“Comparing embedded servlet contains in Spring Boot” contains more details on the different embedded servers we can use with Spring MVC.

Q20. Why Do We Need Spring Profiles?

When developing applications for the enterprise, we typically deal with multiple environments such as Dev, QA, and Prod. The configuration properties for these environments are different.

For example, we might be using an embedded H2 database for Dev, but Prod could have the proprietary Oracle or DB2. Even if the DBMS is the same across environments, the URLs would definitely be different.

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

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

3. 결론

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