javax → jakarta (persistence, annotation, servlet,
swagger
- springfox → springdoc-openapi-ui
restTemplate,
- httpClient4.x → httpClient 5.x
PropertyNamingStrategy.SnakeCaseStrategy.class → PropertyNamingStrategies.SnakeCaseStrategy.class
JPA properties 변경
// JAVA config properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); properties.put( "hibernate.implicit_naming_strategy", "org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl"); // hibernate 6에 // 맞게 변경 properties.put( "hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy"); // application.yml # jpa 설정 jpa: database: postgresql hibernate: ddl-auto: none naming: physical-strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategy
@PropertySource에 관한 설정
- common 모듈을 다른 모든 모듈이 의존하고 있고 이 common 모듈의 resources 안에 있는 application-common.yml을 다른 모듈이 공유할 수 있도록 했으면 좋겠는 상황이 발생했다. (완전히 공통으로 필요한 속성들만 해당 파일에 정의)
- 처음에는 그냥 각 모듈의 application.yml에 필요한 설정값을 복붙해서 실행했는데 이렇게 하면 나중에 어떤 값이 변경될 시 파일을 다 찾아서 고쳐야 해서 실수의 위험이 커지는 안 좋은 방법이라는 생각이 들었다.
- 원래는 application-${profile}.yml의 방식으로 profile별 설정 파일을 나누어 두었는데 이를 아래와 같은 형태로 통합해서 쓰려고 하다보니 발생한 문제였다.
spring: config: activate: on-profile: dev
- build.gradle에 sourceSets 설정 추가, @PropertySource() 추가 등 생쇼를 해봤는데 application.yml에 아래 내용을 추가하는 것이 제일 간편하고 쉬운 방법이었다. 이 설정을 사용하면 dev, prod 등 —-으로 나누어둔 프로파일도 자동으로 읽힌다.
spring: config: import: classpath:application-common.yml
- 이걸 안 이상 별로 쓸모는 없는 지식이지만 @PropertySource를 사용하면 yaml을 기본적으로 못 읽는다. 그래서 변환해줄 수 있는 Factory 클래스를 만들어서 써야 한다.
@PropertySource(value = {"classpath:application.yml", "classpath:application-common.yml"}, factory = YamlPropertySourceFactory.class) // 이 어노테이션을 필요한 곳에 붙인다.
import jakarta.annotation.Nullable; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.core.env.PropertiesPropertySource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.support.DefaultPropertySourceFactory; import org.springframework.core.io.support.EncodedResource; import java.io.IOException; import java.util.Objects; public class YamlPropertySourceFactory extends DefaultPropertySourceFactory { @Override public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException { YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); factory.setResources(resource.getResource()); return new PropertiesPropertySource(Objects.requireNonNull(resource.getResource().getFilename()), Objects.requireNonNull(factory.getObject())); } } // 이런 형태의 Factory 클래스를 만들어준다.
스프링 배치 문법 변경점
잡 리스너 변경
아래는 postgresql용 migration script
ALTER TABLE BATCH_STEP_EXECUTION ADD CREATE_TIME TIMESTAMP NOT NULL DEFAULT '1970-01-01 00:00:00'; ALTER TABLE BATCH_STEP_EXECUTION ALTER COLUMN START_TIME DROP NOT NULL; ALTER TABLE BATCH_JOB_EXECUTION_PARAMS DROP COLUMN DATE_VAL; ALTER TABLE BATCH_JOB_EXECUTION_PARAMS DROP COLUMN LONG_VAL; ALTER TABLE BATCH_JOB_EXECUTION_PARAMS DROP COLUMN DOUBLE_VAL; ALTER TABLE BATCH_JOB_EXECUTION_PARAMS ALTER COLUMN TYPE_CD TYPE VARCHAR(100); ALTER TABLE BATCH_JOB_EXECUTION_PARAMS RENAME TYPE_CD TO PARAMETER_TYPE; ALTER TABLE BATCH_JOB_EXECUTION_PARAMS ALTER COLUMN KEY_NAME TYPE VARCHAR(100); ALTER TABLE BATCH_JOB_EXECUTION_PARAMS RENAME KEY_NAME TO PARAMETER_NAME; ALTER TABLE BATCH_JOB_EXECUTION_PARAMS ALTER COLUMN STRING_VAL TYPE VARCHAR(2500); ALTER TABLE BATCH_JOB_EXECUTION_PARAMS RENAME STRING_VAL TO PARAMETER_VALUE;