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.xvs 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~~ - ~~이런 조건이되었을때 활성화
- @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;
}
스프링부트 스타터
기존 스프링에서는 일일히 의존성들을 여러개 설정해줘야하는데, 스프링부트 스타터를 사용하면 한줄이면 알아서 다가져와준다..
개발자가 신경써야할것
- 스프링부트버전
- 사용하려는 라이브러리의 스프링부트 스타터 지원여부
- 지원하지않는경우 사용하려는 라이브러리 등록방법
외부 설정
적용우선 순위
- 테스트 속성정의
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = DEFINED_PORT, **properties = {"server.port = 8080"}**)
public class ABC{ ... }
- 실행인자 지정 : java -jar abc.jar —server.port=8080
- SPRING_APPLICATION_JSON 환경 변수 또는 시스템 프로퍼티에 인라인 JSON으로 정의되어 있는 프로퍼티
- 자바 시스템 프로퍼티 (System.getProperties())
- 운영체제 환경변수 : $SERVER_PORT=8080 ... jara -jar abc.jar
- 기타 등등
- application-{profiles}.yml or application-{profiles}.properties
- 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 > 스프링' 카테고리의 다른 글
mvc (0) | 2023.03.26 |
---|---|
Spring boot (0) | 2023.03.26 |
Spring (0) | 2023.03.26 |
JDBC & Mybatis 설정법 (0) | 2022.01.24 |
Spring이란 & @Transactional (0) | 2022.01.24 |
댓글