Programing 55

스프링부트 스케줄러가 여러번 실행된다면? @SchedulerLock 사용법

Spring Boot @SchedulerLock는 분산 잠금 기능을 제공하는 어노테이션입니다. 분산 시스템에서 여러 인스턴스가 동시에 실행되고 있는 경우, 특정 작업을 한 번에 한 인스턴스 만 실행하도록 보장합니다. 즉 서버가 여러곳에서 구동중일 때 스케줄락을 통해 스케줄러가 한번만 실행되도록 해주는 기능입니다. 사용법 build.gradle에 dependency 주입 //shedlock implementation("net.javacrumbs.shedlock:shedlock-spring:4.14.0") implementation("net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.14.0") Config클래스 생성 @Configuration class..

SpringBoot @RequestBody 데이터 선택적으로 받기

결론: @RequestBody(required = false) 를 사용하여 해결 @RequestBody 사용 예시 일반적으로 @RequestBody를 사용할 때는 해당 필드값이 필수적으로 필요하다는 것을 가정합니다. 하지만 때로는 필수적이지 않은 경우가 있습니다. @PostMapping("/example") public ResponseEntity example(@RequestBody ExampleDto exampleDto) { // ... } 위 코드에서 ExampleDto는 @RequestBody로 받을 객체입니다. 하지만 이 객체의 필드 중 일부는 선택적으로 필요한 경우가 있을 수 있습니다. @RequestBody(required = false)를 사용한 예시 이런 경우, @RequestBody(re..

코틀린 스프링부트 Querydsl 사용 예제

우선 Querydsl을 사용하기 위해서는 인터페이스를 만들고, 구현체를 만들고, Repository에 상속한다 1. Repository (SpringDataJpa, Querydsl 2개를 상속받았다) @Repository interface MemberRepository : JpaRepository, MemberRepositoryCustom { } 2. 인터페이스 interface MemberRepositoryCustom { fun search(condition: MemberSearchCondition): List fun searchPageSimle(condition: MemberSearchCondition, pageable: Pageable): Page fun searchPageComplex(condit..

codedeploy 에러 Could not download bundle at 'https://api.github.com/repos/***/***/tarball/***' after 3 retries. Server returned codes: 404 'Not Found'; 404 'Not Found'; 404 'Not Found'; 404 'Not Found'.

aws codedeploy 실패가 떠서 View events를 눌러 들어가보았고 아래와 같은 실패를 확인할 수 있었다. UnknownErroor를 클릭하면 다음과 같은 에러메시지를 볼 수 있다. Could not download bundle at 'https://api.github.com/repos/***/***/tarball/***' after 3 retries. Server returned codes: 404 'Not Found'; 404 'Not Found'; 404 'Not Found'; 404 'Not Found'. 권한 문제로 private리포지토리에 접근할 수 없으면 발생한다. codeDeploy > 애플리케이션 > 내가만든배포그룹 들어가서 배포생성 누른 뒤 아래 사진처럼 적절한 값을 채워넣..

Programing/기타 2023.07.03

git 로컬 브랜치를 원격 저장소에 강제로 푸시(덮어쓰기)

로컬 브랜치를 원격 브랜치에 강제로 덮어쓰기 git push -f origin develop 터미널에서 위 코드를 사용하여 로컬에서 현재 작업한 내용을 원격 저장소에 강제로 push하여 덮어쓸 수 있다. 이 작업은 원격 저장소의 커밋 히스토리를 변경하므로 주의가 필요함. 1. 원격 저장소의 히스토리 손실: 강제 푸시하면 원격 저장소의 develop 브랜치가 새로운 커밋으로 덮어씌워집니다. 이로 인해 원격 저장소에 이미 푸시된 이전 커밋들이 삭제되어 히스토리 손실이 발생할 수 있습니다. 2. 다른 개발자들과의 충돌: 만약 여러 개발자가 동시에 작업하고 있다면, 강제 푸시로 인해 다른 개발자들의 로컬 저장소와 원격 저장소 간에 충돌이 발생할 수 있습니다. 다른 사람들이 이미 푸시한 커밋들과 충돌이 발생하면 ..

Programing/기타 2023.07.03

Scanner 테스트코드 작성하기 System.setIn()

계산기 프로그램에서 Scanner를 통해 값을 입력받는 부분을 테스트코드로 작성해보자. package org.example; import java.util.Scanner; public class CalculationRequestReader { public String[] read() { Scanner scanner = new Scanner(System.in); System.out.println("Enter two number and an operator (e.g 1 + 2): "); String result = scanner.nextLine(); return result.split(" "); } } 테스트코드 작성 @Test public void System_in으로_데이터를_읽어들일_수_있다(){ Ca..

문자열이 비어있지 않은지를 확인하는 메소드 StringUtils.hasText, isNotBlank, isNotEmpty 차이

StringUtils.hasText, isNotBlank, 그리고 isNotEmpty는 모두 문자열이 비어 있지 않은지를 확인하는 메소드입니다. 1. StringUtils.hasText: (공백 걸러냄) 이 메소드는 Apache Commons Lang 라이브러리의 StringUtils 클래스에 있는 메소드입니다. 주어진 문자열이 null이 아니고, 빈 문자열이 아니며, 공백 문자로만 이루어져 있지 않은지를 확인합니다. 따라서, 문자열이 실제로 텍스트를 포함하고 있는지를 확인하는 데 사용할 수 있습니다. 2. isNotBlank: (공백 걸러냄) 이 메소드는 Kotlin 표준 라이브러리에 있는 String 클래스의 확장 함수입니다. 주어진 문자열이 null이 아니고, 빈 문자열이 아니며, 공백 문자로만 이..

Programing/Kotlin 2023.07.01

Querydsl 동적 쿼리 사용하는 2가지 방법 (Builder, where절 파라미터)

1. Builder를 사용 하는 방법 fun searchByBuilder(condition: MemberSearchCondition): List{ val builder = BooleanBuilder() //StringUtils.hasText를 통해 null Or "" 대응 if(StringUtils.hasText(condition.name)){ builder.and(member.name.eq(condition.name)) } if(StringUtils.hasText(condition.age)){ builder.and(member.age.eq(condition.age)) } return queryFactory.selectFrom(member) .where(builder) .fetch() } 2. Where..

SpringBoot 테스트코드 작성시 Security 권한 무시하는법 @PreAuthorize우회 하기

1. Security Test Configuration 작성: Spring Security의 SecurityTestExecutionListener를 활용하여 테스트용 Security 설정을 제공할 수 있습니다. 이를 통해 테스트 코드에서는 실제 사용자 인증 절차를 거치지 않고도 접근할 수 있습니다. 아래는 예시입니다 @ExtendWith(SpringExtension::class) @SpringBootTest @TestExecutionListeners( listeners = [SecurityTestExecutionListener::class], mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS ) class MemberServiceTest ..