전체 글

개발하면서 공부한 내용들을 정리하는 곳입니다
Web

[Spring] QueryDsl 로 동적 쿼리 짜기 with JPA

JPARepository 에서 제공하는 메서드로 해결이 안되는 경우 동적 쿼리를 짜야한다. 간단하게는 native query 로 해결할 수 있는데 개발자가 실수를 한 경우에 이는 컴파일 시점이 아닌 런타임 시점에서 고객이 그 메서드를 호출하는 행위를 한 경우에만 오류를 확인할 수 있게 된다. 이를 해결하기 위해 QueryDSL 을 적용해보자. QueryDSL 설정 1. spring boot 3.x QueryDSL 의존성 주입 ( Gradle 기준 ) // QueryDSL implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationPro..

JAVA

[Java] LocalDateTime 과 Instant

프로젝트 진행 중에 데이터를 생성한 시간과 업데이트한 시간에 대한 필드를 정의하며 타입에 대한 고민이 들었다. LocalDateTime 만을 고려하고 있다가 Instant 라는 타입을 처음 알았기 때문이다. 해서 그에 대해 정리를 해보려한다. LocalDateTime 과 Instant 이 둘은 자바 8부터 도입된 날짜와 시간을 표현하는 데에 사용된다. 1. LocalDateTime - 시간대 정보를 포함하지 않으며 단순히 연, 월, 일, 시 등의 지역 날짜와 시간을 나타낸다. - 로컬 서버의 날짜와 시간을 나타내며 그것이 어느 시간대에 속하는 지는 명시하지 않는다. - 날짜, 시간 등을 더하고 빼는 등의 연산이 간단하다. - 시간대에 민감하지 않고 지역적인 서비스에 적합하다. 2. Instant - UT..

Web

[JPA] 양방향 순환 참조

JPA 양방향 관계를 설정하고 테스트하다가 Controller 단에서 아래 예외가 발생하였다. 찾아보니 JSON 직렬화 하는 과정에서 무한 참조로인해 생긴 예외로 원인과 해결방안에 대해 정리해보려한다. java.lang.IllegalStateException: Cannot call sendError() after the response has been committed .. java.lang.StackOverflowError: null .. ~[jackson-databind-2.15.3.jar:2.15.3] JPA 양방향 순환 참조 어떤 상황이었는지 간단하게 시나리오를 구현해보자. User 와 Notice 엔티티가 있고 1:N 양방향 관계이다. - User public class User { @Id @G..

Web

[Spring] 예외 코드 Enum 으로 관리하기

지난번 사이드 프로젝트를 할 때 커스텀한 예외 클래스를 따로 개별적으로 관리하여 한 눈에 보기 힘들고 중복되는 코드가 많아 가독성이 떨어진다는 느낌을 받았다. 그래서 이번에는 enum 으로 예외 코드를 관리해보기로 하였다. 자바의 Enum 타입이란 ? 공식 문서에 따르면 자바에서 Enum 타입은 고정된 상수들의 집합을 나타내는 특별한 데이터 타입으로, 변수는 미리 정의된 값들 중 하나와 같아야 한다. 또한, 상수들은 쉼표로 구분되며 대문자로 표기한다. public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } 또한 상수에 대한 의미있는 값을 미리 부여하여 활용할 수 있는데, 이렇게 하면 Enum 상수가 단순한 식별자..

Web

[Spring] actuator 를 통한 shutdown endpoint 생성

클라우드 서버에 jar 를 통해 배포하는 과정에서 애플리케이션을 정상적으로 종료하는 것에 대한 고려를 하지 못했다. kill -9 이 아닌 kill 을 통해 종료 요청을 보내는 것도 방법이지만 운영 환경에서 용이하게 관리할 수 있도록 shutdown endpoint 를 구현하기로 하였다. 비정상적인 종료와 정상적인 종료 Linux 환경을 기준으로 kill -9 을 통해 프로세스를 종료시킨다면, 프로세스는 현재 진행 중인 요청도 마무리하지 못하고 강제 종료되게 된다. 이는 비정상적인 종료로 데이터 손실이나 파일 손상과 같은 부작용을 초래할 수 있다. 정상 종료는 제어된 방식으로 애플리케이션을 종료하여 진행 중인 작업을 완료하고 시스템을 해제하고 데이터 무결성을 보장하며 종료할 수 있다. 정상적으로 종료하는..

Web

[Spring] RestTemplate 과 WebClient

카카오 소셜 로그인을 구현하며 토큰을 응답받아오는 과정에서 RestTemplate 이 deprecated 되었다고해서 WebClient 를 사용했었는데 오해와 각 방식의 차이점을 정리해보려한다. 우선, RestTemplate 에 대한 오해를 먼저 풀어보자. RestTemplate 은 Deprecated 되었는가? 결론부터 얘기하자면 그렇지 않다. RestTemplate 과 WebClient 의 차이점을 정리하기위해 찾아보다 알게된 내용으로, 직접 찾아보지않은 모든 것을 의심해야겠구나 하는 깨달음을 준 사례였다. 관련 내용은 토비 님이 올려주신 youtube 영상이 정말 정리가 잘 되어있었다. 우선 spring-web 6.0.13 기준으로 RestTemplate 문서를 확인해보아도 deprecated 되었..

Web

[Spring] Swagger 에 JWT 설정하기

spring boot 프로젝트에서 JWT 를 통한 인증을 수행하는데 Swagger 문서에는 인증에 대한 description 이 없어 그 부분을 추가하려고 한다. 사용하고 있는 라이브러리는 아래와 같다. // Swagger 설정 implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' Swagger 전역 설정 모든 API 에 대한 인증 설정을 추가하려면 전역 설정을 할 수 있다. 그렇다고 진짜로 인증을 요구하는 것은 아니다. 만약에 JWT 인증이 필요없는 API 가 있다면 그 API 에 대해서도 인증은 활성화되어있지만 JWT에 대한 검증 로직이 없기 떄문에 정상적으로 요청이 가능하다. 공식 문서를 통해 JWT 인증을 요구하는 설정 ..

Web

[Spring] Spring 3.x + Swagger 설정

Spring 3.x 프로젝트 환경을 설정하며 API 문서로 Swagger 를 사용하려고 하는데 그 전에 비해 방법이 더 간단해져 정리해보았다. Swagger 란 ? Swagger 는 REST API 를 설명하고 문서화하는 데 사용되며, OpenAPI 사양을 기반으로 구축된 오픈 소스 프레임워크이다. 공식 문서에 따라 OpenAPI 사양은 REST API 에 대한 API 설명 형식으로 아래를 포함한 전체 API 를 설명할 수 있다. - 사용 가능한 엔드포인트(/users) 및 각 엔드포인트의 작업 ( GET /users, POST /users ) - 작업 매개변수 각 작업에 대한 입력 및 출력 - 인증 방법 - 연락처 정보, 라이센스, 이용 약관 및 기타 정보 Swagger 적용하기 spring boot ..

limnj
개발을 하자