Spring & Java
JPQL 개념 및 문법 본문

이번 시간은 SQL과 JPQL의 차이점과 유사점을 이해할수 있게 될 것입니다.
기본적인 JPQL 문법을 익히고 CRUD 쿼리를 작성할 수 있습니다.
실습을 통해 JPQL이 실제로 어떻게 동작하는지 체감할 수 있게 됩니다.
JPQL이란? 무엇일까요
JPQL은 Entity 객체를 대상으로 쿼리를 작성하는 갱체 지향 SQL 입니다.
- JPA 에서 사용하는 언어다.
- JPA 에서 사용하는 SQL 문법이다.




자 이제부터 실습을 시작하겠습니다.
기존에 과제에서 쓰던 database를 드롭 하겠습니다.
DROP DATABASE advance;
CREATE DATABASE advance로 데이터 베이스를 새로 생성 했고
CREATE TABLE user (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
age INT NOT NULL
);
CREATE TABLE orders (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
order_name VARCHAR(100) NOT NULL,
amount DECIMAL(10,2) NOT NULL,
user_id BIGINT,
FOREIGN KEY (user_id) REFERENCES user(id)
);
기본 더미 데이이터 테이블을 생성 합니다.


이렇게 테이블이 2개 생성 됐다면 기본 테이블 생성은 완료 됐습니다.

이번엔 데이터를 삽입 해보겠습니다.
<< 데이터 삽입 >>
-- User 데이터
INSERT INTO user (username, age) VALUES
('Kim', 25),
('Lee', 19),
('Park', 32),
('Choi', 40),
('Jung', 22);
-- Order 데이터
INSERT INTO orders (order_name, amount, user_id) VALUES
('Laptop', 1500.00, 1),
('Keyboard', 100.00, 1),
('Monitor', 300.00, 3),
('Mouse', 50.00, 3),
('Desk', 250.00, 4),
('Headphones', 120.00, 5);

잘 삽입 되어 있다는것을 확인할 수 있습니다.
지금부터 데이터를 불러 왔으니 몇가지 테스트로 JPQL을 연습해보겠습니다.
## 조회 (1)
select u.* from user u

## 특정 컬럼 조회
select u.username from user u;

## 조건을 줘서 검색 하기 -> user의 나이가 20살 이상인 조건
select u.* from user u where u.age >20;
## 조건을 줘서 검색 하기 -> user의 나이가 20살 이상인 조건
select u.* from user u where u.age >20 order by u.age; ## 내림차순
select u.* from user u where u.age >20 order by u.age desc ; ## 오름차순

## join 주문 내영중에서 사용자 이름이 Kim인 내역만 조회
select o.*, u.* from orders o join user u on o.user_id = u.id
where u. username = 'kim';
난이도가 좀 있는 문제 입니다. 잘 외우면 잘써먹기 좋아 보여요.

자 이제부터 코드를 좀 수정해가면서 학습해 보겠습니다.

UserDto 클래스를 만들어 생성자를 만듭니다.
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
private long id;
private String username;
private String email;
private UserRoleEnum roleEnum;
public static UserDto from(User user) {
return new UserDto(user.getId(), user.getUsername(), user.getEmail(), user.getRoleEnum());
}
}
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT U FROM User U WHERE U.username = : username")
Optional<User> findUserByUsername(String username);
}
// JPQL을 통한 CRUD 실습
// JPQL은 생성은 잘 안합니다. JPA에서 등록(C)를 한다고 보면 된다.
// 1. 조회하기
@GetMapping("/get/user/{username}/jpql")
public ResponseEntity<UserDto> getUserByUsernameWithJpql(@PathVariable String username){
return ResponseEntity.ok(userService.getUserByUsername(username));
}
// 2. 수정하기
// 3. 삭제하기

잘 불러 와지는것을 확인할 수 있습니다. 이번에는 수정 메서드를 만들어 보겠습니다.
// 2. 수정하기
@PutMapping("/{username}/email/jpql")
public ResponseEntity<String> updateEmailByjpql(
@PathVariable String username,
@RequestBody UpdateUserEmailRequest request
){
userService.updateUserEmailByJpql(username, request.getEmail());
return ResponseEntity.ok("수정 완료");
}
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.username = :username")
Optional<User> findUserByUsername(String username);
@Modifying // 수정 쿼리 꼭 쓰셈!
@Query("UPDATE User u SET u.email = :email WHERE u.username =:username")
void updateEmailByJpql(@Param("username") String username, @Param("email") String email);
}
@Transactional
public UserDto getUserByUsername(String username) {
User user = userRepository.findUserByUsername(username).orElseThrow(
() -> new IllegalArgumentException("등록된 사용자가 없습니다.")
);
return UserDto.from(user);
}

다음은 삭제
@Modifying
@Query("DELETE FROM User u WHERE u.username = :username")
void deleteByUsername(@Param("username") String username);
오늘은 JPQL수업이였습니다 메스드 만들고 삭제 하면 됩니다.
고생하셨습니다. TIL은 없습니다. JPQL의 중요성과 문법을 확실히 이해할 수 있는 시간이였습니다.