분류 전체보기

📌 서론그동안 Redis가 key-value를 저장하는 저장소라고 들어서 그냥 간단한 "category":1 같은 것만 저장하는 줄 알았다. 그러나 Redis에서도 key 값에 객체나 List를 넣을 수 있다는 것을 알게 되었다.실제로 프로젝트를 진행하면서 DB에서 자주 조회되는 카테고리를 레디스에 저장해야할일이 생겼다. 이 과정에서 알게된 어노테이션과 각 쓰임새를 정리해 보자. @RedisHash@RedisHash 어노테이션은 Spring Data Redis에서 사용되는 어노테이션으로, Redis에 객체를 해시 형태로 저장할 때 사용된다. 이 어노테이션은 Redis에 저장될 엔티티 클래스를 정의하는 데 사용되며, 해시 키를 지정할 수 있다. @RedisHash 어노테이션을 사용하여 Redis에서 데이..
지금까지 JAVA에서 '제네릭'이라고 하면 그냥 T로 작성해서 어떤 객체든 들어올 수 있게 하는 것 정도로만 이해하고 있다가 이번에 인터넷 강의를 들으면서 제네릭이 생각보다 더 많이 쓰이고 더 많은 내용을 담고 있어서 한번 이해해 보고자 나름대로 정리해 봤다. JAVA 제네릭Java에서 제네릭(Generic)은 코드의 재사용성을 높이고 타입 안전성을 강화하기 위한 중요한 기능이다. 이번 포스트에서는 제네릭의 개념과 함께 TraceTemplate 클래스 예시를 통해 제네릭 메서드가 어떻게 사용되는지 자세히 살펴보겠다. 제네릭이란?제네릭은 코드를 작성할 때는 타입이 결정되지 않지만, 실행 시점에 타입이 결정되도록 하는 기법이다. 이는 주로 컴파일 타임에 타입 검사를 강화하고, 런타임 시 타입 안정성을 보장하..
코드를 짜다가 foreach문을 중첩으로 사용하는 경우가 생각보다 자주 있다. 이를 더 개선할 방법이 없을까 하다가 이번에 새롭게 알게 된 문법을 소개해보려고 한다.  Function.identity()Function.identity()는 Java 8에서 도입된 함수형 프로그래밍 인터페이스 중 하나인 Function 인터페이스의 정적 메서드이다. 이 메서드는 입력 값을 그대로 반환하는 함수 객체를 생성하는 데 사용된다. 즉, Function 타입의 객체로서, 입력 값을 변경하지 않고 그대로 반환한다.import java.util.function.Function;  예제: Function.identity() 사용다음은 Function.identity()를 사용하여 리스트를 맵으로 변환하는 예시 코드이다:i..
이전 글에서 기본적인 MapStruct 라이브러리를 사용하는 방법을 알아봤다. 기본 사용법에서 더 나아가서 더 복잡한 로직을 구현할 수 있는 어노테이션도 알아보자! @AfterMapping@AfterMapping 어노테이션은 대상 타입의 객체가 매핑된 후 추가적인 커스텀 로직을 실행하고 싶을 때 사용된다. 이 어노테이션은 매핑 과정이 끝난 직후에 호출되므로, 매핑되지 않은 필드를 수동으로 설정할 수 있다. @Named@Named 어노테이션은 특정 매핑 메서드에 이름을 부여하여, 매핑 대상 필드에서 이 메서드를 지정하여 사용하고자 할 때 적용된다. 이를 통해 복잡한 매핑 로직이나, 다양한 상황에 따른 매핑 로직을 구현할 수 있다. 어노테이션 사용 예시 코드Entity (Question.java)@Gette..
MapStruct란?MapStruct는 Java 기반의 라이브러리로, 객체 간의 매핑을 손쉽게 도와주는 코드 생성기이다. 이 라이브러리는 주로 서비스 계층과 데이터 접근 계층 사이, 또는 다양한 계층 간의 데이터 전송 객체(DTO)와 도메인 또는 엔티티 객체 간의 변환 작업을 자동화하기 위해 사용된다. 개발자는 변환 로직을 직접 작성하는 대신, 인터페이스에 어노테이션을 사용하여 어떤 필드가 어떻게 매핑되어야 하는지를 선언적으로 정의한다. 그 후, MapStruct는 이 인터페이스를 기반으로 구현 클래스를 자동 생성한다. 이 과정은 프로젝트의 컴파일 시점에 이루어지므로, 런타임 시에 추가적인 성능 저하 없이 매핑 로직을 실행할 수 있다. MapStruct 동작 원리MapStruct의 핵심 동작 원리는 다음..
JPA를 사용하여 페이징 처리를 할 때 Slice와 Page 두 가지 방법이 있다. SliceJPA와 QueryDSL을 사용하여 페이징 처리를 할 때 Slice를 반환하는 방법은 전체 결과의 개수를 쿼리하지 않아도 되는 특별한 접근 방식이다. 이 방식은 페이징 처리 시 필요한 데이터의 일부만 로드하면서 다음 페이지가 존재하는지 여부만을 알려주는 방법이다. 즉, 사용자가 요청한 페이지와 그다음 페이지의 데이터만 조회하여 현재 페이지 다음에 데이터가 더 있는지 여부를 판단한다.  Slice의 동작 방식Slice는 페이징 처리된 데이터 목록과 함께 다음 페이지의 존재 여부를 알려주는 방식으로, 전체 데이터의 수를 계산하지 않기 때문에 count 쿼리를 실행할 필요가 없다. 이는 특히 대용량 데이터를 다룰 때 ..
@Builder 어노테이션Spring Boot와 Lombok 라이브러리를 활용할 때 @Builder 어노테이션은 객체 생성 과정을 간소화하고, 더 유연하고 안정적인 코드를 작성할 수 있도록 돕는다. 이 어노테이션은 크게 두 가지 방식으로 사용될 수 있다: 클래스 전체에 적용하는 방식과 클래스 내부의 특정 메서드에 적용하는 방식이다. 이 두 방식은 객체 생성의 유연성과 사용 목적에서 차이를 보인다.  클래스 전체에 @Builder 선언클래스 레벨에 @Builder를 선언하면, 해당 클래스의 모든 필드를 포함하는 빌더 클래스가 자동으로 생성된다. 이 방식은 클래스의 모든 필드를 빌더 패턴을 통해 설정할 수 있도록 하며, 불변 객체 패턴(Immutable Object Pattern)을 구현하기 위해 주로 사용..
📌 서론QueryRepository로 커스텀 레파지토리를 생성하고 @DataJpaTest로 테스트를 진행하려고 보니까 해당 Repository의 빈을 찾아오지 못하는 이슈가 발생했다. 이 이슈를 해결하면서 놓쳤던 부분을 다시한번 정리해보려고 한다. QueryDLS란?QueryDSL은 Java 어플리케이션에서 타입 안전성을 보장하는 동시에 복잡한 쿼리를 간결하게 작성할 수 있게 해주는 프레임워크다.특히, 스프링 부트와 함께 사용할 때, 데이터 접근 로직을 구현하는 방법에는 크게 두 가지 접근 방식이 있다: 기존의 custom interface 방식과 단독 빈으로 등록하는 QueryRepository 방식이다. 이 두 방식은 각각의 장단점을 가지며, 사용하는 컨텍스트에 따라 선택이 달라질 수 있다. 이번 ..
평양냉면7
'분류 전체보기' 카테고리의 글 목록 (12 Page)