IT/스프링

Spring boot를 이용해서 자바프로그램을 짜보자

모띠 2022. 1. 24. 20:28
반응형

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~~ - ~~이런 조건이되었을때 활성화
  • @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
  2. SPRING_APPLICATION_JSON 환경 변수 또는 시스템 프로퍼티에 인라인 JSON으로 정의되어 있는 프로퍼티
  3. 자바 시스템 프로퍼티 (System.getProperties())
  4. 운영체제 환경변수 : $SERVER_PORT=8080 ... jara -jar abc.jar
  5. 기타 등등
  6. application-{profiles}.yml or application-{profiles}.properties
  7. 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
반응형