가수면
[Spring Boot] 기본 본문
사용되는 의존성
Spring Web
Spring MVC를 이용해 RESTful을 비롯한 웹 애플리케이션 구축
기본 임베디드 컨테이너로서 apach tomcat을 사용
Spring Boot DevTools
빠른 애플리케이션 시작을 위해 구성을 제공 (변경 사항 재시작 필요없이 자동 적용 등)
Spring vs Spring Boot
Spring이 가지는 문제
의존성 관리 번거로움
web.xml 설정 필요
스프링 환경의 여러 설정을 적절히 지정해줘야 함
로깅, 에러 핸들링, 모니터링 등 비기능적인 부분들을 수동으로 구현해야 함
프로젝트마다 이 작업들을 해줘야 해서 개발 시간이 오래 걸림
Spirng Boot를 사용하면 위 문제들을 신경쓸 필요 없이 비즈니스 로직에만 집중할 수 있음
즉, 프로덕션 환경에 배포할 애플리케이션을 빠르게 빌드하도록 돕는 것이라고 할 수 있음
Spring Boot 프로젝트 설정
Spring Initializer - https://start.spring.io/
Spring Boot Starter Project - 프로젝트 의존성을 빠르게 정의할 수 있음
Spring Boot Auto Configuration - 클래스 경로에 있는 의존성에 따라 자동으로 설정이 제공됨
Spring Boot DevTools - 수동으로 서버를 다시 시작하지 않고도 변경사항 적용 가능
기능 설정 - Logging. 개발 환경에 대한 다양한 설정, Spring Boot Actuator (모니터링)
Spring Initializer
프로젝트 만들 때 의존성으로 Spring Web 설치
Spring Web - Spring MVC로 웹 애플리케이션과 REST API를 빌드하는 데 사용. Apache Tocat을 임베디드 컨테이너로 사용
Spring Boot Starter Project
빌드에 필요한 프레임워크들을 그룹화해 제공하여 애플리케이션을 쉽게 빌드할 수 있게 해줌
Spring Web 설치한 것이 이것에 해당
Spring Boot Auto Configuration
Spring Web에 자동 설정들도 포함됨 (Dispatcher Servlet, Embedded Servlet Container, Tocat 자동 설정, 기본 에러 페이지 설정, Bean을 JSON으로 자동 변환 설정 등)
Spring Boot DevTools
pom.xml에 다음 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
개발 환경 설정
src/main/resources에 아래처럼 여러개의 프로필을 만들 수 있음
// application.properties
logging.level.org.springframework = info // trace, debug, info, warning, error, off 각자 오른쪽 방향의 단계들을 포함함
logging.level.com.in28minutes.springboot.myfirstwebapp = debug // 특정 패키지만 따로 설정할 수도 있음
spring.profiles.active = dev
application.properties 파일에 spring.profiles.active를 추가하여 프로젝트에 적용할 프로필을 지정할 수 있음 (지정해주지 않을 경우 application.properties가 디폴트)
로깅
만약 application.properties에서 로깅 레벨을 info로 설정했는데 logger.debug()를 사용한다면 info 레벨일 때는 출력 안됨
private Logger logger = LoggerFactory.getLogger(getClass());
.
.
.
logger.debug("Request param is {}", name); // logger.debug(), inf(), warn() 등 있음
.env 같은 기능 설정
env 코드들을 설정 후 @ConfigurationProperties를 하면 됨
// application.properties
logging.level.org.springframework = debug
spring.profiles.active = dev
currency-service.url=http://default1.in28minutes.com
currency-service.username=defaultusername
currency-service.key=defaultkey
// application-dev.properties
logging.level.org.springframework = trace
currency-service.url=http://dev.in28minutes.com
currency-service.username=devusername
currency-service.key=devkey
//currency-service.url=
//currency-service.username=
//currency-service.key=
@ConfigurationProperties(prefix = "currency-service") // 접두사 설정
@Component
public class CurrencyServiceConfiguration {
private String url;
private String username;
private String key;
// 아래에 게터, 세터 설정
모니터링
Spring Boot Actuator를 통해 애플리케이션 전체 상황을 확인할 수 있음
// 의존성에 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
// application.properties
management.endpoints.web.exposure.include=* // health,metrics처럼 엔드포인트 지정할 수 있음
http://localhost:8080/actuator에서 확인 가능
많은 엔드포인트를 설정하면 cpu와 메모리가 많이 사용되기에 명시적으로 지정하는 것이 추천됨.
자주 사용되는 엔드포인트
beans - 애플리케이션에 포함된 모든 Spring Bean을 확인
health - 애플리케이션의 상태 정보를 확인 (제대로 동작하는지)
metrics - 애플리케이션과 관련된 여러 metrics
mappings - 애플리케이션에서 설정된 모든 요청 매핑 관련 세부 사항 확인
Spring Boot로 간단한 REST API 만들기
long 타입과 List 타입 숙지하기
package com.in28minutes.springboot.learnspringboot;
import java.util.List;
import java.util.Arrays;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CourseController {
@RequestMapping("/courses") // URL을 http://localhost:8080/courses로 설정
public List<Course> retrieveAllCourses() { // Course[] - 배열이기에 크기가 정해져있음. List<Course> - 객체들의 리스트를 의미하며, 리스트의 크기는 동적으로 변할 수 있음
return Arrays.asList( // 인자로 받는 객체들을 포함하는 리스트를 생성
new Course(1, "Learn AWS", "in28minutes"),
new Course(2, "Learn DevOps", "in28minutes"),
new Course(3, "Learn Azure", "in28minutes"),
new Course(4, "Learn GCP", "in28minutes")
);
}
}
package com.in28minutes.springboot.learnspringboot;
public class Course {
private long id; // long 타입 - int 타입보다 더 넓은 범위의 정수 자료형
private String name;
private String author;
// 생성자
public Course(long id, String name, String author) {
super();
this.id = id;
this.name = name;
this.author = author;
}
// 게터
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
// toString
@Override
public String toString() {
return "Course [id=" + id + ", name=" + name + ", author=" + author + "]";
}
}
CORS 설정
프로젝트 메인 클래스에 아래처럼 설정
// main 클래스
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 모든 url에 대해 활성화
.allowedMethods("*") // 모든 메소드
.allowedOrigins("http://localhost:3000");
}
};
}
'Java' 카테고리의 다른 글
어노테이션 정리 (0) | 2023.12.02 |
---|---|
H2, JDBC, JPA, Hibernate (2) | 2023.12.02 |
[Spring] 심화 (0) | 2023.11.30 |
[Spring] 기본 (0) | 2023.11.29 |
[Java] 기본 (0) | 2023.11.29 |