이전 버전 Swagger 2.0 적용 방법 https://devfunny.tistory.com/313 SpringBoot에 Swagger을 빠르게 적용해보기 Swagger 요즘 백엔드 개발은 ModelAndView 방식보다는 API 위주의 어플리케이션을 권장하고 있다. API 개발이 많아짐에 따라, 프로젝트 안의 API를 관리할 수 있는 문서가 필요해졌다. API 문서를 만들 devfunny.tistory.com Swagger 3.0 적용 1) build.gradle implementation 'io.springfox:springfox-boot-starter:3.0.0' 2) SwaggerConfig.java package com.api.shop.config; import org.springframewo..
람다표현식 메서드를 하나의 식(expression)으로 표현한 것이다. 메서드를 람다식으로 표현하면 메서드 이름과 반환값이 존재하지 않기 때문에 이를 '익명함수' 라고도 한다. 람다표현식의 뜻을 글로만 보면 감이 안올 수 있다. 아래 예제로 어떤식으로 람다표현식이 사용되는지 눈으로 확인하자. 람다식 예제 import dto.SampleDto; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class Basic { private void test() { List sampleDtoList = new ArrayList(); // 람다식 사용 sampleDtoList.sort( (SampleDto sam..
JobLauncherApplicationRunner - 스프링 배치 작업을 시작하는 ApplicationRunner 이고 ApplicationRunner의 구현체로, 어플리케이션이 정상적으로 구동되자마자 실행된다. - BatchAutoConfiguration 에서 생성된다. - 기본적으로 빈으로 등록된 모든 job을 실행시킨다. 사용자가 Job Name을 지정하여 실행시키고싶은 Job만 실행시킬 수 없을까? 예제코드 application.yml ... spring: batch: jdbc: # schema-mysql.sql 항상 실행 initialize-schema: always job: enabled: false # spring batch 자동실행 방지 names: ${job.name:NONE} Run/..
jobLauncher - 배치 Job을 실행시키는 역할을 한다. - jobLauncher.run(job, jobParameter); 로직으로 배치를 수행한다. job, jobParameter 를 인자로 받아서 jobExecution을 결과로 반환한다. - 스프링 배치가 실행되면 jobLauncher 빈을 생성하고, jobLauncherApplicationRunner가 자동적으로 jobLauncher을 실행시킨다. 예제코드 JobLauncherConfiguration.java package com.spring.batch.job; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springf..
StepContribution - chunk 프로세스의 변경 사항을 버퍼링한 후 StepExecution 의 상태를 업데이트하는 도메인 객체다. - BATCH_STEP_EXECUTION 테이블을 한번 확인하고 오자. https://devfunny.tistory.com/477?category=820618 스프링배치가 제공하는 배치 메타데이터 저장 테이블 (BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION, BATCH_JOB_EXEC JobRepository 스프링 배치가 제공하는 여러 데이터베이스 테이블을 사용하여 배치 메타데이터를 저장한다. 총 6개의 테이블이 존재하는데, 각 테이블 정보에 대해 알아보자. BATCH_JOB_INSTANCE 테이블 devfunny.tistory.com..
상황 Member, Category, Member_Category 총 3개의 테이블이 있다. 위 테이블을 보면 아래 컬럼 3개가 중복된다. 1) reg_dts 2) mod_dts 3) is_deleted JPA 클래스 상속으로 중복 컬럼 처리 BaseEntity.java package com.api.plan.entity.base; import javax.persistence.MappedSuperclass; @MappedSuperclass public abstract class BaseEntity { private String regDts; private String modDts; private String isDeleted; } Member.java package com.api.plan.entity; i..
SpringBoot Project 1. build.gradle runtimeOnly 'org.postgresql:postgresql' 2. application.yml spring: # Postgres Database datasource: url: jdbc:postgresql://localhost:5432/devplan username: plan password: plan driver-class-name: org.postgresql.Driver # JPA jpa: hibernate: ddl-auto: create # 자동으로 테이블 생성 (drop -> create) properties: hibernate: format_sql: true Mac 터미널로 Postgresql 설치 1) 터미널에서 postg..
들어가기전 지난 포스팅에서 JobExecution에 대해 알아보았다. 이를 먼저 인지한 후 StepExecution에 대해 알아보자. https://devfunny.tistory.com/680?category=820618 SpringBatch 에서 JobInstance, JobExecution 의 관계 들어가기전 JobInstance, JobExecution 의 개념은 알고가자. https://devfunny.tistory.com/476?category=820618 [스프링배치] 잡의 실행 (JobLauncher, JobInstance, JobExecution, JobParameters) 잡의 실행 잡.. devfunny.tistory.com 예제코드 StepExecutionConfiguration.ja..
가비지 컬렉션 (Garbage Collection) 유효하지 않은 메모리(Garbage)를 자동으로 제거해주는 작업이다. Java Appliation은 JVM(Java Virtual Machine)위에서 구동되는데, JVM의 기능 중 더이상 사용하지 않는 객체를 청소하여 메모리 공간을 확보하는 작업이다. GC가 필요한 이유는? Heap 영역에 저장되는 객체들이 계속해서 쌓이게되면 OutOfMemoryException이 발생하여, 이를 방지하기 위해 주기적으로 사용하지 않는 객체를 수집하여 제거해줘야한다. 예제 Test test = new Test(); test.setId(1L); test.setName("seohae"); testRepository.save(test); test = null; // 더이상..
들어가기전 JobInstance, JobExecution 의 개념은 알고가자. https://devfunny.tistory.com/476?category=820618 [스프링배치] 잡의 실행 (JobLauncher, JobInstance, JobExecution, JobParameters) 잡의 실행 잡의 실행은 잡 러너 (Job Runner) 에서 시작된다. 잡 러너는 잡 이름과 여러 파라미터를 받아, 잡을 실행시킨다. 스프링 배치는 2가지 잡 러너를 제공한다. 1) CommandLineJobRunner 스크립트를 devfunny.tistory.com 예제코드 JobExecutionConfiguration package com.spring.batch.job; import lombok.RequiredAr..
Stream 코드 /* num sum */ int numSum = param.chars() .filter(Character::isDigit) .map(a -> Character.digit(a, 10)) .sum(); 결과 param = "K1C57PQR" numSum = 13 (1 + 5 + 7)
Stream 코드 String chars = param.chars() .sorted() .mapToObj(ch -> (char) ch) // Stream .filter(ch -> !Character.isDigit(ch)) .map(Object::toString) .collect(Collectors.joining()); 각 단계별로 Stream 형태 확인 결과 param = "AC2B332" chars = "ABC"