[SpringBoot] 에러 발생시 Slack으로 알림 보내기

Intro 토이프로젝트로 단순하게 만들어서 배포 해둔 근무 및 스케줄 관리 웹 어플리케이션이 있습니다. 와이프가 저처럼 매일 매일 출근시간이 정해진게 아니고 쉬프트를 받아 근무를 하다 보니, 종종 근무시간을 까먹고 지각하는 경우가 있었습니다. 제가 와이프 근무시간을 확인하려면 항상 카톡 대화방에 들어가서 사진첩을 뒤적거려야 하는 불편함이 있었습니다. 이 두가지를 해소하고자 첫 버전을 하루만에 대충 만들고 클라우드에 배포까지 끝냈었는데, 동생도 쓰고 무엇보다 처제가 굉장히 유용하게 사용하고 기능 추가 요청도 많이 해주다 보니 처음 계획보다 확장이 꽤나 일어 나고 있습니다. 이 프로젝트 뿐만 아니라, 취업 전에 국비학원에서 진행했던 최종 프로젝트도 생각보다 참고용으로 방문해주는 분들이 있다 보니 지금까지 서..

Programming/JPA ⁄ Spring 2022.10.26
BCryptPasswordEncoder 사용시 인코딩 할때마다 결과가 달라져요

Intro BCryptPasswordEncoder를 빈에 등록 해놓고, 암호를 검증하는 AuthenticationProvider를 별도로 구현해 봐야 할 일이 있어서 구현을 하고 있었는데요, 아무리 비밀번호를 올바르게 입력 해도 자꾸 비밀번호가 틀리다고 나오는 문제가 발생했습니다. 디버그를 하다 보니 분명 입력된 암호는 같았는데요. 혹시나 각기 다른 비밀번호 인코더가 동작하는지 의심되어서 각각 암호를 저장 할 때와, 암호를 검증 할 때 사용하는 비밀번호 인코더를 확인 해 보았습니다. 확인 결과 완전히 동일한 객체인게 확인 되어서 혹시나 싶어 각각의 위치에서 "1234" 를 인코딩 하도록 해 보았는데요 결과가 당황스러웠습니다. @Test public void encoderTest() { BCryptPass..

Programming/JPA ⁄ Spring 2022.10.15
[Kotlin] 코틀린에서 Mockito 사용시 final class 문제 해결

Intro 코틀린으로 코드를 작성하다보면 간혹가다가, 자바에서는 별 문제 없던게 의도대로 동작하지 않을 때가 있습니다. 이번에는 테스트 코드를 작성하다가 스터빙을 하려고 하는데 문제가 있었는데요, 아래와같이 테스트를 하려고 했습니다. // When val memberContext = Mockito.mock(MemberContext::class.java) Mockito.`when`(memberContext.member).thenReturn(member) quizService.edit(memberContext, quiz.id!!, quizEditDto) // Then val findById = quizService.findById(quiz.id!!) assertThat(findById.description)..

Programming/Kotlin 2022.09.25
[Kotlin] 코틀린에서 queryDSL 설정하기

Intro 자바에서도 QClass 생성은 처음 하면 꽤나 당황스러운 과정인데, 코틀린은 또 과정이 달랐기에 결과물을 기록으로 남기고자 합니다. 2022년 9월 19일 기준의 최신 라이브러리들에서 잘 작동하고 있는 방법 입니다. 설정 build.gradle.kts plugins { ... kotlin("kapt") version "1.7.10" } dependencies { ... implementation("com.querydsl:querydsl-jpa:5.0.0") kapt("com.querydsl:querydsl-apt:5.0.0:jpa") } 소스코드는 딱 위의 변경 사항만 있었습니다. 의존성 변경 후에 Shift + Command + I 키를 입력 해서 Load Gradle Changes를 해 주..

Programming/Kotlin 2022.09.19
[Spring] @PageableDefault 혹은 @SortDefault 여러 컬럼으로 정렬하기

Intro 컨트롤러를 통해 페이지 정보를 받고, 서비스 레이어 및 Persistence Layer를 통해 여러개의 데이터를 조회 할 때 종종 @Pageable Default 어노테이션을 사용합니다. 예를 들어 컨트롤러에서 @PageDefault를 아래와 같이 설정 하면 Kotlin @GetMapping fun findAll(@PageableDefault(sort = ["id"]) pageable: Pageable): ApiResponse { return ApiResponse.ok(quizService.findAll(pageable).map { quiz -> QuizDto.of(quiz) }) } Java @GetMapping public ApiResponse findAll(@PageableDefault(..

Programming/JPA ⁄ Spring 2022.09.17