spring 22

@WebMvcTest IllegalArgumentException: JPA metamodel must not be empty 오류 뜰때

방법 1: Configuration 설정 분리@EnableJpaAuditing 설정을 별도의 Configuration 클래스로 분리하여 테스트 시 JPA 관련 빈들이 로드되지 않도록 합니다. 예를 들어:java@Configuration@EnableJpaAuditingpublic class JpaConfig {}이렇게 하면 테스트 코드 실행 시 Application이 JPA와 상관없이 정상 실행하게 됩니다.방법 2: MockBean 추가테스트 코드에 JpaMetamodelMappingContext 클래스를 @MockBean으로 추가합니다. 예를 들어:java@WebMvcTest(StoreController.class)public class StoreControllerTest { @Autowired ..

spring 2025.03.06

swagger 사용시 유용함. @Tag, @Operation

@Tag와 @Operation 어노테이션은 OpenAPI (예전의 Swagger)에서 제공하는 어노테이션으로, API 문서를 자동으로 생성하는 데 사용됩니다. 이 어노테이션들을 사용하면 API의 설명을 더 명확하고 이해하기 쉽게 만들 수 있습니다.@Tag@Tag 어노테이션은 API의 그룹을 지정하는 데 사용됩니다. 이를 통해 API 문서에서 특정 기능별로 API를 묶어서 보여줄 수 있습니다.예를 들어:java@Tag(name = "Store 관리 API", description = "사장 유저가 가게 생성, 폐업, 조회기능 API입니다.")위와 같이 사용하면 Store 관리 API라는 이름으로 이 그룹에 속한 API들이 문서화됩니다.@Operation@Operation 어노테이션은 각각의 API 엔드포인..

spring 2025.03.06

테스트 코드

H2 (Repository 테스트 or 통합 테스트용)dependencies { testRuntimeOnly 'com.h2database:h2'}  Annotation 종류1. @DataJpaTestJPA와 관련된 Component들만 모두 가지고와 Repository Layer 단위 테스트를 위한 Annotation이다.기본적으로 In-memory DB(ex H2)를 사용하여 테스팅요약: JPA 레포지토리 단위 테스트2. @ExtendWithJunit5 환경에서 확장기능을 사용할때 사용.주로 MockitoExtension 과 함께 Service Layer, 클래스 단위 테스트에 사용요약: 서비스 단위 테스트3. @WebMvcTest스프링의 Web Layer(controller, filter 등)을..

spring 2025.03.06

페이징처리할때 수동으로 처리하면서 공부한 내용

페이징 처리시 jpaRepository 가 제공하는 findAll에 Pageable 객체를 넣어주면 알아서 페이징처리하지만 이런 경우 필터링하여 원하는 결과를 얻을 수가 없기 때문에 필터링을 먼저한 후 수동으로 페이징처리를 해줘야 한다.@Transactional(readOnly = true) public StorePageResponseDto findAll(int page, int pageSize, String name, StoreCategory category) { List storeList = storeRepository.findAllByNameAndCategory(name, category); List filteredStores = storeList.stream() ..

spring 2025.03.05

JPA 사용시 변경사항이 있을때 save() 가 아닌 @Transactional 사용해도 저장됨

트랜잭션과 더티체킹 그리고 영속성컨텍스트에 대한 내용이다package org.example.expert.domain.user.service;import lombok.RequiredArgsConstructor;import org.example.expert.domain.common.exception.InvalidRequestException;import org.example.expert.domain.user.dto.request.UserRoleChangeRequest;import org.example.expert.domain.user.entity.User;import org.example.expert.domain.user.enums.UserRole;import org.example.expert.domain...

spring 2025.02.26

관계형DB일때 N:M 연관관계 @ManyToMany

객체는 Collection을 사용하여 N:M 설정이 가능하지만 관계형 DB는 N:M 연관관계를 구현할 수 없다.따라서 중간 테이블을 추가해서 1:n, n:1 관계로 설정하면 된다.JPA를 사용하면 @ManyToMany로 위 과정을 쉽게 해결가능한데 문제가 있으니 주의하여야한다. 단방향 예시@Entity@Table(name = "language")public class Language { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name;}@Entity@Table(name = "tutor")public class Tutor { @Id @GeneratedValu..

spring 2025.02.24

@Mock

Mockito 라이브러리를 사용하여 목 객체를 생성하기 위해 사용되는 어노테이션이다.목 객체는 실제 객체의 동작을 모방하는 가짜 객체로, 단위 테스트에서 사용된다.이렇게 함으로써 의존성에 대한 복잡성을 줄이고, 테스트하려는 코드에만 집중할 수 있게 된다. 예시import static org.mockito.Mockito.*;import org.junit.jupiter.api.Test;import org.mockito.InjectMocks;import org.mockito.Mock;import org.mockito.MockitoAnnotations;import static org.junit.jupiter.api.Assertions.*;class MyServiceTest { @Mock private..

spring 2025.02.24