Spring Boot 프로젝트 예제로 기초 이해하기
spring boot 동작 방식을 이해하기 위해 공식 사이트에서 제공한 가이드를 따라 연습한 내용을 정리한 자료입니다.
1. 나의 개발 환경
- IntelliJ IDEA CE
- Mac OS
- JDK 1.8
- Gradle
- + intelliJ에서 스프링 부트 프로젝트를 시작하는 방법은 생략할 수 있도록 git 에서 예제를 clone해서 시작합니다.
$ git clone https://github.com/spring-guides/gs-spring-boot.git
$ cd gs-spring-boot/initial
// gs-spring-boot/complete에서 실습 완료 시 코드를 확인할 수 있습니다.
2. spring initializer로 시작하기
- 스프링 이니셜라이저로 gradle 프로젝트를 만들어 다운 받으면 프로젝트 폴더에 build.gradle이 자동 생성되어 있습니다.
- git 에서 코드를 클론했으면 이 파일 역시 이미 생성되어 있는 상태입니다.
- intelliJ ultimate 버전을 구매해서 사용하시면 initializer가 IDE에서 제공돼서 거기서 별로도 만드셔도 됩니다!
plugins {
id 'org.springframework.boot' version '2.4.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
3. 간단한 웹 애플리케이션 만들기
애플리케이션으로 컴파일될 자바 파일은 src/main/java 디렉토리에 위치해야 합니다.
웹 컨트롤러 만들기
- src/main/java/com/example/springboot/HelloController.java
- @Restcontroller streotype annotation으로 이 부분이 웹 컨트롤러 역할을 함을 알립니다.
- @RequestMapping annotation은 라우팅 정보를 제공합니다. 파라미터로 전달되는 문자열을 경로로하는 HTTP 요청이 들어오면 해당 annotation이 붙은 메소드로 맵핑을 합니다.
package com.example.springboot;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Greetings from Spring Boot!";
}
}
- @RestContoller
웹에 들어오는 요청을 컨트롤하기 위해 이 메소드를 사용할 것임을 알리는 플래그
@Controller + @ResponseBody - @RequestMapping('/')
전달받은 문자열 인자 / 를 index() 메소드로 맵핑하는 플래그 - public String index()
@RequestMapping('/')로 맵핑된 주소로 문자열을 반환하는 메소드
웹 애플리케이션 클래스 만들기
- src/main/java/com/example/springboot/Application.java
- 메인 메소드는 애플리케이션 시작 지점으로 자바 컨벤션을 따릅니다. 이 메소드에서 SpringApplication 클래스의 run 메소드를 호출하여 자동으로 설정된 톰캣 등의 웹 서버가 시작되고, 애플리케이션이 실행되게 하는 역할을 위임합니다.
- Spring boot는 애플리케이션의 메인 클래스가 다른 클래스보다 상위인 루트 패키지에 위치하도록 권고합니다.
- @SpringBootApplication annotation은 대게 애플리케이션 메인 클래스 앞에 붙는 어노테이션으로 베이스 패키지를 명시적으로 정의하는 것입니다.
package com.example.springboot;
import java.util.Arrays;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
System.out.println("Let's inspect the beans provided by Spring Boot:");
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
System.out.println(beanName);
}
};
}
}
- spring initializer로 프로젝트를 생성하면 처음에 간단한 애플리케이션 클래스를 자동으로 생성해 두는데 이를 다음과 같이 수정해야 합니다.
- @SpringBootApplication
= @Configuration : 애플리케이션에서 bean으로 사용할 클래스임을 명시하는 태그
+ @EnableAutoConfiguration : 각종 프로퍼티 설정, 클래스경로 설정, 다른 bean을 기반으로 새로운 bean을 추가했음을 Spring boot에게 알리기 위한 태그
+ @ComponentScan : com/example 패키지에 있는 서비스, 컴포넌트, 설정 등을 찾아서 컨트롤러에 알리라고 Spring에게 알려주는 태그 - main() 메소드
Spring boot의 SpringApplication.run() 메소드를 실행시키는 메소드로 애플리케이션을 실행시킴 - CommandLineRunner() 메소드 (@Bean)
애플리케이션 시작시 실행되는 부분으로, 애플리케이션에 의해 생성된 모든 bean을 찾거나 자동으로 그 bean들을 spring boot에 추가하고 정렬하고 프린트 함
애플리케이션 디렉토리 구조 예시
- src/main/java/com/...
- myapplication 패키지의 루트 - Application.java에 @SpringBootApplication 어노테이션을 단 메인 클래스가 포함되어 있습니다.
- 그리고 세부 아이템인 customer, order이 존재하고 각 아이템 디렉토리 하위에 기능을 구현한 파일과 컨트롤러 파일이 존재합니다.
com
+- example
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
4. 애플리케이션 실행하기
- ../complete 디렉토리에 가서 실행시켜야 합니다.
- ./gradlew bootRun
- localhost:8080으로 접속하면 다음과 같은 화면을 확인할 수 있습니다.
- nginx도 기본적으로 포트 넘버를 8080 으로 설정하기 때문에 기존에 nginx 서버를 켜두셨다면 꺼야 합니다. (mac -$ sudo nginx -s stop)
5. 추가 정보
- 애플리케이션 이벤트가 보내지는 순서 : docs.spring.io/spring-boot/docs/2.4.4/reference/htmlsingle/#boot-features-application-events-and-listeners
References
'웹 개발 > Spring Boot' 카테고리의 다른 글
Spring Boot) 4. 스프링 부트 웹 개발 (2) | 2021.04.28 |
---|---|
Spring boot) 3. 스프링 프레임워크 (0) | 2021.04.28 |
Spring Boot) 2. 서블릿 Servlet (0) | 2021.04.28 |
Spring Boot) 1. 개발 환경의 변화와 자바 (0) | 2021.04.28 |
Spring Boot) Gradle이란 (0) | 2021.04.22 |