Spring Boot/[Spring boot] 개발

[Spring boot] JPA 쿼리 메서드 네이밍 및 테이블 및 칼럼 이름 매핑

재윤 2025. 1. 5. 16:50
반응형
  • 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)

자동 칼럼 네이밍 룰

  1. 자바 필드 이름을 기반으로 한 칼럼 생성:
    • userId는 데이터베이스의 기본 네이밍 전략에 따라 user_id로 변환
    • kakaoId도 마찬가지로 kakao_id로 변환
    • 대소문자가 섞여 있는 경우, 일반적으로 언더스코어(_)로 구분하여 소문자로 변환
  2. 기본 네이밍 전략:
    • Hibernate의 기본 네이밍 전략은 자바의 camelCase를 스네이크 케이스(snake_case)로 변환하는 것
    • 따라서 자바 필드 kakaoId는 kakao_id로, userId는 user_id로 변환
  3. 명시적 설정 없이 데이터베이스에 저장되는 칼럼 이름:

Java 필드 이름 데이터베이스 칼럼 이름 데이터 타입 제약 조건

userId user_id BIGINT PRIMARY KEY, AUTO_INCREMENT
email email 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이라는 칼럼으로 저장

반응형