Spring Boot Application 첫 구축하기

2024. 4. 2. 03:30Spring Boot/Common

반응형

들어가며

Spring은 Java 기반의 오픈 소스 프레임워크이다.

Spring의 핵심 모듈은 ‘Spring Core’로, Spring의 핵심 기능인 의존성 주입(Dependency Injection), 제어 역전(Inversion of Control)을 제공한다.

또한 Spring Core는 다음과 같은 부가 기능을 제공한다.

  • Validation
  • Type Conversion
  • Consistent Messaging

첫 Spring Boot Application 구축하기

무엇을 구축하게 되는가

Spring Boot를 사용하여 간단한 웹 어플리케이션을 만들고 서비스를 제공한다.

필요한 것

  • IDE (본 포스팅에서는 Intelij IDEA)
  • Java 17 이상 (본 포스팅에서는 Java 17 corretto)
  • Gradle 7.5 이상 또는 Maven 3.5 이상 (본 포스팅은 Gradle)

Spring Initializer

IDE의 Spring Initializer 또는 https://start.spring.io 를 이용한다.

필요한 의존성(Dependency)은 Spring Web이다.

Spring Web은 Spring MVC, Apache Tomcat 등을 사용하여 웹 어플리케이션을 만들 수 있도록 지원하는 Spring 하위 프레임워크이다.

[생성, Generate]를 누른다.

Controller 생성

@RestController
public class HelloController {
    @GetMapping("/")
    public String index() {
        return "Hello Spring Boot!";
    }
}
  • @RestController : Spring MVC 를 사용하여 요청을 관리하는 Controller로 사용
    • @Controller + @ResponseBody + ..
  • @Getmapping : 경로 ‘/’을 index() 에 매핑

Application Class

@SpringBootApplication
public class DrSpringbootApplication {

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

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {
            System.out.println("Spring Boot provide beans");

            String[] beanNames = ctx.getBeanDefinitionNames();
            Arrays.sort(beanNames);
            for (String beanName : beanNames) {
                System.out.println(beanName);
            }
        };
    }
}
  • @SpringBootApplication
    • @Configuration : ApplicationContext에 포함될 Bean지정
    • @EnableAutoConfiguration : Spring Boot가 의존성에 포함된 설정들을 자동으로 추가
      • ex. spring-web-mvc 의존성이 있을 경우 DispatcherServlet 을 사용할 수 있음
    • @ComponentScan : Spring이 프로젝트 루트 내에 있는 Component와 Configuration을 탐색
  • main() : Spring Boot Application이 실행될 때 자동으로 실행되는 메서드
  • @Bean : 어플리케이션이 실행될 때 함께 생성되도록 Spring이 등록하는 객체

어플리케이션 실행

  • org.springframework.boot.autoconfigure : tomcat을 내장시켜준다

Unit Test 추가

@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {
    @Autowired
    private MockMvc mvc;
    
    @Test
    public void getHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Hello Spring Boot!")));
    }
}
  • MockMvc : Http 요청을 DispatcherServlet에 Mocking
  • @SpringBootTest, @AutoConfigureMockMvc : MockMvc 인스턴스를 주입하여 어플리케이션 전체 계층 테스트
    • cf. @MockMvcTest : 웹 계층의 테스트만 실시

이외에 Front-end 를 포함한 Full-stack 통합 테스트(Intrgration Test) 또한 작성할 수 있다.

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerIntegrationTest {
    @Autowired
    private TestRestTemplate template;
    
    @Test
    public void getHello() {
        ResponseEntity<String> response = template.getForEntity("/", String.class);
        assertThat(response.getBody()).isEqualTo("Hello Spring Boot!");
    }
}

Service 관련 의존성 추가

먼저 autuator module 을 의존성에 추가한다.

// build.gradle
implementation 'org.springframework.boot:spring-boot-starter-actuator'

Spring Actuator는 서비스 개발에 필요한 health, audit, bean 등의 기능을 제공하는 Spring 하위 프레임워크이다.

다음 curl 명령으로 actuator 엔드포인트를 호출해보면 404 에러를 만날 수 있다.

$ curl -X POST <http://localhost:8080/actuator/shutdown>
{"timestamp":1401820343710,"error":"Not Found","status":404,"message":"","path":"/actuator/shutdown"}

shutdown 이라는 엔드포인트가 차단되어 있기 때문인데, 엔드포인트를 오픈하려면 resources/application.properties 에 아래 옵션을 추가한다. (포스팅에서는 application.yaml로 변경 후 입력)

물론 이 엔드포인트를 실제로 사용할 수는 없지만, 다른 메시지를 만날 수 있게 된다.

$ curl -X POST <http://localhost:8080/actuator/shutdown>
{"timestamp":1401820343710,"status":405,"error":"Method Not Allowed","path":"/actuator/shutdown"}%  

Resources

반응형