Files
2026-05-29 17:49:25 +09:00

187 lines
6.7 KiB
Plaintext

= Spring Config
SDL 6.0에서는 모든 Spring 설정이 Java Config로 되어 있다. com.samsung.config 패지키에 있다.
기본적인 설정파일들은 아래와 같다.
[source, text]
----
com.samsung.config
|- CacheConfig <1>
|- DbcpDataSourceConfig <2>
|- JasyptConfig <3>
|- JpaDatasourceConfig <4>
|- KnoxSyncBatchConfig <5>
|- QuartzClusteringConfig <6>
|- QuartzConfig <7>
|- RedisConfig <8>
|- SpringConfig <9>
|- SpringWebConfig <10>
|- SwaggerConfig <11>
|- SysUseLogBatchConfig <12>
|- TemplateConfig <13>
|- UserBatchConfig <14>
|- WebClientConfig <15>
----
<1> 캐시 설정 (Simple Provider)
<2> 데이터 소스 설정
<3> 프로퍼티 값 암호화를 위한 Jasypt 설정
<4> Jndi 데이터 소스 설정
<5> 결재동기화 배치 쿼츠(Quartz) job/trigger 설정
<6> Quartz 클러스터링 설정 (JDBC Jobstore)
<7> Quartz 설정 (RAM Jobstore)
<8> 캐시 설정 (Redis)
<9> Spring 설정
<10> Spring WebApplicationContext 설정
<11> Swagger 설정
<12> 시스템 로그 배치 쿼츠(Quartz) job/trigger 설정
<13> Thymeleaf 템플릿 엔진 설정
<14> 사용자 관련 배치 쿼츠(Quartz) job/trigger 설정
<15> WebClient 설정
== SpringConfig
Spring 설정 중에 가장 기본이 된다. Transaction, MessageSource 를 사용 할수 있도록
Spring Container 에 등록한다.
* @Configuration
Configuration Annotation은 Spring Container에게 해당 클래스가 Bean들을 등록하는 클래스라는 것을 알려주기 위한 Annotation이다.
프로젝트에서 Bean을 등록 할때는 클래스에 Configuration Annotation을 설정하도록 한다.
* @EnableTransactionManagement
EnableTransactionManagement annotation을 사용하면 Spring에서 @Transactional 을 사용해 Transaction을 관리 할 수 있다.
.xml 설정
[source, xml]
----
<tx:annotation-driven transaction-manager="txManager" />
----
@Transactional 에 대한 세부적인 내용은 Spring
link:https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#transaction-declarative-attransactional-settings[Transactional Settings]
를 참고 한다.
* PropertySource
property 파일을 읽기 위해 사용한다. SDL에서는 <<_config_properties, config.properties>>파일과 <<_knox_properties,knox.properties>> 파일을 기본으로 로딩한다.
PropertySource에 등록된 값은 Spring Bean에서 사용할 수 있다.
** Value Injection +
@Value를 사용해 PropertySource의 값을 Injection 한다.
** Environment Injection +
org.springframework.core.env.Environment를 Injection 하고 getProperty("key")를 이용해 값을 얻는다.
.Value Injeciton
[source, java]
----
@Value("${security.access.limit.timeout:30}")
private int limitTimeout;
@Value("${security.check.access.timeout:false}")
private boolean checkTimeout;
----
.Environment Injection
[source, java]
----
String functionUrl = environment.getProperty(KNOX_EMP_SERVICE) + "/employees";
----
* ComponentScan
com.samsung 패키지에 속해 있는 @Service, @Repository, @Component 의 Bean만 찾아서 등록한다.
[source, java]
----
@ComponentScan(basePackages = "com.samsung", useDefaultFilters = false, includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Service.class), @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Repository.class), @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Component.class)})
----
CAUTION: @Controller Baen은 SpringConfig가 아닌 SpringWebConfig에서 Scan한다.
* MessageSource
다국어 적용을 위해 MessageSource 를 사용한다. Backend 에서는 MessageSourceAccessor나 MessageSource를 이용해 다국어를 적용한다.
특히 velocity엔진 템플릿에서 다국어를 사용하기 위해서는 반드시 MessageSourceAccessor를 사용하도록 한다.
IMPORTANT: Frontend 가 처음 로딩 될 때 서버에서 "/noauth/messages/all" API를 호출해 시스템의 모든 메세지 리소스를 받는다. MessageBundleService에서는 config.properties 에 설정된 language-set에 해당하는 Message Properties 파일을 읽어 JSON으로 만들어 리턴한다.
== SpringWebConfig
Spring WebApplicationContext 설정을 위한 파일이다. WebMvcConfigurer를 구현하고 있으며,
Formatter, MessageConverter 등을 재정의 할 수 있다.
.xml
[source, xml]
----
<mvc:annotation-driven/>
----
@Configuration, @EnableWebMvc 를 선언하는 것으로 대체될 수 있다.
.java
[source, xml]
----
@Configuration
@EnableWebMvc
public class SpringWebConfig implements WebMvcConfigurer {
}
----
* ComponentScan
[source, java]
----
@ComponentScan(basePackages = "com.samsung", useDefaultFilters = false, includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class), @ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableSwagger2.class)})
----
@Controller, @EnableSwagger2 로 선언된 Bean을 Scan한다.
* addResourceHandlers
정적 리소스를 관리하는 ResourceHandlerRegistry에 pathPatterns와 리소스 위치를 등록한다.
[source, java]
----
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("index.html").
addResourceLocations(webResourceRoot);
registry.addResourceHandler("favicon.ico").
addResourceLocations(webResourceRoot + "static/");
registry.addResourceHandler("static/**")
.addResourceLocations(webResourceRoot + "static/");
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
----
* MultipartResolver
Multipart 요청에 대한 처리를 담당하는 Resolver다. 파일업로드의 최대 크기 등을 설정한다.
[source, java]
----
@Value("${common.upload.max-request-size:-1}")
private long maxRequestSize;
@Value("${common.upload.max-file-size:-1}")
private long maxFileSize;
@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxRequestSize(DataSize.ofBytes(maxRequestSize));
factory.setMaxFileSize(DataSize.ofBytes(maxFileSize));
return factory.createMultipartConfig();
}
----
config.properties에 설정한 multipart/form-data 최대 사이즈, 전체 업로드 파일의 최대 용량을 참조한다.