sb 설정을 어떻게 하는지 / 왜 필요한지
##설정 파일 작성
1.서버 컴퓨터 + jdk 활용 -> java 실행
2.도커를 활용해서 container로 application 만듬
3.클라우드 서비스 ->관계형 db서버 제공
등 여러가지 방법있음. 어디에서 app실행하냐에 따라 설정 다르게 해줘야됨.
실제 서비스 실행하는 데는 여러가지 다양한 환경 구성할 수 있음
상황에 맞는 application 설정이 이번 영상의 목표
사용하는 dp에 따라 다르게 설정 어떤식으로 적용할 것인지 살펴보기로
원래 사용하던 설정값들이 조금씩 바뀜.
application.yml
1. Multi-Document yml
1.test환경에서 만들기 위해 필요한 file 만들 경우
springboot 실행시 위쪽 두줄 확인
no active profile set , default
프로필 세팅해놓으면 그 프로필에 속한 정보를 가지고 application을 실행한다
현재 기본값 default로 세팅해서 실행하고 있음
=> 변경해보자!
multi-document yml 란?
하나의 yml 파일안에 여러개의 문서를 넣어서 설정하는 방법
spring:
profiles:
active: local
---
spring:
config:
activate:
on-profile: local
profiles : active : 어떤 프로필이 active한지, 어떤 프로필을 사용해서 application을 실행할지 설정파일 안에서 미리 정의
config : activate: on-profile : 현재 프로필이 local 일때 실행하는 설정 -> 아랫쪽 문서에 작성됨
spring:
config:
activate:
on-profile: test
datasource:
driver-class-name: org.h2.Driver
url: jdbc: h2:mem:testdb
username:sa
password: password
jpa:
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.H2Dialect
test 용도로 사용할때 별도의 db사용
사용할 database : h2라는db의 일종, 메모리 내부에서 작동하는 db. 설치 필요없음. test할때 자주 사용.
url : 자기 자신으로, h2:mem:testdb
실행하면 여전히 local profile로 작동함 (앞서 작성)
h2드라이버를 사용하겠다고 선언했지만 h2 드라이버를 gradle 상에 작성x -> 필요한 dependencies 추가
2. build.gradle
dependencies{
runtimeOnly'com.h2databas:h2'
}
runtimeOnly : 실행중에만 사용하는 dependency
# 결론
이미 만들어져있는 설정을 여러개로 복사해서 하나의 문서를 만드는 것
2. Multi-Document 분리한 yml
더 많은 설정 필요, 문서내부에서 어떤 일이 일어나는지 알아내기 힘듬 -> Multi-Document 분리해서 다른 파일에 만듬
1. application-local.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/demo_jpa_schema
username:demo_jpa
password: password
jpa:
hibernate:
ddl-auto: none
show-sql: false
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
mysql dialect 기본값이 h2니까 mysql8을 사용함.
# 결론
application file을 나눠주면 됨.
순서
1) application.yml 에있는 spring profiles active 항목을 봄 (yml file은 기본적으로 설정이 들어감)
2) 아랫쪽에 있는 부분을 다 읽고 아래 내용중에 local에 해당하는 것이 없음
3) local이라는 이름을 갖고 resource디렉토리에 존재하는 application-local 파일 찾음
4) 거기에 해당하는 설정들을 가지고 사용
2. application-test.yml
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc: h2:mem:testdb
username:sa
password: password
jpa:
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.H2Dialect
3. application.yml
spring:
profiles:
active: test
# 결론
기본적으로 build단계에서 설정 파일을 정의할 때 active에 들어갈 이름이 profile의 이름임
profile의 이름에 따라 설정파일을 application-profile명.yml으로 작성해주면 됨.
3. 상용환경에서 실행할때만 작동
지금은 applicaiton의 profile 설정을 바꿔주며 실행하고 있음.
다음단계 : 실제로 profile 실행할 때, jar파일을 만들었을 때 어떻게 설정을 하느냐
상용환경에서 실행할때만 작동하도록 바꿔주고 싶을때
1. jar 파일 열기
gradle창 열기> jpa >Tasks >build >boot.jar
boot.jar란?
- jar파일을 만들라는 task
- jar파일이 build->libs 안에 jpa-0.0.1-SNAPSHOT.jar로 생성
2. 실행할 때
java 명령어 사용
-jar : jar 파일 실행 시 사용
build\libs\jpa-0.0.1-SNAPSHOT.jar : 실행하고자 하는 파일이 어딨는지 지정
가장 기초적인 springboot 배포할 때 jar파일을 만들어서 실행하고 보여주고자 하는 서비스를 컴퓨터에 가져가고 거기서 자바를 실행하는 형식으로 작동함.
3. 다른 profile 실행하고 싶을 경우
yml파일이 아니라 properties 파일이면 이렇게 설정을 했을 것.
+ @Profile annotation
profile에 따라 생성되는 bean이 다르다는 것을 보여주는 예시
1. ProfileComponent class 생성
component 파일로 ProfileComponent 생성
- @Component된 class -> springboot application이 실행이 될 때 ioc 컨테이너로 넘어감
- public ProfileComponent(){}실행함
2. logger 설정
logger. info("profile component profile : local")
local을 @Profile을 통해 전달 했다는 것을 보여줌
3. build 가 정상적으로 됐다면
termianl에
java -jar build\libs\jpa-0.0.1-SNAPSHOT.jar
SPRING_PROFILES_ACTIVE=local java -jar build\libs\jpa-0.0.1-SNAPSHOT.jar
작성한 log가 찍힌 것을 확인 할 수 있음
# 결론
@Profile을 사용하면 어떤 bean을 먼저 사용할 지, 어떤 상황에서 사용할 지 정의 할 수 있음
나중에 interface가 다르지만 결과가 동일하게 사용될 애들 작성 할 때 이런식으로 작성하면 됨.
4. 외부라이브러리 class를 @Bean으로 제공하기
그동안 springboot에 전달한 bean이 다 class 형태로 전달이 됨.
class에 붙는 annotation만 공부해왔었음.
만약 외부에 있는 library에 존재하는 class를 springboot가 다룰 수 있도록 할 때
1. gson
build에 dependency 추가 사진
실제로 존재하는 class, 이미 library상에 존재함.
이걸 springboot가 다룰 수 있도록 하고 싶은데 class를 가져와서 bean을 붙여 줄 수는 없음
2. 배운걸로 가는 경우
1) GsonComponent 클래스 생성
2) PostController에 추가
GsonComponent 형태로 받아와서 get
안쪽에 있는 class를 받아오기 위해 외부의 lib를 bean IOC 컨테이너의 관리 하에 두기 위한 과정이 너무 복잡함.
3. Configuration을 통한 bean 생성
1) DemoConfig 클래스
@Configuration
- 자신이 bean을 제공하고 여러가지 설정들을 담기 위해 만든 annotation
- @Configuration이 붙은 class는 springboot에서 활용할 설정들, bean들을 만들 수 있음 ->IOC에 전달
- springboot에서 제공하지 않는, 자기가 만들지 않은 library class들을 bean으로 제공 -> 설정에 필요한 class들을 객체화 해서 IOC 컨테이너에 전달하기 위해 존재
@Bean
- 클래스를 IOC에 넘겨줌
- 함수의 반환값인 Gson()이 spring IOC의 관리하에 들어가게 됨.
DemoConfig클래스 함수의 결과가 IOC에 있고 그것을 controller에서 @Autowired를 통해 가져올 수 있음
2) Autowired 설정
configuration 이란 bean을 자주 보게 될 것, 하지만 정확히 뭔지 설명이 별로 없기 때문에 지금 잘 알아둘 것
5. Bean의 멤버변수로 활용
지금가지 다룬 설정들은 springboot가 필요한 설정들
이번엔 우리가 따로 application을 진행할 때 필요한 설정들을 넣는 방법 알아볼 것
application.yml
spring:
profiles:
active: test
custom:
property:
single: custom-property
comlist: comma, sparated, list, to, value
설정 파일 안에 사용할 다양한 변수 정의
#custom.property.single
#custom.property.comlist
yml파일의 형식에 맞게 작성함. springboot에서 사용하는 설정x -> 외부 api를 사용할 때 사용
springboot와 상관이 없지만 상황에 따라 바뀌거나 설정으로 주입해줘야 됨.
1)@Value
@Value의 ${custom.property.single} 값이 설정되어있는 값을 찾아서 들어가게 됨
application.yml 파일의 custom-property의 값-> @Value의 customProperty 변수에 들어감
@Value에 들어가는 값들은 bean이 생성 된 후 들어감
2) 추가 설명
custom.property.default는 설정한 값이 아니라서 뒤에 : 를 붙여서 default-property를 붙임
상황에 따라 변경할 수 있는 것이 appplication.yml에 있으면 어떤 profile로 설정해도 무조건 읽히게 됨.
test나 local환경에서 다른값으로 사용하고 싶다면?
application-test.yml
custom : property 에 custom-property 대신에 test-property 넣고 실행
multi document에서 여러개를 넣으면 마지막이 실행됨 -> 마찬가지. test-property가 실행이 됨.
마무리
- springboot는 모든 객체가 bean으로 이루어짐
- 자신이 선언한게 어떻게 어디로 들어가는지를 정확히 해야 기능 100% 활용할 수 있음
- profile 체계는 많은 호평을 받음 -> 잘 알아두기
'SpringBoot' 카테고리의 다른 글
Interceptors & Filters (0) | 2022.03.24 |
---|---|
Exception Handling - 강의 정리 (0) | 2022.03.24 |
Validation - 강의정리 (0) | 2022.03.22 |
Spring AOP -강의정리 (0) | 2022.03.22 |
Logging -강의 (0) | 2022.03.22 |