본문 바로가기

STUDY/Spring

(79)
Spring Boot | RestTemplate PATCH 사용하기 RestTemplate으로 API 요청 중 PATCH메서드를 사용하면 계속 에러가 발생했다. 해결하기 위해서는 RestTemplate의 RequestFactory세팅이필요하다. 먼저 build.gradle에 의존성을 추가한다. // RestTemplate PATCH, PUT method 사용 위해 추가 implementation 'org.apache.httpcomponents:httpclient:4.5.13' 그리고 사용할 때 setRequestFactoryy()를 호출해 HttpComponentsClientHttpRequestFactory를 세팅한다. 이렇게 설정 후 PATCH요청을 하면 에러 없이 잘 작동한다. // Http PATCH method 사용 위해 RequestFactory를..
Spring Boot | JPA사용 중 기본키를 UPDATE해야 할 때.. 기본적으로 Primary key를 변경한다는 것이 말이안되지만.. 레거시 디비로 디비 구조를 변경할 수 없는 상황이기 떄문에 부득이하게 PK값을 변경하게 되었다. JPA에서는 기본키를 변경할 수 없다. 기본키 값을 변경하고자 한다면 JDBCTemplate이나 MyBatis등으로 우회해야 한다. MyBatis가 사용하기에는 더 편하지만, 그렇게 되면 또 라이브러리를 추가해야 하기 때문에 JDBC를 사용하기로 했다. 사용 예시 name, addr, age라는 값을 조합한 복합키가 기본키로 사용되고, 이 값을 수정할 수 있다고 가정한다. Repository는 분리해서 작성한다. 먼저 인터페이스를 작성하고, public interface MemberJdbcRepository { int update(String ..
Spring Boot | Spring Security Test @WithMockUser를 커스터마이징 해서 사용하자 스프링 시큐리티가 적용되어 있는 프로젝트에서 컨트롤러 통합 테스트 작성 중.. @WithMockUser만으로 해결되지 않는 경우가 발생했다. @WithMockUser 가장 쉽게 특정 유저를 설정해 테스트를 진행하는 방법이다. username, password, roles 등 항목을 입력할 수 있다. 아래와 같이 사용하면, test라는 유저명을 가진 가짜 유저를 생성한다(mocking user) 물론 입력한 값들이 사용된 Authentication이 SecurityContext에도 올라간다. @WithMockUser(username = "test", roles = "USER") @Test void withMockUserTest() { ... } 하지만 커스텀된 Authentication 인증 정보는 사용할..
Spring Boot | HandlerMethodArgumentResolver로 Authentication 정보 간단하게 받기 Spring Security를 사용하면 인증된 사용자의 정보를 Authentication 객체를 통해 받을 수 있다. Authentication은 SecurityContextHolder에 저장되어 있음 HandlerMethodArgumentResolver HandlerMethodArgumentResolver 인터페이스는 두 개의 메서드를 구현하도록 하고 있다. supportsParameter(): 주어진 메서드 파라미터를 이 reolver로 지원할지 여부 resolveArgument(): 파라미터에 전달할 객체를 생성 boolean supportsParameter(MethodParameter parameter) Object resolveArgument(MethodParameter parameter, Mo..
JPA | @DataJpaTest @DataJpaTest JPA 애플리케이션을 테스트 할 때 사용하는 애노테이션 @ExtendWith(SpringExtension.class)를 포함하고 있기 때문에 스프링 구동 환경으로 실행 되지만, @Component 나@ConfigurationProperties 빈들은 스캔되지 않아 더 빠른 테스트가 가능함 @Transactional도 포함하고 있어 기본적으로 모든 테스트 후 롤백처리 됨 인메모리 임베디드 데이터베이스를 사용할 수도 있지만, 실제 데이터베이스를 사용하고자 한다면 @AutoConfigureTestDatabase애노테이션을 사용할 수 있음 @DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace...
JPA | Querydsl 서브 쿼리 SELECT 절에서 사용하기 JPAExpressions를 이용해 서브쿼리를 작성할 수 있다. @Override public UserResponseDto getUserWithCount() { return queryFactory.select( Projections.constructor( UserResponseDto.class, user, JPAExpressions.select(count(user.id)) .from(user) ) ) .from(user) .fetch(); }서브쿼리에서도 WHERE절을 사용해 어떤 값을 검색하고자 할 때는 아래와 같이 한다. @Override public UserResponseDto getUserWithParentName() { QUser u = new QUser("u"); ..
Spring Boot | Querydsl Projections Result handling Querydsl은 결과를 커스터마이징 하기 위한 두 가지 방법을 제공한다. FactoryExpressions: 열(row) 기반 변환 FactoryExpression 인터페이스는 빈 생성, 생성자 호출 그리고 더 복잡한 객체를 생성하기 위해 사용되며, Projections구현체를 이용한다. ResultTransformer: 집합(aggregation) ResultTransformer 인터페이스의 주요 구현체는 GroupBy클래스다. Projections 쿼리 결과를 DTO클래스로 받을 때 주로 사용한다. Bean population 쿼리 결과로부터 빈을 생성하고자 할 때 bean projection을 사용한다. Projections.bean() 메서드를 호출하여 사용하며, s..
Spring Boot | PageRequest Spring Data JPA를 사용해 페이징을 하려는데, 컨트롤러에서 바로 Pageable을 받고싶지는 않았다.. Pageable 사실 Pageable을 이용하면 정말 쉽게 바로 받아진다. import org.springframework.data.domain.Pageable; @RestController @RequestMapping("api/v1/orders") public class OrderController { @GetMapping() public Response getOrders(final Pageable pageable){ // ... } }api/v1/orders?page=0&size=20&sort=id,desc이렇게 요청하면, 쿼리 스트링이 바로 pageable에 매핑된다. PageReque..