공부/Spring

    [Spring Batch] Spring Batch 기본 개념 및 용어 정리

    [Spring Batch] Spring Batch 기본 개념 및 용어 정리

    Batch 란 Batch는 일괄처리란 뜻을 가지고 있다. 사용자와 상호작용 없이 여러 개의 작업을 미리 정해진 순서에 따라 중단없이 처리한다. 배치를 사용하기 위해서는 다음과 같은 조건이 만족해야한다. 대용량 데이터 : 대용량의 데이터를 가져오기, 전달하기, 계산하기 등의 처리 자동화 : 사용자 개입없이 자동으로 실행 견고성 : 잘못된 데이터를 충돌/중단 없이 처리하기 신뢰성 : 잘못된 내용을 추적 가능해야함 (로깅, 알림) 성능 : 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션과 방해되지 않게 처리 배치 타입 Spring Batch 용어 Job Job은 배치처리 과정을 하나의 단위로 만들어 놓은 객체입니다. 또한 배치처리 과정에 있어 전체 계층 최상단에 위치하고 있습니다. Job..

    [Spring Batch] @JobScope 와 @StepScope 개념 및 예제

    @JobScope 와 @StepScope @JobScope 와 @StepScope는 스프링의 기본 Scope 인 싱글톤과 대치되는 역할이다. @JobScope 와 @StepScope이 선언되면 Bean의 생성 시점이 애프리케이션이 구동되는 시점이 아닌 Bean의 실행 시점에서 이루어진다. @JobScope, @StepScope이 명시된 메서드가 실행될 때까지 지연시키는 것을 의미한다. 이러한 행위는 Late Binding 이라고 한다. Scope 란 스프링 컨테이너에서 빈이 관리되는 범위를 뜻한다. @JobScope Step 선언시에 사용한다. @Value : JobParameter, jobExecutionContext만 사용이 가능하다. @StepScope Tasklet 이나 ItemReader, It..

    [Spring] Could not resolve placeholder 'datasource.host' in value

    [Spring] Could not resolve placeholder 'datasource.host' in value

    프로젝트를 새로 만들면서 프로젝트 실행을 위해 빌드했는데 Could not resolve placeholder 'datasource.host' in value 해당 오류가 나면서 빌드 에러가 났다. 해결 방법은 생각보다 간단하다. Edit Configuration > Environment variables 에 SPRING_PROFILES_ACTIVE 값을 추가 시켜 주면 된다. application.yaml spring: devtools: livereload: enabled: true restart: enabled: false config: activate: on-profile: local

    [Spring] Swagger Error - Failed to load API definition.

    [Spring] Swagger Error - Failed to load API definition.

    Failed to load API definition. Fetch error undefined http://localhost:8080/v3/api-docs Spring 에서 Swagger3을 사용하고 있는데 해당 오류가 발생했다. 해결 방법 (1) Spring Security도 사용하고 있어서 permitAll()을 사용했다. ... .antMatchers("/swagger-ui/**", "/v3/api-docs/").permitAll(); 해결 방법 (2) permitAll을 사용해도 안된다면 @ApiImplicitParam 이라는 어노테이션을 사용하고 있을때 @RequestBody와 요구되는 Param이 일치하지 않아서 생기는 오류일 수 있어서 해당 부분도 확인해보면 좋다.

    [JPA] Swagger Error - [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

    Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause 이유 NullPointerException이 발생한 이유는 Query 조건 중에 Null이 들어갔기 때문이다. 해결방법 쿼리에 Null이 안들어가도록 수정해주면 된다.

    [Spring] Spring HATEOAS란

    [Spring] Spring HATEOAS란

    HATEOAS란 Hypermedia As The Engine Of Application State 약자로 REST API의 필수 구성요소 중 하나이다. Spring HATEOAS 는 스프링 프로젝트중에 하나인데 이 프로젝트의 목적은 REST API를 보다 쉽고 편리하게 사용할 수 있게 일종의 툴을 제공해주는 프레임워크이다. REST API를 사용하는 클라이언트가 전적으로 서버와 동적인 상호작용이 가능하도록 하는것을 의미하는데 이러한 방법은 특정 API 요청 시 어떠한 행동을 할 수 있는지 URL을 전달하여 클라이언트가 참고해 사용할 수 있고 리소스 정보 뿐만 아니라 리소스 상태에 따라 다양한 링크 정보가 바뀌며 동적으로 리소스를 구성한다. 즉, 높은 수준에서 클라이언트와 서버를 분리시키고, 의존성을 줄여..

    [JPA] List to Page - List를 Page로 변환해서 사용하기

    JPA 에서 제공하는 Page를 사용하고 싶은데 데이터를 가공해서 사용하다 보니 List 로 결과가 나오고 있어서 List를 Page로 변환해서 사용하고자 한다. 아래 코드를 참고해서 List 를 Page로 변환해서 사용하면 된다. 방법1 Page pageResult = (Page) PageUtils.makePageResponse(list, pageable); 페이징 처리를 위한 공통 코드 public static Page makePageResponse(List list, Pageable paging, int totalCount) { try { return (new PageImpl(list, paging, totalCount)); } catch (Exception e) { return (new PageI..

    [JPA] JsonMappingException: Infinite recursion (StackOverflowError) 오류

    [JPA] JsonMappingException: Infinite recursion (StackOverflowError) 오류

    이슈 원인 Member 엔티티와 Company 엔티티간의 연관관계가 있는데 Company 엔티티에서 JSON으로 반환하는 과정에서 생긴에러로 Company에더 LAZY JOIN을 해도 JSON으로 변환하는 중 직렬화(serialize) 과정을 거치는데 Member에 Company가 있어서 Company를 참조하고, Company에 있는 Member 를 참조하면서 무한 재귀가 발생했다. 해결방법 @JsonIgnore 참조하는 엔티티에서 (재귀를 일으키는) 필드에 @JsonIgnore 를 추가한다. DTO 생성 엔티티로 반환하지 않고 리턴용 DTO를 따로 만들어서 사용한다. 해결 나는 두번째 해결 방법인 DTO로 반환해도 해당 문제가 생겼는데 DTO 에서 엔티티 정보 전체를 가져오는게 있다보니 생기는 문제였..

    실전! 스프링 데이터 JPA 내용 정리 - 섹션 4(1)

    실전! 스프링 데이터 JPA 내용 정리 - 섹션 4(1)

    실무에서 JPA를 사용하는데 개념적인 부분을 집고 넘어가면 좋을 것 같아서 강의를 보게 되었고 인프런 강의를 보고 내용 정리를 해보았다. 프로젝트 어노테이션 @NoArgsConstructor(AccessLevel.PROTECTED) 엔티티에서 레벨을 protected 까지로 한다 Protected 로 설정하는 이유는 무분별한 객체 생성에 대해 한번 더 체크할 수 있게 한다. 그러나 @Builder와 같이 사용하고 싶다면 AllArgsConstructor 와 같이 사용하거나 @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) 안에 @Builder를 계속적으로 선언해서 사용해야한다. @Builder 를 사용하면 의미있..

    [JPA] COALESCE - @Query에서 sum()사용시 Null 을 0으로

    [JPA] COALESCE - @Query에서 sum()사용시 Null 을 0으로

    @Query에서 sum 을 사용하는데 결과가 Null이 나오는 데이터를 0으로 반환하고 싶다면 COALESCE 을 사용해준다. COALESCE 는 null이 아니면 첫번째 값, null 이면 두번째 값을 반환한다. @Query("select COALESCE(sum(c.price),0) from Calculate c where c.companyId = :companyId")