참고 : https://velog.io/@max9106/Spring-Boot-SpringApplication-
spring boot 란? <목표>
독립적인 app 빠르고 쉽게 만들수있게 해준다.
일반적인 설정 제공(tomcat 등) + 버전 ->> 커스텀가능
xml 설정 X, code generation X
<pom.xml>설정
spring-boot-starter-parent -> 상속받은 많은 의존성 등록, 버전관리, 기본설정(리소스필터링, 플러그인설정)
spring-boot-starter-web
spring-boot-maven-plugin -> build시 실행 가능한 jar파일로 구조를 변경
Main-Class, Start-Class, Spring-Boot-Classes, Spring-Boot-Lib 통해
<Application.java>
@SpringBootApplication
=
@SpringBootConfigration
@ComponentScan - [하위 패키지]들 component를 bean 등록
@EnableAutoConfiguration - (meta파일)spring.factiories 안의 여러 bean들을 conditional에 따라 등록
자동 설정 만들기
- 의존성 추가 (spring-boot-dependencies)
- @Configuration 파일 작성
- src/main/resource/META-INF에 spring.factories 파일 만들기
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - spring.factories 안에 자동 설정 파일 추가
- mvn install
덮어쓰기 방지하기 ( ComponentScan -> EnableAutoConfiguration 순서 때문에 덮어짐 )
@ConditionalOnMissingBean
설정파일로 설정하기
- 의존성 추가 (spring-boot-configuration-processor)
- application.properties 설정
- 클래스에 @ConfigurationProperties(“prefix값”)
- 설정값 사용하고 싶은곳에 @EnableConfigurationProperties(클래스)
내장 웹 서버 설정
-
자동설정에서
ServletWebServerFactoryAutoConfiguration (서블릿 웹 서버 생성)
TomcatServletWebServerFactoryCustomizer(서버 커스터마이징)DispatcherServletAutoConfiguration(dispatcher서블릿 만들고 등록)
-
다른서블릿 컨테이너 변경 가능 (pom.xml에서 tomcat이외의 jetty 등으로)
-
포트 변경 (application.properties에서 server.port=)
-
HTTPS
- 키스토어(인증서) 만들기
- application.properties 설정
- 커넥터는 코딩으로 추가 설정할 수 있다.(TomcatServletWebServerFactory)
-
HTTP2
- application.properties (server.http2.enabled=true 추가)
- tomcat 9 부터 추가 설정 X
활용
SpringApplication
- 실행 로그 레벨 설정
- FailureAnalyzer
- 시작배너
- springApplicationBuilder로 빌더패턴 생성
- ApplicationEvent - 각종 어플리케이션 이벤트처리
ApplicationListener로 리스너 추가 가능 (빈설정 이전의 이벤트라면 SpringApplication.addListners() 필요) - WebApplicationType
.setWebApplicationType() 로 설정 - arg사용(app 실행 옵션) ApplicationArguments에 들어있다
-D : JVM 옵션
-- : arg옵션 - ApplicationRunner 상속 (app실행 뒤 뭔가 실행하고 싶을 때)
외부설정
-
보통? application.properties에 key/value 설정
-
설정 우선 순위 존재, 따라서 override 되는것을 조심해야한다.
- application.properties경로에 따른 우선순위도 존재
- 플레이스 홀더(변수로 사용)
name = dongkyu
fullname = ${name} kim - (type-safe) @ConfigurationProperties으로 meta정보화 ,빈으로 등록
- pom.xml 추가
- properties class추가
- @ConfigurationProperties("name")
- @Component으로 빈등록
- jar파일 등에 있는 class에는 @Bean이 붙어있는 곳에 @ConfugrationProperties를 붙여 사용
- 케밥(-), 언더스코어(_), 캐멀케이스, 대/소문자 구분X
- dataType 컨버전
@DurationUnit과 같이 쓰지 않아도 subfix명시로 변환도 가능 - 값 검증
@Validated설정하면 atribute값 검증annotation 사용가능 - @Value는 SpEL 사용가능하지만, 위의 기능제공 X
- 프로파일
- spring.profiles.active=prod
혹은 application-{profile}.properties 생성
profile 타입 추가는 spring.profiles.include=example 처럼 - @Configuration, @Component
- @Profile("{profile}")
- spring.profiles.active=prod
로그
-
결국 SLF4j 사용 -> 기본 Logback
-
로깅 퍼사드 vs 로거
로깅 퍼사드 -> loger interface 이므로 다른 로거로 교체가능하기때문 -
--debug (일부 핵심 라이브러리만 디버깅 모드로)
--trace (전부 다 디버깅 모드로) -
컬러 출력: spring.output.ansi.enabled
-
파일 출력: logging.file 또는 logging.path
-
로그 레벨 조정: logging.level.패지키 = 로그 레벨
-
logback-spring.xml 사용으로 외부에서 로그설정
파일, 레벨, 외부설정 등으로 로거사용<appender name="FileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/test.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/test_%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>200</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{35} : %msg %n</pattern> <charset>utf8</charset> </encoder> </appender> <logger name="로거 경로" level="INFO" additivity="false"> <appender-ref ref="FileAppender" /> </logger>
-
Log4j2 -> log4j2-spring.xml
테스트
- pom.xml starter-test를 test scope로 추가
- @RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RONDOM_PORT) - @MockBean
빈을 Mock으로 만든 객체로 교체 - webflux 사용시 WebTestClient사용으로 테스트 가능
- 용도별 슬라이스 테스트
@JsonTest / @WebMvcTest / @WebFluxTest / @DataJpaTest
Web MVC
WebMvcAutoConfiguration 자동설정 으로인한 spring mvc사용
ResourceLoader, configureAsyncSupport 등 또한 자동설정
설정 커스터마이징
- WebMvcProperties -> spring.mvc
- ResourceProperties -> spring.resources
MVC 확장 : WebMvcConfigurer 상속 + @Configuration
MVC 재정의 : @EnableWebMvc + @Configuration
HttpMessageConverters - 어떤 타입 요청을 받았는지 / 어떤 타입 응답을 보내야하는지에 따라 다른 객체 사용
- @ReuqestBody : 본문 -> 객체
- @ResponseBody : 객체 -> 본문
@RestController 사용시 생략가능
ContentNegotiatingViewResolver
-
요청이 들어오면 ContentNegotiatingViewResolver 다른 ViewResolver들에게 위임
-
응답을 만들 수 있는 모든 View를 찾기
-
Accept Header와 비교하여 적절한 View 찾기
XML형식 메시지 내보내고 싶으면 의존성 추가해야한다.
정적 리소스 지원
-
ResourceHttpRequestHandler가 리소스 위치 설정
- WebMvcConfigurer의 addRersourceHandlers로 커스터마이징 할 수 있음
- spring.mvc.static-path-pattern: url 맵핑 설정 변경 가능
-
spring.mvc.static-locations: 리소스 찾을 위치 변경 가능
웹 JAR - jar(pom.xml)추가하여 jQuery, ReactJS, ViewJS 등 사용가능
기본 페이지(home)와 파비콘 - 기본 리소스 위치에 기본페이지(index.html) / 파비콘이미지(favicon.ico) 있다면 자동설정
템플릿 엔진
- FreeMarker / Grrovy / Thymeleaf / Mustache / JSP는 권장 X
HtmlUnit - webClient로 html 단위테스트
ExceptionHandler
- 기본 예외 처리기 - BasicErrorController
ErrorController구현으로 커스터마이징 - 클래스에 @ControllerAdvice, 메소드에 @ExceptionHandler(exception클래스) 통해 에러 catch
- 기본 리소스 위치에 ./error/500.html 만든다면 자동으로 ExceptionHandling
HATEOAS - 서버에서 현재 리소스와 연관된 링크 정보를 클라이언트에게 제공
ObjectMapper, LinkDiscovers제공
CORS
-
SOP - Single-Origin Policy
-
CORS - Cross-Origin Resource Sharing
-
Origin : url스키마 + hostname + port
-
허용할 origin 1개 설정
@CroossOrigin(origins = "Origin") -
전체 설정
@Configuration + WebMvcConfigurer상속 +@Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedMethods("GET", "PUT", "POST", "OPTIONS"); }
Spring Data
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
ㄴ JdbcTemplateAutoConfiguration, DataSourceAutoConfiguration 자동설정
DataSource보단 JdbcTemplate사용하는것이 더 안전하고 깔끔하다.
인메모리 DB 설정
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
기본 연결정보
- URL : "testdb"
- username : "sa"
- password : ""
사용법
- application.properties에 spring.h2.console.enabled=true 추가
- localhost:8080/h2-console 접속
MySQL
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
DBCP - HikariCP (default) / Tomcat CP / Commons DBCP2
DBCP설정 - spring.datasource.hikari.*
PostgreSQL
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
Spring-Data-JPA - 객체와 릴레이션을 맵핑할 때 발생하는 개념적 불일치를 해결하는 프레임워크
SDJ -> JPA -> Hibernate -> Datasource
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
DB 초기화 설정(개발용) 주의해서 사용
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-dll=true
spring.jpa.show-sql=true
SQL스크립트를 통한 초기화 설정
- schema.sql 또는 schema-${platform}.sql
- data.sql 또는 data-${platform}.sql
- ${platform} 값은 spring.datasource.platform 으로 설정 가능
DB 마이그레이션 - DB 버전관리
Flyway / Liquibase
- 의존성 추가 org.flywaydb:flyway-core
- 마이그레이션 파일 경로 : db/migration 또는 db/migration/{vendor}
spring.flyway.locations로 변경 가능 - 마이그레이션 파일 이름 : V숫자__이름.sql
Redis
StringRedisTemplate / RedisTemplate 혹은 CrudRepository 상속하여 사용
커스터 마이징 설정 : spring.redis.*
MongoDB - JSON 기반의 도큐먼트 데이터베이스
MongoTemplate 혹은 MongoRepository 상속하여 사용
내장형(테스트용) DB 설정 가능
Neo4j - 노드간의 연관 관계를 영속화하는데 유리한 그래프 데이터베이스
SessionFactory 혹은 Neo4jRepository 상속하여 사용
REST Client
RestTemplate
- Synchronous
- RestTemplateAutoConfiguration
- spring-web 모듈이 있다면 RestTemplateBuilder을 통해 사용
WebClient
- Asynchronous
- WebClientAutoConfiguration
- spring-webflux 모듈이 있다면 WebClient.Builder을 통해 사용
운영-모니터링 Actuator
- spring-boot-starter-actuator 추가하면
Endpoints로 애플리케이션 정보 확인 - jconsole : JMX로 확인(대부분 공개)
"/actuator" : HTTP로 확인(대부분 비공개 이므로 공개로 변경해야함) - 어드민 서버 설정 spring-boot-admin-server + @EnableAdminServer
클라이언트 설정 spring-boot-admin-start-client + 설정추가
'스프링 > SpringBoot' 카테고리의 다른 글
Spring Boot Admin / Spring Boot Actuator (0) | 2021.06.25 |
---|
댓글