GlobalExceptionHandler와 CustomException으로 전역 예외 처리하기 Spring을 사용해서 웹 애플리케이션 개발을 하다 보면, 예외가 발생했을 때 예외 종류에 따라 클라이언트 측에 다른 응답을 보내줘야 한다. 이때, 일일히 Controller마다 예외 처리해서 Response를 던져주는 작업을 하게 되면 서비스가 커질수록 중복 코드가 늘어나고 유지보수가 힘들어진다. 이를 해결하기 위해 Exception Handling을 전역적으로 관리할 수 있는 방법을 알아보자 ErrorCode Enum 에러에 대해서 Response를 전달할 때, 에러 메시지를 같이 전달하게 되는데 이 때 메시지를 String 값으로 하드 코딩하게 되면 관리가 힘들어진다. 그러므로 Http 상태 코드와 메시지..
👀BCryptPasswordEncoder란? BCryptPasswordEncoder는 Spring Security 프레임워크에서 제공하는 클래스로 비밀번호를 암호화(해시)하는 데에 사용한다. 해시 함수에는 MD5나 SHA 등의 종류가 있지만 BCrypt는 단순히 입력을 1회 해시시키는 것이 아니라 솔트(salt)를 부여하여 여러번 해싱하므로 더 안전하게 암호를 관리할 수 있다. BCrypt는 같은 비밀번호를 암호화하더라도 해시 값은 매번 다른 값이 도출된다. 따라서 BCryptPasswordEncoder에서는 사용자가 제출된 비밀번호와 암호화되어 저장된 비밀번호의 일치 여부를 확인하는 메소드가 제공된다. BCryptPasswordEncoder는 BCrypt의 로그 라운드라고도 하는 강도(strength)..
Spring Data JPA를 사용하는중, 생성 일자로 정렬을 하기 위해 아래와 같이 Repository에 선언을 했는데, No property 'desc' found for type 'LocalDateTime’라는 에러가 발생했다. Page findAllOrderByCreateDateDesc(Pageable pageable); LocalDateTime 타입에 desc 속성을 찾을 수 없다고 오류가 발생하는데, 해결 방법은 매우 간단하게 findAll 뒤에 'By'를 붙여주면 깔끔하게 동작한다. Page findAllByOrderByCreateDateDesc(Pageable pageable);
Spring Boot 2.7.3에서 Querydsl 5.0.0 gradle 설정하기 gradle에서 Querydsl 5.0 버전을 추가할 때, 올바르게 설정해주지 않으면 java.lang.NoSuchFieldError 등과 같은 에러가 발생하거나, Q클래스가 생성이 안되는 문제가 있어서 해결한 뒤 gradle 설정을 공유해본다. // QueryDSL 추가 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.7.3' id 'io.spring.dependency-management' version '1.0.13.RELEASE' //querydsl 추가 id "com.ewerk.gr..
Swagger-ui로 API Docs 자동화하기 기존에 Notion을 사용해서 API 명세서를 작성하다가, API 서버에 변경이 생기면 문서도 같이 수정해줘야 하는 번거로움에 자동화의 필요성을 느껴 Swagger를 적용하게 되었다. Spring Boot에서 Swagger를 적용하여 API 문서를 작성하는 방법에 대해 알아보도록 하자 🙉 의존성 추가 implementation 'org.springdoc:springdoc-openapi-ui:1.6.11' Swagger-ui를 사용하기 위해 gradle에 Springdoc 의존성을 추가해준다. swagger를 사용하는 다른 라이브러리로는 Springfox도 있지만, 활발히 업데이트가 이루어지는 Springdoc에 비해 2020년 이후로 업데이트가 이루어지지 ..
LocalDateTime Format 설정하기 Response DTO에 LocalDateTime가 포함되었을 때 포맷을 설정해주지 않으면 yyyy-MM-dd'T'HH:mm:ss 형식으로 전송하게 된다. 이걸 클라이언트에서 그대로 보여주게 되면 2022-08-26T22:00:00 처럼 사용자가 보기에 어색할 수 있는 형식이므로 Format을 변경해주는 것이 좋다. 포맷을 변경하는 방법은 아주 간단한데, LocalDateTime 변수에 @JsonFormat 어노테이션만 추가해주면 된다. 예제 코드 게시글에 대한 Response DTO가 있을 때, Response Body에 게시글 작성 일자를 포함하려고 한다. 이 때 포맷은 yyyy-MM-dd HH:mm:ss로 정하고 싶으면 @JsonFormat 어노테이션을..
[Spring Boot] DTO Validation 그룹화 및 TEST 오늘은 DTO 입력 값을 검증하는 방법과 Validation을 그룹화하고 Sequence를 만들어 검증 순서를 지정하여 테스트 코드까지 구현하는 방법을 작성해보려고 한다. 간단한 DTO 중에서도 회원가입 요청에 대한 DTO를 검증하는 과정을 살펴볼 것이다. 우선 사용자 입력을 받는 DTO에 유효성 검증이 없으면 ID나 패스워드, 이메일 등에 규칙과 다른 값이 들어오더라도 이를 미리 막을 수가 없다. 물론 프론트엔드에서 입력 값을 검증하긴 하지만 클라이언트에서 전송하는 값은 조작이 쉽기 때문에 백엔드 쪽에서도 이중으로 검증을 수행해야 안전하다. 시작하기에 앞서 validation을 위한 의존성 추가가 필요하다. build.gradle에..
InteliJ 네이버 Java 코딩 컨벤션 적용하기 + Checkstyle 코딩 컨벤션이란? 코딩 컨벤션이란 가독성이 좋고 관리하기 쉬운 코드를 작성하기 위한 코딩 스타일 규약을 말한다. 코딩 컨벤션을 준수하면 가독성이 좋아지고 성능에 영향을 주거나 오류를 발생시키는 잠재적인 위험 요소를 줄여줘 유지보수 비용을 줄일 수 있다. 코딩 컨벤션을 적용하기 위해 정적 코드 분석 도구를 도입하는데, 보통 자바스크립트에서는 ESLint, Java에서는 Checkstyle과 같은 도구를 주로 사용한다. Java에서는 구글이나, 네이버에서 지정한 코딩 컨벤션이 유명하므로 오늘은 InteliJ에 네이버 코딩 컨벤션을 Code Style Formatter로 설정하고, Checkstyle까지 적용하는 과정을 설명한다. 네이..