Tech23 SpringBoot 커스텀 프로퍼티에 대한 문서와 자동완성 ※ Spring Configuration Processor 외부설정 문서화 yml 혹은 properties 파일에 프로퍼티 설정시 SpringBoot에 이미 정의되어 있는 document랑 자동완성을 확인할 수 있다. 개발자가 커스텀한 값들에 대해서도 문서랑 자동완성ㅇ을 지원하는 방법에 대해 알아보자. Spring Configuration Processor란? application.properties, application.yml 파일 등에 넣는 커스텀 설정의 자동 완성, 도움말 등을 지원해주는 도구이다. 실습 환경 Spring Boot 3.2.0 Gradle 8.2 라이브러리 의존성 추가 dependencies { annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'.. Tech/Spring 2024. 4. 17. Jpa save vs saveAndFlush vs saveAll 안녕하세요. 회사에서 배치를 돌려 약 10만건 정도의 데이터를 삽입해야 했습니다. 1번과 2번에서 데이터를 조회 하여 데이터를 합친 후 DB에 저장하는 단순한 프로세스 였습니다. DB에 저장시 save()를 사용했다가 반나절 이상이 걸렸습니다. save()를 사용하지 않고 saveAll()로 처리 하였더니 시간이 삼분의 일로 줄어 들었습니다. 이번 기회에 Jpa에서 데이터를 저장하는 방법인 save() / saveAndFlush() / saveAll()의 차이점 대해 정리하려고 합니다. ※ 사실 벌크 삽입은 Spring JDBC의 JdbcTemplate를 이용하면 훨씬 빠르게 Batch Insert를 수행할 수 있습니다. save @Transactional @Override public S save(S .. Tech/JPA 2024. 1. 25. Jpa로 데이터 수정 작업 후 수정된 데이터를 카프카에 전송하는 방법 API를 통해 Mysql DB에서 데이터를 등록 및 수정 작업을 마친 후, 카프카를 통해 최신화된 데이터를 다른 서버에 전송하는 로직이 있다. @Service @RequiredArgsConstructor public class Service { private final KafkaService kafkaService; private final Reader reader; private final Writer writer; @Transactional public void add(Request request) { // 데이터 저장 Entity entity = writer.save(request); // 카프카로 데이터 전송 kafkaService.send(savedEntity); } @Transactional .. Tech/JPA 2023. 2. 11. 2개 이상의 DB를 사용하는 Spring Boot 환경에서 Spring Data Jpa 사용시 트랜잭션 관련 에러 한 프로젝트에서 2개 이상의 DB를 연결해서 사용하기 위한 다중 DataSource 설정을 아래와 같이 했다. @Configuration @EnableTransactionManagement(proxyTargetClass = true) @EnableJpaRepositories( entityManagerFactoryRef = "aJpaEntityManagerFactory", basePackages = {"com.soap.repository"} ) public class ADbConfig { @Bean(name = "aDataSource") @ConfigurationProperties(prefix = "spring.a.datasource") public DataSource aDataSource() { retu.. Tech/Spring 2023. 1. 29. 요청으로 들어온 language 값에 따른 GlobalExceptioner에서 다국어 처리 (i18n, yml) + spring validaiton 다국어처리 기록용 직접 정의한 헤더값의 language값에 따른 예외처리 메시지 다중화 applicaiton.yml spring: messages: basename: i18n/exception encoding: UTF-8 resources/i18n/exception_eng.yml ※ 다른 포맷 사용시 그에 따른 값으로 변경 # exception_eng.yml unKnown: code: "-9999" msg: "An unknown error has occurred. SadPepe :(" userNotFound: code: "-1000" msg: "This member not exist. SadPepe :(" resources/i18n/exception_kor.yml ※ 다른 포맷 사용시 그에 따른 값으로 변경 # e.. Tech/Spring 2022. 5. 23. Validation 클래스 단위 제약과 조건부 검사 설정 POST 컨트롤러 호출시 @RequestBody로 요청받는 Request의 dto는 다음과 같습니다. public class Request { private String name; private ColorType colrType; private String redApple; private String greenApple; private String redOrange; private String greenOrange; //getter, setter ... public enum ColorType { RED, GREEN } colorType의 값이 RED면 redApple과 redOrange의 값은 필수, GREEN면 greenApple과 greenOrange의 값에 대한 필수값 체크를 하고 싶었습니다. 우선.. Tech/Spring 2021. 12. 22. git submodule 추가후 빌드시 resources 폴더에 yml 추가 구글링해서 조사해보면 설정방법은 많이 나오니 생략.. 내가 2~3 시간째 삽질한걸 기록 processResources.dependsOn('copySecret') task copySecret(type: Copy) { from './submodule/application-aws-s3.yml' //submoduole에 추가한 노출되면 안되는 파일 into './src/main/resources' //build시 from에 지정한 경로의 파일을 복사할 위치 } 계속 구글링 하다보면 여기까지 설정한 자신을 볼 수 있다. 문제는 gradle에서 아무리 build하고 jar파일을 까봐도 yml이 없었음;; gradle을 리로드 하면 task {작업명} 으로 입력한 copySecret가 other 쪽에 추가된걸 확인할.. Tech/Gradle 2021. 12. 18. SpirngBoot 기준 Gradle 멀티 모듈 세팅 gradle init settings.gradle 설정 /* * This file was generated by the Gradle 'init' task. * * The settings file is used to specify which projects to include in your build. * * Detailed information about configuring a multi-project build in Gradle can be found * in the user manual at https://docs.gradle.org/6.8.3/userguide/multi_project_builds.html */ rootProject.name = 'security' ["comp", "web", "s.. Tech/Gradle 2021. 12. 17. detached entity passed to persist 에러 public static Apple 잠금해제상태_스케줄_생성() { return Apple.builder() .id(1) .name("사과") .build(); } 테스트코드에서 Fixture로 Apple 엔티티를 생성할려구 했다. @AllArgsConstructor @NoArgsConstructor( access = AccessLevel.PROTECTED ) @Builder @Entity public class Apple { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; //... 엔티티 설정은 다음과 같다. JpaRepository를 상속받아 save()메소드로 생성한 엔티티를 저장할려구 했는데 detached ent.. Tech/JPA 2021. 12. 1. Mybatis와 Jpa 사용시 트랜잭션 묶어서 사용하는 방법(※ 멀티 datasource 설정 / QueryDsl) JPA와 Mybatis를 동시에 사용하고 있다. 두 기술의 트랜잭션을 서로 공유하면서 사용하고 있는데 세팅한 방법을 기술한다. 실무에선 2개 이상의 데이터베이스를 한프로젝트에서 사용한다. application.yml에서는 아래와 같이 세팅한다 spring: ${보통 DB이름}: //자유롭게 입력 datasource: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: ${DB URL} username: ${DB 계정이름} password: ${DB 계정비밀번호} hikari: poolName: ${poolName} //자유롭게 입력 connectionTimeout: ?? maximumPoolS.. Tech/Spring 2021. 7. 24. Spring Filter에서 request Body 가공하기 목적 : 컨텐츠 검색시 싱글쿼터( ' )가 포함된 검색어가 있는경우 \를 붙여주기 마이바티스를 사용할수 밖에 없는 쿼리이며 mysql은 자바처럼 싱글쿼터를 \을 붙여줘야 인식하기 때문에 특정 컨트롤러에서 치환해도 되지만 공부할겸 필터에서 가공하는 코드를 작성해봤다. @ServletComponentScan @SpringBootApplication public class TestApplication { public static void main(String[] args) { SpringApplication.run(VodmanagerApplication.class); } } @ServletComponentScan 등록 등록해야 @WebFilter, @WebListener and @WebServlet 주석을 s.. Tech/Spring 2021. 7. 19. 실무에서 mybatis to querydsl 변환시 사용한 querydsl 문법 1. concat 사용 concat('http://', a.example1, '/', a.example2, '/', a.example3, '/abc.com') to Expressions.asString("http://").concat(QEntity.example1).concat(".").concat("abc) .concat("/").concat(QEntity.example2).concat("/").concat(QEntity.example3).concat("/abc.com").as("url") 보통 Qentity.example.concat("/").. 이런식으로 했는데 첫단어부터 상수를 써야되서 난감했다. 하지만 갓오버플로우로 해결!! 2. Expression.numberTemplate select uni.. Tech/QueryDSL 2021. 7. 14. 이전 1 2 다음