Spring Boot

Web

[Spring] Mapstruct Mapper Custom with Qualifier, @DecoratedWith

다양한 요구사항이 생길 수 있기 때문에 단순한 매핑만으로 DTO ↔ Entity 변환이 힘들 수 있다. 그럴 때 Mapper 클래스를 Custom 하여 사용해보자. Mapper 사용방법2023.07.08 - [Web] - [Spring] MapStruct 사용하기 대상의 속성 매핑 커스텀하기 with qualifiedByNamequalifedByName 은 대상의 속성을 매핑하기 위한 @Mapping 의 속성으로, 사용자가 정의한 매핑 방법을 @Named 어노테이션으로 이름으로 지정하여 사용할 수 있다. 이를 통해 복잡한 데이터 구조를 변환하거나 기본 매핑만으로 부족한 경우 사용자가 정의한 매핑 방법을 선택할 수 있게 한다.  간단한 예제로 사용자의 생년월일을 나이로 변환하는 작업을 해보자. ( 다른 필..

Tools

[Artillery] 성능 테스트 with spring boot

애플리케이션 성능을 테스트하기 위해 Artillery 를 사용해보자. Artillery 란? 개발자를 위한 강력한 클라우드 기반 부하 테스트 도구이다. 이 도구는 복잡한 시스템에 대한 부하 테스트와 성능 모니터링을 간단하고 접근하기 쉽게 만들어 사용자 경험과 시스템 성능을 최적화하는 데 도움을 준다. AWS 와 같은 클라우드 서비스에서 직접 테스트를 실행하여 실시간으로 피드백을 받을 수도 있다. Artillery 설치하기 1. node.js 설치 ( 공식문서 ) 2. artillery 설치 ( 공식문서 ) > npm install -g artillery@latest - 설치 확인 > artillery version 성능 테스트 with Artillery 먼저 간단한 테스트 스크립트를 작성하여 성능 테스트..

Web

[JPA] deleteAll() 과 deleteAllInBatch()

테스트 코드 관련 강의를 보다가 deleteAllInBatch() 에 대해서 알게 되었다. 해서 기존에 사용하고 있던 deleteAll() 과의 차이점을 정리해보려한다. deleteAll() 과 deleteAllInBatch() User 데이터를 10개 추가해두고 deleteAll() 과 deleteAllInBatch() 를 사용했을 때 각각을 비교해보자. ( UserRepository 는 JPARepository 를 상속받고 있다. ) deleteAll() deleteAll() 은 CrudRepository 내 정의 되어있는 기능으로 모든 엔티티를 삭제할 때 사용한다. 쿼리를 통해 확인한 내부 동작은 아래와 같다. 1. 작업을 수행하기 전 엔티티를 영속성 컨텍스트로 로드하기위해 select 쿼리를 실행..

Web

[JPA] @ColumnDefault 이해하기

엔티티의 특정 필드에 @ColumnDefault 를 이용하여 Default 값을 'N' 으로 설정하였는데 null 값으로 저장되는 이슈가 발생하였다. 해결방법에 대해 정리해보자. @ColumnDefault 동작 @ColumnDefault는 Hibernate 에서 제공하는 Annotation 으로, Entity 의 필드에 대해 데이터베이스 기본 값을 정할 때 사용한다. 예를 들어 isDeleted 라는 필드가 있고 기본 값을 'N' 으로 설정하고 싶을 땐 아래와 같이 설정하면 된다. @ColumnDefault("'N'") // default N private String isDeleted; 그런데 이렇게 설정하고 테스트를 해보면 기대했던 N 값이 아닌 null 값임을 확인할 수 있다. - Test Code..

Tools

[SonarQube] SonarQube 로 정적 분석하기

코드의 품질을 높여주기위해 SonarQube 로 정적 분석을 할 수 있는데 그 과정에 대해 정리해보자. SonarQube 란 SonarQube 는 코드의 품질을 지속적으로 검사하여 자동 코드 리뷰를 수행하는 오픈 소스 플랫폼이다. SonarQube 사용 이유 - 코드 품질 개선 : 정적 분석을 통해 코드 스멜, 버그, 취약점 드을 식별하여 코드 품질을 개선할 수 있다. - 지속적인 코드 검사 : 자동화된 코드 리뷰를 통해 개발 과정 전반에 걸쳐 지속적으로 코드 품질을 검사하고 유지할 수 있다. - 다양한 언어 지원 : Java, C#, Python 등 다양한 프로그래밍 언어를 지원한다. - 통합 개발 환경(IDE) 지원 : SonarLint 와 같은 플러그인을 통해 Eclipse, Visual Studi..

Web

[Spring] Soft Delete with JPA

사이드 프로젝트 진행 중에 특정 데이터에 대해 Soft Delete 를 적용해달라는 요청을 받았었다. Soft Delete 란? 데이터를 영구적으로 삭제하지 않고 데이터가 삭제된 것처럼 처리하는 방법이다. 이렇게하면 데이터를 복구할 때 유용하며 Soft Delete 를 구현할 때는 데이터 항목에 isDeleted 등의 필드를 추가하여 삭제된 것처럼 처리한다. 예를 들어, Soft Delete 가 아닌 Hard Delete ( 물리적 삭제 ) 상태라면 user_id 가 1인 사용자를 삭제하는 경우 데이터베이스에서 해당 사용자의 레코드를 완전히 제거하게 된다. 반대로 Soft Delete 를 사용하였을 때는 아래의 is_deleted 필드가 'N' 에서 'Y' 로 바꿔 사용자가 삭제된 것처럼 처리하게 된다...

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..

limnj
'Spring Boot' 태그의 글 목록