QueryDSL์ ํ ์คํธ๋ฅผ ํตํด ๊ฐ๋ณ๊ฒ ์์๋ดค๋ค.
QueryDSL์ ๋ถ๋ช
์ข์ ๋๊ตฌ์ด์ง๋ง ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ QueryDSL๋ก ์ง์ผ๋๋ ๊ฑด ์๋๋ค.
JPA ์ธํฐํ์ด์ค์ ๋์์ ๋ฐ์ ์ ์๋ ๊ฐ๋จํ CRUD ์ฟผ๋ฆฌ๋ JPA์ ๋์์ ๋ฐ์ง ์์ ์ด์ ๊ฐ ์๋ค.
ํ๋ก์ ํธ์ ์ ์ฉํ๋ ค๋ฉด ๊ธฐ์กด JPA ์ธํฐํ์ด์ค์ QueryDSL์ ์ฌ์ฉํ๋ DAO ํด๋์ค๋ฅผ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ค.
User
- Team
๋ ๊ฐ ์ํฐํฐ๊ฐ ์๊ณ ๊ฐ๊ฐ Jpa Repository๋ฅผ ๋ง๋ ์ํ์์ ๋์ ์ฟผ๋ฆฌ๋ฅผ QueryDsl๋ก ์์ฑํด๋ณด์.
๊ธฐ์กด UserRepository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
}
์ด Repository ์ธํฐํ์ด์ค์์ ์ง์ QueryDsl์ ๋ค๋ฃฐ ์๋ ์๋ค.
JPAQueryFactory๋ฅผ ์ฃผ์
๋ฐ์์ผ ํ๋๋ฐ ์ธํฐํ์ด์ค์์๋ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ก QueryDsl ์์ ์ ์ํ ํด๋์ค๋ฅผ ์ ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค.
์ธํฐํ์ด์ค์ ํน์ง์ธ ๋ค์ค์์์ ์ด์ฉํด์ QueryDsl์ ์์ ์ ์ํ Dao ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ณ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ ํ Dao ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ์กด Repository๊ฐ ์์ํ๋๋ก ๊ตฌํํ ๊ฒ์ด๋ค.
Team
์ด๋ฆ์ผ๋ก Team
์ ์ฐพ๊ณ ํด๋น Team
์ ์๋์ด(30์ด ์ด์)๋ฅผ ์ฐพ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด๋ณด์.
์ธํฐํ์ด์ค ์ ์
@Repository
public interface UserDao {
// ์ด๋ค Team์ ์ํ User ์ค ๋์ด๊ฐ 30์ด ์ด์์ธ User๋ฅผ ์กฐํํ๋ค.
List<UserDto> findSeniorUserByTeam(String teamName);
}
๊ตฌํ์ฒด ์ ์
@RequiredArgsConstructor
public class UserDaoImpl implements UserDao {
private final JPAQueryFactory query;
@Override
public List<UserDto> findSeniorUserByTeam(String teamName) {
return query
.select(new QUserDto(user.username, user.age, team.teamName))
.from(user)
.join(user.team, team)
.where(teamNameEquals(teamName), userAgeGreaterOrEqualsThan(30))
.fetch();
}
private BooleanExpression teamNameEquals(String teamName) {
return Objects.isNull(teamName) ? null : team.teamName.eq(teamName);
}
private BooleanExpression userAgeGreaterOrEqualsThan(int age) {
return age < 1 ? null : user.age.goe(age);
}
}
public interface UserRepository extends JpaRepository<User, Long>, UserDao {
Optional<User> findByUsername(String username);
}
ํ ์คํธ๋ฅผ ์ํ ์ปจํธ๋กค๋ฌ
@RequiredArgsConstructor
@RestController
public class UserController {
private final UserRepository userRepository;
@GetMapping("/user/team/{teamName}/senior")
public ResponseEntity<List<UserDto>> test(@PathVariable String teamName) {
List<UserDto> userDtos = userRepository.findSeniorUserByTeam(teamName);
return ResponseEntity.ok(userDtos);
}
}
3์ฐจ ํ๋ก์ ํธ Querydsl ์ค๋น์๋ฃ ใ ใ ..ใ ใ