분류 전체보기 954

30. 조회 API 컨트롤러 만들기

컨트롤러 자체 만드는 건 쉽다 @RestController @RequiredArgsConstructor public class MemberController { private final MemberJpaRepository memberJpaRepository; @GetMapping("/v1/members") public List searchMemberV1(MemberSearchCondition condition){ return memberJpaRepository.search(condition); } } 이렇게. 그냥 condition하면 저거는 이제 setter로 자동으로 알아서 클라이언트에서 들어오는 파라미터의 변수명만 잘 맞는다면 알아서 들어간다. 리포지토리로 먼저 정의해뒀던 search public ..

29. 동적쿼리 성능 최적화 조회 Where절 사용.

과거 우리가 where절은 ,로 구분하여, 여러 표현식을 인자로 주면 그게 and로 묶인다고 했다. https://qwefdg3.tistory.com/937 그래서, 표현식을 만들어 where절 안에 인자로 주면, 그게 알아서 여러 개면 and로 묶여 쿼리를 만들어 준다. 그렇기에, private BooleanExpression usernameEq(String username){ return StringUtils.hasText(username) ? member.username.eq(username) : null; } private BooleanExpression teamNameEq(String teamName){ return StringUtils.hasText(teamName) ? team.name.eq..

28. 동적 쿼리와 성능 최적화 조회, Builder

public List searchByBuilder(MemberSearchCondition condition){ BooleanBuilder builder = new BooleanBuilder(); if (StringUtils.hasText(condition.getUsername())) { builder.and(member.username.eq(condition.getUsername())); } if (StringUtils.hasText(condition.getTeamName())) { builder.and(team.name.eq(condition.getTeamName())); } if(condition.getAgeGoe() != null){ builder.and(member.age.goe(condition..

26. SQL 함수 호출

QueryDSL로 DB의 함수를 호출하는 쿼리를 만드는 것이 가능하다. @Test public void sqlFunction(){ List result = query.select(Expressions.stringTemplate( "function('replace', {0}, {1}, {2})", m.username, "member", "M" )).from(m) .fetch(); for (String s : result) { System.out.println("s = " + s); } } Expressions.stringTemplate( "function('DB함수명', {0}, {1} ....)", 0번째인자, 1번째인자 .... ) 이렇게 쓴다. 표현식.문자형템플릿(function('함수명', 인자들...

25. 수정, 삭제 벌크연산

벌크란 여러 row들을 한번에 처리 하는 것. 근데 벌크는, 영속성 컨텍스트를 무시하고 직접 DB에 쿼리를 넣는다. 그래서, 만약 조회해 온 다음에 벌크를 하게 되면, 영속성 컨텍스트에 있는 데이터와 DB에 있는 데이터가 맞지 않을 수도 있다. 영속성 컨텍스트에 엔티티가 있으면 조회했을 때 그걸 주니까. 보통 그래서 해결책은 벌크연산 이후에 데이터를 조회해오거나 벌크연산 후 영속성 컨텍스트를 초기화 시켜버리는 것 https://qwefdg3.tistory.com/800 그래서 아예 스프링 Data JPA에서는 옵션을 제공해 줌 https://qwefdg3.tistory.com/886 이렇게 수정 등을 했을 때(delete도 수정) 자동으로 영속성 컨텍스트를 초기화 해 준다던지 그런 옵션이 있음. @Tes..

24. 동적쿼리. Where 다중 파라미터

where의 인자를 여러개 주면 자동으로 and로 묶어지는 특성을 이용하여 동적 쿼리를 만들 수 있다. private Predicate usernameEq(String usernameCond){ return usernameCond != null ? m.username.eq(usernameCond) : null; } private Predicate ageEq(Integer ageCond){ return ageCond != null? m.age.eq(ageCond) : null; } 먼저 null이 아닐 경우 eq 표현식을 반환하는 메소드를 만들어 줬다. 그리고, private List searchMember2(String usernameCond, Integer ageCond){ return query.se..

23. 동적쿼리. BooleanBuilder 방식

동적쿼리는 2가지 방식이 있음. BooleanBuilder를 사용하는 방법과 Where문 안에 다중 파라미터를 사용하는 방법임. 이 시간에는 BooleanBuilder를 사용하는 방법을 알아보겠음. 우선, BooleanBuilder도 QueryDSL의 표현식을 상속받은 클래스임. private List searchMember1(String usernameParam, Integer ageParam){ BooleanBuilder builder = new BooleanBuilder(); if(usernameParam != null){ builder.and(m.username.eq(usernameParam)); } if(ageParam != null){ builder.and(m.age.eq(ageParam));..

22. @QueryProjection

@QueryProjection이라는 것을 사용할 것이다. 이것으 사용방법은 정말 간단하다. Dto의 프로젝션으로 사용하길 원하는 생성자에게 @QueryProjection public MemberDto(String username, int age) { this.username = username; this.age = age; } 이렇게 붙여주면 그만이다. 또 하나 해야할 건, 빌드해 줘야 한다. Q엔티티 빌드할 때와 마찬가지로 gradle -> other -> compileQuerydsl 해 주면, 빌드 되면서 생성자 하나 있는 파일이 생긴다. @Generated("com.querydsl.codegen.DefaultProjectionSerializer") public class QMemberDto exte..