전체 글

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

[Spring] Mapstruct Mapper Custom with Qualifier, @DecoratedWith

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

Web

[Spring] Logback MDC 로 애플리케이션 로깅하기

사이드 프로젝트 중 버그가 생긴 경우 그에 대한 요청/응답 값을 추적하던 중에 MDC 를 사용하면 좋을 것 같다는 생각이 들었다. MDC (Mapped Diagnostic Context) 란 Logback, Log4j2 등에서 지원하는 기능으로 로깅 메시지에 컨텍스트 정보를 저장할 수 있고 로깅 중에 스레드별로 특정 정보를 저장하고 관리하는 메커니즘을 말한다. 주요 이점 - 특정 사용자, 세션, 요청 등의 ID를 로그에 포함시켜 모니터링을 용이하게 한다. - 사용자 및 요청 정보를 로그에 포함시켜 감사 및 보안 모니터링을 강화할 수 있다. - 다중 스레드 환경에서 발생하는 요청을 효과적으로 관리하고 구분할 수 있다. 동작 방식 MDC 는 각 스레드에 대한 데이터 저장소를 Map 형태로 제공한다. 그렇기 ..

JAVA

[Java] ArrayList 와 HashMap

자바 컬렉션 내 가장 많이 사용하는 자료구조 중 ArrayList 와 HashMap 이 있다. 사용하면서도 용도를 제대로 이해하지 않고 사용하는 것 같아 성능 및 사용 사례에 대해 정리해보려한다. ArrayList 와 HashMap 1. ArrayList - 구조 : 내부적으로 데이터를 배열 형태로 저장하며 요소를 추가하거나 제거할 때 크기를 동적으로 조정한다. - 접근 방법 : 인덱스를 통해 접근. - 사용 사례 : 순서가 중요하거나 혹은 인덱스를 통한 빠른 접근이 필요할 때 사용한다. - 크기 조정을 해야하는 경우 내부적으로 배열을 재할당하고 기존 요소를 새 배열로 복사해야하기 때문에 많은 양의 데이터를 추가하거나 삭제하는 경우 성능 저하가 발생할 수 있다. 2. HashMap - 구조 : 키-값 쌍..

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' 로 바꿔 사용자가 삭제된 것처럼 처리하게 된다...

limnj
개발을 하자