반응형
- Spring Data JPA에서 쿼리 메서드 네이밍은 메서드 이름을 기반으로 SQL 쿼리를 자동으로 생성하는 방식
- 이를 통해 개발자는 SQL을 직접 작성하지 않고도 데이터베이스에 접근하고 원하는 데이터를 조회가능
1. 쿼리 메서드 네이밍 규칙
Spring Data JPA는 쿼리 메서드 이름을 다음과 같은 규칙에 따라 작성
- findBy: 데이터를 조회할 때 사용
- countBy: 데이터의 개수를 셀 때 사용
- deleteBy: 특정 조건에 맞는 데이터를 삭제할 때 사용
- existsBy: 특정 조건에 맞는 데이터가 존재하는지 확인할 때 사용
위의 키워드 뒤에는 필드 이름이 오게 된다. 필드 이름은 엔티티 클래스의 속성과 일치해야 함
ex → Users 엔티티에 email이라는 필드가 있다고 가정하면, 이메일로 사용자를 찾기 위한 쿼리 메서드
List<Users> findByEmail(String email);
2. 필드 이름의 사용
- 메서드 이름의 나머지 부분은 엔티티에 정의된 필드 이름과 정확히 일치해야함.
- 대소문자를 구분하며, 자바의 표기법 (camelCase)을 따라야 한다.
예시:
// Users 엔티티
public class Users {
private Long userId;
private String email;
private String nickname;
}
- findByUserId(Long userId): userId 필드를 기준으로 데이터를 조회
- findByEmail(String email): email 필드를 기준으로 데이터를 조
- findByNickname(String nickname): nickname 필드를 기준으로 데이터를 조회
3. 쿼리 조건 추가 (And, Or 등)
- 여러 조건을 결합하여 더 복잡한 쿼리를 만들 수 있다.
- 이 경우 메서드 이름에 And, Or 키워드를 사용하여 조건을 조합
예시:
// 두 가지 조건을 모두 만족하는 경우
List<Users> findByEmailAndNickname(String email, String nickname);
// 두 조건 중 하나라도 만족하는 경우
List<Users> findByEmailOrNickname(String email, String nickname);
4. 비교 연산자 사용
Spring Data JPA는 다음과 같은 비교 연산자를 지원
- Is 또는 Equals: 특정 값과 일치하는 데이터를 찾는다
- Between: 두 값 사이의 데이터를 찾는다
- LessThan, LessThanEqual: 보다 작은 값 또는 작은 값과 같은 데이터를 찾는다
- GreaterThan, GreaterThanEqual: 보다 큰 값 또는 큰 값과 같은 데이터를 찾는다
- Like: 특정 패턴과 일치하는 데이터를 찾는다
- Not: 특정 조건과 일치하지 않는 데이터를 찾는다
- In: 지정된 값 목록에 포함되는 데이터를 찾는다
- IsNull, IsNotNull: 값이 null이거나 null이 아닌 데이터를 찾는다
예시:
// 나이가 특정 값보다 큰 경우
List<Users> findByAgeGreaterThan(int age);
// 이메일이 특정 패턴과 일치하는 경우
List<Users> findByEmailLike(String emailPattern);
// 사용자 ID가 주어진 목록에 있는 경우
List<Users> findByUserIdIn(List<Long> userIds);
// 닉네임이 비어 있지 않은 경우
List<Users> findByNicknameIsNotNull();
5. 정렬과 페이징
- 결과를 정렬하거나 페이지로 나누기 위해 OrderBy 키워드를 사용할 수 있다.
- 이 키워드는 정렬 기준이 되는 필드와 함께 사용
예시:
// 닉네임 기준으로 오름차순 정렬된 사용자 목록 조회
List<Users> findByEmailOrderByNicknameAsc(String email);
// 사용자 ID 기준으로 내림차순 정렬된 사용자 목록 조회
List<Users> findByEmailOrderByUserIdDesc(String email);
6. 네이밍 패턴 요약
- findBy + 필드 이름: 특정 필드 값을 기준으로 조회
- findBy + 필드 이름 + And / Or + 필드 이름: 여러 필드 값을 기준으로 조
- findBy + 필드 이름 + GreaterThan / LessThan: 비교 연산자를 포함한 조회 조건을 추가
- findBy + 필드 이름 + OrderBy + 정렬 필드 + Asc / Desc: 정렬된 결과를 조회
7. 예제: LinksRepository에서의 메서드
LinksRepository에서 Users의 user_id를 기준으로 Links를 조회하고 싶다면, 올바른 필드명을 사용하여 다음과 같이 작성
List<Links> findByUsers_User_id(Long userId);
- Users: Links 엔티티의 Users 타입의 필드 이름
- User_id: Users 엔티티의 실제 필드 이름입니다 (user_id).
테이블 및 칼럼 이름 매핑
- Users 엔티티에 따라, 데이터베이스에서 생성되는 테이블과 칼럼 이름은 다음과 같이 저장된다
- JPA는 자바 엔티티 클래스의 필드 이름을 사용하여 데이터베이스 칼럼을 생성
- 대소문자 구분 없이 사용하는 데이터베이스에서는 모두 소문자로 저장될 수 있다.
Users 엔티티 설정
@Getter
@Entity
@Table(name = "users")
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
@Setter
@Column(nullable = false)
private String email;
@Setter
@Column(nullable = false)
private String nickname;
@Setter
@Column(nullable = false)
private String profile;
@Setter
@Column(nullable = false)
private Long kakaoId;
@OneToMany(mappedBy = "users", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Links> links;
@Builder
public Users(String email, String nickname, String profile, Long kakaoId) {
this.email = email;
this.nickname = nickname;
this.profile = profile;
this.kakaoId = kakaoId;
}
}
데이터베이스에 저장되는 테이블 구조
- 테이블 이름: users
- @Table(name = "users") 어노테이션에 의해 테이블 이름이 "users"로 지정
- 칼럼 이름과 타입:
- userId → user_id (타입: BIGINT, 기본키, 자동 증가)
- email → email (타입: VARCHAR, NOT NULL)
- nickname → nickname (타입: VARCHAR, NOT NULL)
- profile → profile (타입: VARCHAR, NOT NULL)
- kakaoId → kakao_id (타입: BIGINT, NOT NULL)
자동 칼럼 네이밍 룰
- 자바 필드 이름을 기반으로 한 칼럼 생성:
- userId는 데이터베이스의 기본 네이밍 전략에 따라 user_id로 변환
- kakaoId도 마찬가지로 kakao_id로 변환
- 대소문자가 섞여 있는 경우, 일반적으로 언더스코어(_)로 구분하여 소문자로 변환
- 기본 네이밍 전략:
- Hibernate의 기본 네이밍 전략은 자바의 camelCase를 스네이크 케이스(snake_case)로 변환하는 것
- 따라서 자바 필드 kakaoId는 kakao_id로, userId는 user_id로 변환
- 명시적 설정 없이 데이터베이스에 저장되는 칼럼 이름:
Java 필드 이름 데이터베이스 칼럼 이름 데이터 타입 제약 조건
userId | user_id | BIGINT | PRIMARY KEY, AUTO_INCREMENT |
VARCHAR | NOT NULL | ||
nickname | nickname | VARCHAR | NOT NULL |
profile | profile | VARCHAR | NOT NULL |
kakaoId | kakao_id | BIGINT | NOT NULL |
칼럼 이름 제어를 위한 추가 설정
만약 데이터베이스의 칼럼 이름을 직접 제어하고 싶다면, @Column 어노테이션을 사용하여 명시적으로 이름을 설정 가능
@Column(name = "custom_column_name")
private String someField;
위 예제에서는 필드 someField가 데이터베이스의 custom_column_name이라는 칼럼으로 저장
반응형
'Spring Boot > [Spring boot] 개발' 카테고리의 다른 글
[Spring boot] Folder 데이터베이스 생성, 기능 추가 (0) | 2025.01.06 |
---|---|
[Spring boot] @ResponseEntity @ResponseBody 차이 (0) | 2025.01.05 |
[Spring boot] Link 데이터베이스 생성, 기능 추가 (0) | 2025.01.05 |
[Spring boot] users 데이터베이스 생성과 로그인 (1) | 2025.01.05 |
[Spring boot] java22 → java21 컴파일 변경 (0) | 2025.01.05 |