본문 바로가기
IT/스프링

Spring boot

by 모띠 2023. 3. 26.

Spring Boot

스프링 프레임워크를 기반으로한 개발플랫폼

2014.04.01에 출시

스프링부트는

was를 내장하고있어서

기존의 was있는 곳에 war를 배포하는것이아니라, 자기자신을 배포하면됨.

스프링부트2.0은 스프링5를 사용하고있음

스프링부트2.2.0부터는 JUnit5가 기본탑재 / 2.4.0부터는 JUnit4 의존성이 사라짐(물론추가하면됨)

<dependency> <!-- 스프링부트 2.4.0 이상에서 junit4쓰기위해서 추가 --> 	<groupId>org.junit.vintage</groupId> 	<artifactId>junit-vintage-engine</artifactId> </dependency>

스프링부트 기능정의

  • 단독실행이 가능한(WAS내장) 스프링어플리케이션 생성
  • 내장 컨테이너로 톰캣(디폴트), 제티, 언더토우 중에서 선택가능
  • 스타터를 통한 간결한 의존성 구성지원
  • 스프링에 대한 자동구성 제공
  • 더이상 XML구성 필요없음 (pom.xml말고.. applicationContext.xml같은게 필요없다는뜻)
  • 제품출시 후, 운영에 필요한 다양한 기능 제공

 

스프링 부트 구성요소

  • 빌드도구 (gradle vs maven)
  • 스프링프레임워크(4.x vs 5.x)
  • 스프링부트(v1.x vs v2.x) ← 웬만하면 2.0이상으로..
  • 스프링부트스타터(spring-boot-starter) (의존성관리를 해줌)

 



프로젝트생성

스프링부트생성은 https://start.spring.io 에서 생성해야함. sts나 intellij에서 생성하는 spring starter project도 이 url을 지정하여 응답을 받아와서 생성해주는것

디펜던시로 여러가지 고를수가있는데.. lombok, web, jpa, h2등을 고를 수 있음.

스프링부트는 스프링과 다르게 해당디펜던시를 일일히 넣어줄필요가없이 알아서 다해주기때문에 편함.

Executable JAR(WAR) : 기존의 WAS설치된환경에 war를 올려서 WAS가 war를 물고 실행하는 것과 다르게, WAS자체를 내장하여 패키징하므로 java -jar abc.jar 이런식으로 바로 실행가능하도록함.

 

스프링부트는 어노테이션 기반으로 작동한다

  • @SpringBootApplication - @EnableAutoConfiguration, @ComponentScan, @Configuration 3가지를 포함 (요 패키지를 기본으로해서 밑에있는 패키지를 쭉 탐색)
  • @ComponentScan - 패키지의 빈, 설정, 서비스 자동스캔할 범위를 정함
  • @EnableAutoConfiguration - 자동구성을 활성화하겠다는 선언 (스프링부트에서 미리 정의해둔 bean설정파일(@Configuration)들을 읽어서 빈으로 등록(META-INF/spring.factoryes를 읽어들임, 그렇기때문에 우리는 이 어노테이션을 쓰는것만으로 스프링부트를 이용할 수 있게됨))
  • @Configuration - 이 파일은 applicationContext.xml와 같은 구성설정파일이다 라는뜻
  • @ConditionalOn~~ - ~~이런 조건이되었을때 활성화
  • @PropertySource(”classpath:abc.properties) - 파일을 읽어서 environment객체로 자동저장
@Value(”${boss.count}”) // 이런식으로 변수값 할당가능 private int bossCount;
  • @SpringBootConfiguration(= @Configuration) - 하는일은 같은데, 스프링과 스프링부트를 구분짓기 위해서 만든거라고 생각하면됨
  • @ConfigurationProperties(prefix = "eval") - application.properties 파일에서 eval이라는 접두어를 가진 값들을 해당클래스에서 읽어들인다. (dto로 넣음)yaml파일 읽기도 편하고 스프링이 알아서 타입변환도 해줌
  • @EnableConfigurationProperties(ABC.class) - @ConfigurationProperties로 등록한 클래스를 빈으로 등록할때 사용
@ConfigurationProperties로 읽어들인 YML등을 가지고있는 클래스를 빈으로 등록하는 방법은 2가지다.  @ConfigurationProperties(prefix = "gateway") public class GatewayConfig {  	private String clientsUrl; 	private String authorizeUrl; 	private String approveUrl; }  1.  @EnableConfigurationProperties @SpringBootApplication @EnableConfigurationProperties(GatewayConfig.class) public class Application { ... }  2. @Configuration @Configuration // 스프링부트는 컴포넌트 스캔을 하므로 설정프로퍼티클래스에 @Configuration 를 붙여주면 자동으로 빈등록됨 @ConfigurationProperties(prefix = "gateway") public class GatewayConfig {  	private String clientsUrl; 	private String authorizeUrl; 	private String approveUrl; }

스프링부트 스타터

기존 스프링에서는 일일히 의존성들을 여러개 설정해줘야하는데, 스프링부트 스타터를 사용하면 한줄이면 알아서 다가져와준다..

 

개발자가 신경써야할것

  • 스프링부트버전
  • 사용하려는 라이브러리의 스프링부트 스타터 지원여부
  • 지원하지않는경우 사용하려는 라이브러리 등록방법

외부 설정

적용우선 순위

  1. 테스트 속성정의
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = DEFINED_PORT, properties = {"server.port = 8080"}) public class ABC{ ... }
  1. 실행인자 지정 : java -jar abc.jar —server.port=8080
  1. SPRING_APPLICATION_JSON 환경 변수 또는 시스템 프로퍼티에 인라인 JSON으로 정의되어 있는 프로퍼티
  1. 자바 시스템 프로퍼티 (System.getProperties())
  1. 운영체제 환경변수 : $SERVER_PORT=8080 ... jara -jar abc.jar
  1. 기타 등등
  1. application-{profiles}.yml or application-{profiles}.properties
  1. application.yml or application.proerties

 



 

스프링은 일반적으로 웹어플리케이션으로 뜬다고보면된다. 이걸 웹을 안쓰고 뜨게할수도있음 (설정파일에서 spring.main.web-application-type을 NONE으로하면됨)

//application.yml  spring: 	main: 		web-application-type : NONE
@SpringBootApplication public class Application {  	public static void main(String[] args) { 		SpringApplication springApplication = new SpringApplication(Application.class); 		springApplication.setWebApplicationType(WebApplicationType.NONE); // 이렇게할수도있음 		springApplication.run(args); 	}

 

스프링부트는 기본적으로 mvnw 프로젝트로 쓸수있다.

빌드를해보면 ~~.SNAPSHOT.jar 이런 jar파일이 나오는데(이 파일은 실행에 필요한 WAS, LIB등 모든 파일들이 들어가있는 파일이다), unzip해보면

  • BOOT-INF : 만든 클래스 파일들과 yml파일
  • META-INF : MANIFEST.MF (최초 실행클래스가 뭐고.. 이런식의 설정정보가 적혀있음)
  • org

이 파일을 서버에 올려서

jara -jar ~~.SNAPSHOT.jar

로 실행하면됨.

스프링시작할때 SPRING이라고 배너파일이뜨는데, resource/banner.txt를 생성하면 그안에있는 내용으로 바뀐다.

어노테이션

@Component(내가 작성)는 아래 3개로 구분됨 (@Bean은 내가 작성하지않은, 외부에서 가져다쓰는 클래스들은 스프링빈으로 등록할때 주로 선언)

전부다 빈으로 등록하겠다는 기능이지만, 의미가 살짝 다름..

  • @Controller : 컨트롤러
  • @Service : 비즈니스 로직(트랜잭션관리영역), 서로다른 도메인연계, @Controller, @Repository사이의 중계
  • @Repository : dao같은것들(jpa..)
  • @Profile(타입) : 애플리케이션에 실행되는 환경에 따라서 빈을 등록하거나 제외시킬수있음.
@Profile("local") (메소드위에도 가능) public class ABC { ... }  // application-{profile}.xml application-datasource.yml => @Profile("datasource")와 매칭 application-api.yml => @Profile("api")와 매칭 application.yml

의존성 주입

  • 생성자 주입(권장) : 생성자를 통해서 주입, final사용 가능, 생성자도 롬복을쓰면 생략가능
@Service public class A { 	private final B b;  	// 생성자가 1개면 @Autowired안붙여도되지만 여러개면 붙여줘야함 	public A(B b){ 		this.b = b; 	} }
  • 수정자 주입 : setter로 주입
@Service public class A { 	private B b;  	@Autowired  	public void setB(B b){ 		this.b = b; 	} }
  • 필드 주입(@Autowired)
@Service public class A { 	@Autowired 	private B b;  	.. }


프로젝트 설계 & 개발 및 운영

개발을 시작할때 이런것들을 정한다..

  • 개발언어 : 자바
  • 개발도구 : sts
  • 빌드도구 : maven
  • 개발플랫폼 : 스프링부트
  • 운영플랫폼 : aws or idc
  • 버전관리 : git
  • 빌드배포 : 젠킨스
  • 개발환경 : local, test, prod..
  • DB : 오라클

프로젝트 구성시 필수조건

  • README 작성
  • 실행절차 설명
  • 실행절차에 따라 빌드하고 실행되도록
  • 커밋 및 푸시는 테스트 및 빌드가 성공되었을때 진행
  • 코딩 컨벤션(관례)는 팀원들과 상의

 

application.yml

spring: 	profiles: 		include: 			- datasource 			- api // application-api.yml을 읽어들이겠다는뜻

application-api.yml

goole: 	map: 		api-key : 0000  --- 문서 구분자(하나의 문서안에서 여러개 지정가능) spring.profile: dev goole: 	map: 		api-key : 0023

 

코딩

  • 기본적으로 도메인계층을 먼저 개발 @Entity, @Repository
  • 그리고 도메인간 서로 연계되는 부분이 있는 경우 서비스 계층에서 개발 @Service, @Transaction
  • 외부에 노출되는 부분에서는 표현계층 개발 @Controller, @RestController, @RequestMapping

'IT > 스프링' 카테고리의 다른 글

스프링 시큐리티(Spring security)의 이해  (0) 2023.11.12
mvc  (0) 2023.03.26
Spring  (0) 2023.03.26
JDBC & Mybatis 설정법  (0) 2022.01.24
Spring이란 & @Transactional  (0) 2022.01.24

댓글