가수면

[Spring Boot] 기본 본문

Java

[Spring Boot] 기본

니비앙 2023. 12. 1. 15:06

사용되는 의존성

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

https://start.spring.io/

프로젝트 만들 때 의존성으로 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
Comments