SPRING

    JPA 사용 시 Mysql 1356 Error 발생 해결 과정

    발생 배경 spring boot, spring starter jpa, hibernate, mysql을 사용하여 jpa를 적용 하려고 했어요. 작업을 진행하는 과정에서 jpa를 통해 테이블 생성을 하기 위해 로컬 mysql으로 url을 설정하여 Entity 클래스를 정의하고, Querydsl까지 정상작동 하는것을 확인 했어요. 그 후 필요한 DB에 적용하기 위해 해당 테이블을 생성한 후, application.yml 파일에 spring.jpa.hibernate.ddl-auto: validate 설정을 했답니다. 아니 근데..! 아래와 같은 에러가 출력이 되더라구요!!! org.springframework.beans.factory.BeanCreationException: Error creating bean ..

    Spring Integration 개요

    Spring Integration 스프링 인테그레이션은 Enterprise Integration Patterns를 지원하기 위한 스프링 프로그래밍 모델 혹은 컴포넌트 이다. 리모팅, 메세징, 스케쥴링등의 고수준 추상화를 제공한다. Message Message는 스프링이 핸들링 하기 위한 메타데이터와 함께 자바 오브젝트를 갖는 래퍼 클래스이다. 헤더와 페이로드로 구성되어 있고, 페이로드는 어느 자바 오브젝트든 받을 수 있다. 헤더는 공통으로 사용하는 정보이다 예를들면 ID, 타임스탬프 등.. 예를들어 수신한 파일을 메세지로 만들 때, 파일이름은 헤더에 저장된다. 개발자는 임의의 key-value쌍을 헤더에 저장할 수 있다. Message Channel 프로듀서는 메세지를 채널로 보내고, 컨슈머는 채널로부터..

    SpringBoot JpaRepository 를 Dependency Scan 에서 찾지 못할때

    현재 제 프로젝트는 멀티모듈 구조로 구성되어 있습니다. root(@SpringBootApplication 어노테이션이 붙은 Application.java 위치) -- shared -- diary -- 기타 등등.. JPA 설정 @ConfigurationPropertiesScan(basePackages = "com.seya330.anything") @SpringBootApplication(scanBasePackages = "com.seya330.anything") public class AnythingApplication { public static void main(String[] args) { SpringApplication.run(AnythingApplication.class, args); } } @..

    Spring Retry

    retry 사용 @EnableRetry @EnableRetry // retry 를 사용하려면 해당 어노테이션이 필요하다. @Configuration public class ConfigClass { } @Retryable @Retryable( value = {RuntimeException.class}, maxAttempts = 2, backoff = @Backoff(delay = 2000) ) public void method(Param param){ ... } RuntimeException 발생시 재시도 한다. 최대 2번 재시도 한다. (default = 3) 2초의 텀을 두고 재실행 한다. (default = 1초) @Recover @Recover public void recoverMethod(Runt..

    Spring Batch FaultTolerance (장애 허용)

    FaultTolerance 스프링 배치를 사용시 어떠한 Exception 이 발생시 중단 후 실패처리를 하지 않고, 그대로 배치 잡을 계속해서 실행하고 싶을 때 사용한다. stepBuilderFactory.get("step") .chunk(3) .faultTolerant() .skip(Exception.class) .skipLimit(Integer.MAX_VALUE) - Exception.class 및 그 하위 Exception이 발생했을때, 중단처리 하지 않고 계속 진행한다. - skipLimit 횟수 만큼 Exception 발생을 용인 한다. ProcessorNonTransactional 위와 같이 청크단위 처리방식의 배치를 사용하는 경우 청크단위로 트랜잭션이 처리가 되어진다.(insert or up..

    Spring Envers 로 자동 이력 관리

    @EnableJpaAuditing 설정 클래스에 적용 함으로써 JPA 이력관리를 사용하도록 설정한다. @Audited @Audited(withModifiedFlag = true) @Entity public class Person { @Id @GeneratedValue private Long id; @Embedded private AuditMetadata auditMetadata; } @Embeddable public class AuditMetadata { @CreatedBy private Integer registeredBy; @CreatedDate private LocalDateTime registeredAt; @LastModifiedBy private Integer updatedBy; @LastMod..

    Spring Event

    Spring Event 특정 이벤트를 발행(publish) 하면, 해당 이벤트가 발행되기를 대기하고 있던 리스너가 실행된다. 이벤트 발행 클래스와 리스너 클래스간 코드 의존성이 없다. 리스너 실행을 비동기로 실행할 수 있다. 이벤트 클래스 public class CustomEvent extends ApplicationEvent { @Getter private String message; public CustomEvent(Object source, String message) { super(source); this.message = message; } } ApplicationEvent 를 상속받는다. super 생성자를 반드시 실행해 줘야 한다. 이벤트 발행자(publisher) 클래스 @RequiredA..

    Spring 메소드 실행 실패시 재실행

    Spring Retry 메서드가 실패 하였을때 재 실행 할 수 있도록 도와주는 Spring AOP의 일종 이다. 네트워크 호출과 같은 일시적 문제가 있을 경우 사용한다. build.gradle Dependency 추가 implementation group: 'org.springframework.retry', name: 'spring-retry', version: '1.3.1'Retry 사용이 가능하도록 annotation 설정 @EnableRetry @SpringBootApplication public class RanchatApplication { public static void main(String[] args) { SpringApplication.run(..

    Spring Rest Docs 사용법

    Spring Rest Doc?? 기존에 사용하던 Swagger는 소스코드의 작동과는 연관이 거의 없기 때문에, 로직이 변경 되더라도 api 명세 어노테이션 등을 변경해주지 않으면 최신화가 되지 않는 문제가 있다. Spring Rest Docs 를 이용하면 반드시 테스트코드가 통과 해야 문서가 생성된다.(asciiDoc 이 생성) 따라서 api 문서의 정확성이 보장된다. asciiDoc?? markdown 과 같이 특정 표현식을 통해 문서를 작성하는 도구이다. 개인적인 생각으론 markdown 에 비해 사용성은 불편하지만, include와 같은 기능을 통해 api명세를 만들기엔 좋은 것 같다. (markdown이 include를 지원하게 되면 markdown 이 더 좋을듯...) RestDocs를 사용하기..

    Spring Batch

    1. Job은 하나의 배치 작업 단위를 얘기한다. 2. 하나의 Job은 여러개의 Step을 가지고 있다. 3. step 은 tasklet 이나 reader, processor, writer 묶음을 가지고 있을 수 있다. tasklet 과 reader, processor, writer 묶음은 같은 레벨이므로 reader > processor > tasklet 등으로 끝낼 순 없다. 4. reader, processor, writer 묶음으로 처리하는 방식을 chunk 지향 처리 방식 이라 한다. 5. ItemReader, ItemProcessor, ItemWriter 를 구현하여 각 컴포넌트 를 작성 해야 한다. stepBuilderFactory.get("name") .chunk(2) .reader(rea..