공부/Spring

    [Gradle] Gradlew 빌드 시 gradle 다운로드 속도가 느릴 때

    이미지 빌드 중 ./gradlew 실행을 위해 gradle 다운로드하는데 시간이 너무 오래걸리는 문제가 있었다. 빠를때도 있고 느릴때도 있었는데 계속 기다릴 수 없기에... 해결해보는걸로 하자. 찾아보니 종종 배포파일 다운로드가 느리다는 것 같았다. 해결 방법으로는 다운로드 받는 gradle 주소를 변경해서 진행하면 된다. 파일 위치는 gradle/wrapper/gradle-wrapper.properties 에 있고 distributionUrl 에 있는 주소를 변경해주면 된다. Downloading https://services.gradle.org/distributions/gradle-[버전]-bin.zip Downloading https://downloads.gradle.org/distributions..

    [Spring] Thread Pool - pool size설정

    Thread Pool Thread Pool 은 여러 개의 쓰레드를 유지하고 관리하기 위해 사용된다. Thread Pool 의 사이즈 쓰레드를 불필요하게 많이 만들게 되면 메모리의 낭비가 심해지고 너무 적은 수의 쓰레드를 만들게 되면 효율성이 떨어진다. 쓰레드의 개수를 고정 시키는 것보다 서비스가 실행되는 CPU의 코어 개수에 따라 유동적으로 생성할 수 있도록 해주는 것이 좋다. 많이 생성하는 것이 아니라 어떤 작업을 처리하느냐에 따라 기준이 바뀔 수 있다. CPU 처리가 많은 경우 - CPU 코어가 N개인 경우 N+1만큼의 쓰레드를 생성해주면 최적에 가까운 성능을 낼 수 있다고도 한다. I/O 작업이 많은 경우 - N*2 만큼의 쓰레드를 생성해준다.

    [Querydsl] Resolved [com.querydsl.core.types.ExpressionException ~ ]

    selet 문에 내가 원하는 값으로 리턴하기 위해 Querydsl 에서 Projections.fileds를 사용하는데 다음과 같은 에러가 발생했었다. @Override public List getMasterIdList(Long memberId) { return jpaQueryFactory.select( Projections.fields(AnswerDTO.class, answer.answerId.as("answerId"), answer.answerId.count().coalesce(0L).as("answerCount")) ) .from(answer) .where(answer.mberId.eq(memberId)) .fetch(); } Projections의 경우 생성자 기반이 아닌 필드 기반으로 가져올 때 ..

    [Spring] Spring 3버전에 Springdoc 라이브러리를 사용해 swagger 적용하기

    Springfox가 아닌 Springdoc으로 Swgger를 사용하는 이유 이전 Spring 에서 swagger를 사용할 때 springfox를 사용했는데 springdoc 에서 제공하는 swagger를 더 선호한다고해서 사용해보았다. springdoc는 webflux도 지원하며 더 사용하기 쉽다고 한다. Springdoc 사용하기 spring boot버전에 따라서 springdoc코드를 추가한다. spring boot 3버전부터 springdoc 2버전을 사용해야지 오류가 안난다. build.gradle //swagger implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' config 파일 Springdoc에서는 config..

    [Spring] 멀티 모듈 사용하기 - 루트 프로젝트에 자식 의존성 추가하기

    [Spring] 멀티 모듈 사용하기 - 루트 프로젝트에 자식 의존성 추가하기

    멀티모듈 사용하는 이유 서버를 여러개(api용, batch 용 등)를 사용하면 프로젝트를 여러개 만들어 사용하는데 프로젝트를 여러개 사용하는 경우 공통 코드를 사용할때 모든 프로젝트의 코드를 수정해주어야 한다. 이러한 불편한 점을 해결하기 위해서 멀티모듈을 사용하고자 한다. 멀티 모듈을 사용하면 코드를 분리해서 사용하기에 프로젝트별 코드 관리가 용이하다. 루트 프로젝트 생성하기 모듈을 담기 위한 루트 프로젝트를 생성하고 루트 프로젝트 안에서 모듈을 추가한다. 루트 프로젝트는 하위 모듈을 관리하는 역할만 하기 때문에 src 폴더를 삭제해도 된다. 모듈 추가하기 project 우클릭 > new > module 모듈을 추가한다. 모듈 추가 후 자식 모듈과 통신을 위해 루트 프로젝트 settings.gradle..

    [Spring] jasypt 사용하기

    [Spring] jasypt 사용하기

    jasypt란 jasypt , 자시프트라고 읽는다고 한다. jasypt 는 자바 라이브러리로 쉽게 암호화 기능을 사용할 수 있도록 한다. DB 계정이나 중요한 키값을 평문으로 올리는 것이 아닌 암호화해서 올릴 수 있게하는 라이브러리로 스프링 프로젝트의 application.yaml 에서 중요 정보를 암호화할 때 많이 사용된다. 의존성 추가하기 mvn repository 에서 원하는 버전을 선택한다. https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4' config 파일 만..

    [Spring] Spring Batch 의 Meta-Data Schema 정보

    [Spring] Spring Batch 의 Meta-Data Schema 정보

    Meta-Data Schema 스프링 배치의 실행, 관리를 위한 목적으로 도메인의 정보를 정할 수 있는 스키마를 제공한다. 스프링 배치 라이브러리에서 DB 스키마를 제공한다. 해당 스키마는 모니터링 용도로만 사용되는 것이 아닌 실제 배치 작업이 실행되는 동안 사용되는 데이터들이 저장되는 장소이기 때문에 각 테이블에 어떤 데이터가 적재되는지 알고 사용하면 좋다. DDL script 는 org.springframework.batch.core 라이브러리에 schema-*.sql 데이터베이스별로 있다. 적재되는 순서는 다음과 같다. BATCH_JOB_INSTANCE BATCH_JOB_EXECUTION BATCH_JOB_EXECUTION_PARAMS BATCH_JOB_EXECUTION_CONTEXT BATCH_S..

    [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