본문 바로가기
JAVA

땅꼬마의 JPQL 사용하기!

by 땅꼬마개발자 2023. 7. 31.

지난 시간에 이어 간단하게 JPQL을 사용하여 데이터를 SELECT 해서 가져오자!

 

먼저

JPQL이란!?

Java Persistence Query Language 의 약자로 말그대로 자바 영속성 쿼리이다.

SQL를 추상화 하여 자바 객체화된 entity를 처리하는 언어이다. 결국 DB와 통신시 SQL로 변환된다.

 

특징

- 테이블이 아닌 객체를 검색하는 객체지향 쿼리

- SQL을 추상화 했기 때문에 특정 벤더에 종속적이지 않음

- JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회(*즉 JPQL은 SQL로 변환된다)

 

간단한 조회를 구현했다.

 

UserController.java

@GetMapping(value = "/user")
public ResponseEntity<APIResponse> srchUser(@RequestParam(name = "userId", required = false) String userId
                                            , @RequestParam(name = "userNm", required = false) String userNm){
    return ResponseEntity.status(HttpStatus.OK).body(APIResponse.of(userService.srchUser(userId,userNm)));
}

조회조건으로 userId 또는 userNm을 받는다.

조회조건이 없는 경우 전체조회 된다.

 

UserService.java

public List<ResponseUser> srchUser(String userId, String userNm) {
   List<UserEntity> userList = userRepository.srchUser(userId, userNm);
   ResponseUser responseUsers = new ResponseUser();
   List<ResponseUser> responseUserList = new ArrayList<>();
   for(UserEntity a : userList){
       ResponseUser res = responseUsers.toDto(a);
       responseUserList.add(res);
   }
   return responseUserList;
}

UserRepository에서 조회해온 Entity 리스트를 받아서 Dto로 변환 Controller에 리턴해준다

 

UserRepository.java

@Query(value = "select t.* from TBL_USER_M t " +
        "where (:userId is null or t.USER_ID=:userId) " +
        "and (:userNm is null or t.USER_NM=:userNm)", nativeQuery = true)
List<UserEntity> srchUser(@Param("userId")String userId, @Param("userNm")String userNm);

@Query 어노테이션의 value값으로 select문을 작성한다. userId, userNm 파라미터가 있는경우와 없는경우가 있으니 null처리를 해주었다. 파라미터를 받을 때 @Param 어노테이션을 사용하여 파라미터의 키값을 명시해주어야 오류가 나지 않는다.

 

ResponseUser.java

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ResponseUser {

    private String userId;
    private String userNm;
    private String userTel;
    private String post;
    private String userAddr1;
    private String userAddr2;

    public ResponseUser toDto(UserEntity userEntity){
        return ResponseUser.builder()
                .userId(userEntity.getUserId())
                .userNm(userEntity.getUserNm())
                .userTel(userEntity.getUserTel())
                .post(userEntity.getPost())
                .userAddr1(userEntity.getUserAddr1())
                .userAddr2(userEntity.getUserAddr2())
                .build();
    }
}

조회된 데이터를 담아 화면으로 보내줄 Dto이다. Entity를 Dto로 변환하는 메소드를 가지고 있다.

 

이렇게 구현하였고 Swagger를 통해 통신확인 결과

조회가 잘 이루어짐을 확인했다

 

사용자 업데이트와 삭제는 JPQL로 구현하고

이후 고객정보 ~ 주문관리 등등 BACK 구성은 Querydsl로 진행하려한다~

 

앞으로도 많이 기대해주세요 : )