Spring
-
스프링 배치 반복 및 오류 제어Spring/Spring Boot 2022. 3. 30. 23:39
Repeat 스프링 배치에서 반복을 종료할 것인지 여부를 결정하는 세가지 항목 1. RepeatStatus 스프링 배치의 처리가 끝났는지 판별 위한 열거형 CONTINUABLE, FINISEHD 2. CompletionPolicy 정상 종료를 알리는데 사용. RepeatTemplate 의 iterate 메서드 안에서 반복을 중단할지 결정 3. ExceptionHandler 비정상 종료를 알림. RepeatCallback 안에서 예외 발생시 해당 핸들러를 참조해서 예외를 다시 던질지 여부 결정 RepeatContext - 일시적으로 사용할 필요가 있는 데이터를 저장 tasklet 을 수행하다가 예외가 발생했다고 가정하자. 이 때 ExceptionHandler를 설정했다면 반복여부를 결정 할 수 있다. 설정..
-
SubscribeOn , PublishOnSpring/Spring 2021. 12. 23. 10:28
1. SubscribeOn 와 PublishOn이 혼용된 코드 1.1. Code 1 2 3 4 5 6 Flux.range(1,5) .publishOn(Schedulers.newSingle("pub1")) .map(i -> i * 10) .subscribeOn(Schedulers.newSingle("sub1")) .log() .subscribe(); cs subscribeOn 이후에 log() 를 봐보자. 어떤 쓰레드에서 log() 가 실행될까? 리엑터 공식 문서를 보면 subscribeOn을 호출한 객체를 구독할 때는 해당 스트림 전체가 해당 스케쥴러로 다 바뀐다고 하였다. 따라서 "sub1" 이라는 쓰레드에서 실행이 될까? 아니면 그 위에 publishOn에 의해 "pub1" 이라는 쓰레드에서 실행 될..
-
스프링 트랜잭션 전파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(..
-
1주차 스프링 스터디Spring/Spring 2021. 4. 19. 22:11
스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크 객체 지향 프로그래밍? 객체 지향 프로그래밍은 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 객체 지향 프로그래밍을 위한 세가지 요소 캡슐화 다형성 상속 캡슐화 객체 지향의 중요한 원리는 캡슐화이다. 캡슐화는 외부에서 알 필요가 없는 부분을 감춤으로써 대상을 단순화하는 추상화의 한 종류다. 객체는 자신이 어떤 데이터를 가지고 있는지를 내부에 캡슐화하고 외부에 공개해서는 안된다. 객체는 스스로의 상태를 책임져야 하며 외부에서는 인터..
-
@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...