본문 바로가기
스프링/SpringBoot

SpringBoot

by 공부 안하고 싶은 사람 2021. 2. 9.
반응형

참고 : 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에 따라 등록

자동 설정 만들기

  1. 의존성 추가 (spring-boot-dependencies)
  2. @Configuration 파일 작성
  3. src/main/resource/META-INF에 spring.factories 파일 만들기
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  4. spring.factories 안에 자동 설정 파일 추가
  5. mvn install
덮어쓰기 방지하기 ( ComponentScan -> EnableAutoConfiguration 순서 때문에 덮어짐 )

​ @ConditionalOnMissingBean

설정파일로 설정하기

  1. 의존성 추가 (spring-boot-configuration-processor)
  2. application.properties 설정
  3. 클래스에 @ConfigurationProperties(“prefix값”)
  4. 설정값 사용하고 싶은곳에 @EnableConfigurationProperties(클래스)

내장 웹 서버 설정

  • 자동설정에서
    ServletWebServerFactoryAutoConfiguration (서블릿 웹 서버 생성)
      TomcatServletWebServerFactoryCustomizer(서버 커스터마이징)    

    DispatcherServletAutoConfiguration(dispatcher서블릿 만들고 등록)

  • 다른서블릿 컨테이너 변경 가능 (pom.xml에서 tomcat이외의 jetty 등으로)

  • 포트 변경 (application.properties에서 server.port=)

  • HTTPS

    1. 키스토어(인증서) 만들기
    2. application.properties 설정
    3. 커넥터는 코딩으로 추가 설정할 수 있다.(TomcatServletWebServerFactory)
  • HTTP2

    1. application.properties (server.http2.enabled=true 추가)
    2. 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정보화 ,빈으로 등록
    1. pom.xml 추가
    2. properties class추가
    3. @ConfigurationProperties("name")
    4. @Component으로 빈등록
  • jar파일 등에 있는 class에는 @Bean이 붙어있는 곳에 @ConfugrationProperties를 붙여 사용
  • 케밥(-), 언더스코어(_), 캐멀케이스, 대/소문자 구분X
  • dataType 컨버전
    @DurationUnit과 같이 쓰지 않아도 subfix명시로 변환도 가능
  • 값 검증
    @Validated설정하면 atribute값 검증annotation 사용가능
  • @Value는 SpEL 사용가능하지만, 위의 기능제공 X
  • 프로파일
    1. spring.profiles.active=prod
      혹은 application-{profile}.properties 생성
      profile 타입 추가는 spring.profiles.include=example 처럼
    2. @Configuration, @Component
    3. @Profile("{profile}")

로그

  • 결국 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

  1. 요청이 들어오면 ContentNegotiatingViewResolver 다른 ViewResolver들에게 위임

  2. 응답을 만들 수 있는 모든 View를 찾기

  3. 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 : ""

사용법

  1. application.properties에 spring.h2.console.enabled=true 추가
  2. 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스크립트를 통한 초기화 설정

  1. schema.sql 또는 schema-${platform}.sql
  2. data.sql 또는 data-${platform}.sql
  3. ${platform} 값은 spring.datasource.platform 으로 설정 가능

DB 마이그레이션 - DB 버전관리
Flyway / Liquibase

  1. 의존성 추가 org.flywaydb:flyway-core
  2. 마이그레이션 파일 경로 : db/migration 또는 db/migration/{vendor}
    spring.flyway.locations로 변경 가능
  3. 마이그레이션 파일 이름 : 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 + 설정추가
728x90
반응형

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

Spring Boot Admin / Spring Boot Actuator  (0) 2021.06.25

댓글