Spring/Spring Boot
-
스프링 배치 반복 및 오류 제어Spring/Spring Boot 2022. 3. 30. 23:39
Repeat 스프링 배치에서 반복을 종료할 것인지 여부를 결정하는 세가지 항목 1. RepeatStatus 스프링 배치의 처리가 끝났는지 판별 위한 열거형 CONTINUABLE, FINISEHD 2. CompletionPolicy 정상 종료를 알리는데 사용. RepeatTemplate 의 iterate 메서드 안에서 반복을 중단할지 결정 3. ExceptionHandler 비정상 종료를 알림. RepeatCallback 안에서 예외 발생시 해당 핸들러를 참조해서 예외를 다시 던질지 여부 결정 RepeatContext - 일시적으로 사용할 필요가 있는 데이터를 저장 tasklet 을 수행하다가 예외가 발생했다고 가정하자. 이 때 ExceptionHandler를 설정했다면 반복여부를 결정 할 수 있다. 설정..
-
스프링 트랜잭션 전파Spring/Spring Boot 2021. 11. 9. 23:59
트랜잭션이 이미 진행중인데, 여기에 추가로 트랜잭션을 수행하면 어떻게 될까? 기존 트랜잭션과 별도의 트랜잭션을 진행해야 할까? 아니면 기존 트랜잭션을 그대로 이어 받아서 트랜잭션을 수행해야 할까? 이런 경우 어떻게 동작할지 결정하는 것을 트랜잭션 전파(propagation)라 한다. 참고로 스프링은 다양한 트랜잭션 전파 옵션을 제공한다. 1. 외부 트랜잭션이 수행중인데, 내부 트랜잭션이 추가로 수행됨 - 기본 전파 옵션인 REQUIRED 기준 스프링에서는 이 경우 외부 트랜잭션과 내부 트랜잭션을 묶어서 하나의 트랜잭션을 만들어준다. 내부 트랜잭션이 외부 트랜잭션에 참여하는 것이며 이것이 기본 동작이고 옵션을 통해 다른 동작방식도 선택할 수 있다. 스프링은 논리 트랜잭션과 물리 트랜잭션이라는 개념을 나눈다..
-
스프링 @Transaction 이해Spring/Spring Boot 2021. 10. 29. 12:10
스프링의 트랜잭션 우리는 선언적 트랜잭션 관리를 주로 사용하는데 @Transactional` 애노테이션 하나만 선언해서 매우 편리하게 트랜잭션을 적용하는 것을 선언적 트랜잭션 관리라 하며 스프링 부트로 개발한다면 주로 이 어노테이션 방법으로 개발하게 된다. @Transaction 애노테이션을 선언한다면 스프링의 트랜잭션 AOP는 이 애노테이션을 인식해서 트랜잭션을 처리하는 프록시를 적용해준다. 구체적으로 @Transactional`애노테이션이 특정 클래스나 메서드에 하나라도 있으면 트랜잭션 AOP는 cglib 기반의 프록시 클래스를 만들어서 스프링 컨테이너에 등록한다. 따라서 실제 객체 대신에 프록시인 {클래스}$$CGLIB 을 스프링 빈으로 등록한다. 그리고 프록시는 내부에 실제 객체를 참조하게 된다...
-
[springboot, kotlin] 배포시 FileReader FileNotFoundExceptionSpring/Spring Boot 2021. 9. 28. 01:17
FileReader("src/main/resources/templates/$fileName.yaml") .readText() 로컬에서는 파일 경로를 읽어와서 잘 읽지만 쿠버네티스 파드에 JAR 패키징으로 실행한 어플리케이션 안에서는 FileNotFoundException이 발견되었다. 실행할 때 jar 로 패키징해서 실행하였다면 InputStream을 써서 읽어야 한다. File로 읽을 수 있는건 자바 메인으로 실행했을 때 파일 경로로 읽을 수 있는것이고 JAR 안에 들이었는 리소스를 클래스패스로 접근해서 읽을 때는 파일시스템에 있는 파일이 아니라 JAR 안에 있는 파일이기 때문이다. javaClass.getResourceAsStream("/data/$fileName") ?.bufferedReader(..
-
@ConfigurationPropertiesScan 과 생성자 바인딩Spring/Spring Boot 2020. 12. 15. 00:35
기존 @ConfigurationProperties application.properties에 여러 값들을 정의해 놓고 원하는 클래스에서 바인딩을 받고 싶다면 다음과 같이 프로퍼티 설정파일에 값을 이용하려면 @ConfigurationProperties 와 @Component를 통해서 선언해주었어야 했다. 혹은 다음과 같이 @EnableConfigurationProperties에 바인딩 받는 클래스를 모두 적어주어야 됐다. 실제 ApplicationRunner을 통해 확인해보면 값이 잘 바인딩된 것을 알수 있다. @ConfigurationPropertiesScan 스프링 부트 2.2 버전 이후 @ConfigurationPropertiesScan이 등장했다. 기존과 달리 @ConfigurationPropert..
-
application.properties 란?Spring/Spring Boot 2020. 8. 29. 19:21
resources 디렉터리 밑에 있게 되는 application.properties 나 application.yaml 파일은 스프링 부트가 자동으로 로딩하게 되는 규약들이다. 이러한 프로퍼티들을 사용하는 방법은 여러 가지이며 각 사용마다 우선순위가 다르므로 오버 라이딩될 수도 있다. 다음은 프로퍼티에 우선순위이다. 1. 유저 홈 디렉터리에 있는 spring-boot-dev-tools.properties 2. 테스트에 있는 @TestPropertySource 3. @SpringBootTest 애노테이션의 properties 애트리뷰트 4. 커맨드 라인 아규먼트 5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로퍼티)에 들어있는 프로퍼티 6. ServletConfig 파라미터 7...
-
Spring Boot mockMvc 한글 깨짐 처리Spring/Spring Boot 2020. 7. 31. 15:58
SpringBoot + SpringSecurity ( JWT ) 기반으로 REST 기반의 API 서버를 만드는 도중 API 문서 자동화를 위해 RestDocs를 쓰기로 결정했다. 그 외 후보로 Swagger등도 있겠지만 테스트 작성과 더불어 문서를 만들 수 있다는 점에서 RestDocs로 결정하였다. 문제는 mockMvc Test를 기반으로 문서 조각을 만들 때 Response 응답으로의 한글 처리가 깨져있다는 점이었다. 1 2 3 4 5 6 7 8 9 10 11 12 13 @Bean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter characterEncodingFilter = new CharacterEn..
-
RestTemplate, WebClientSpring/Spring Boot 2020. 7. 13. 01:56
스프링 부트는 Rest Template을 쉽게 사용할 수 있도록 빈을 등록해준다. 이때 빈은 RestTemplateBuilder를 빈으로 등록해 준다. Builder를 주입받아서 필요시마다 Build를 하고 RestClient를 생성해서 사용할 수 있다. WebClient는 WebClient.Builder를 빈으로 등록해준다. RestTemplate과 WebClient의 차이? RestTemplate Blocking I/O 기반의 Synchronous API 순서가 있는 처리 WebClient Non-Blocking I/O 기반의 Asynchronous API 순서 없는 처리 다음과 같이 "/hello" URI는 5초를 쉬고 "/world" URI는 3초를 쉬는 핸들러를 만들어보자. 그리고 이 API 서..