본문 바로가기

백앤드 개발/Java & Spring

[Spring boot] JPA 칼럼명과 언더바

1. JPA 언더바 자동변경

JPA 는 카멜 표기법 또는 파스칼 표기법을 사용하는 테이블명, 칼럼명을 언더바로 연결된 이름으로 자동 매핑한다.

엔티티의 칼럼명을 myColumn 또는 MyColumn 으로 작성할 경우 my_column 으로 매핑을 시도한다.

2. 해결방법

1) 프로퍼티 설정에서 언더바 자동변경 관련 설정 추가

// application.properties

// 언더바 자동변경 방지
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

 

2) 어노테이션을 통한 테이블/엔티티 이름 지정

DB - JPA 사이 혼동이 없도록 이름을 지정

@Table(name= "my_table")
@Column(name = "my_column")

3. 관련 문제

// 수정 전

// BoardService.java
@Service
@RequiredArgsConstructor
public class BoardService {
    private final BoardRepository boardRepository;

    ...

    public Page<Board> getBoardList(int page) {
        List<Sort.Order> sorts = new ArrayList<>();
        sorts.add(Sort.Order.desc("created_at"));

        //pagesize: 한 페이지당 게시글 수
        Pageable pageable = PageRequest.of(page, 10, Sort.by(sorts));
        return this.boardRepository.findAll(pageable);
    }
}
    
// Board.java
@Entity
public class Board {
    ...
    @Column(nullable = false)
    private LocalDateTime created_at;
    ...
}

 

JPA 에서 created_at 필드를 기준으로 내림차순 정렬을 지시하고자 위와 같이 코드를 작성했다.

그러나 정렬 대상필드를 찾을 수 없다는 오류가 발생했다.

 

// 수정 후

// BoardService.java
@Service
@RequiredArgsConstructor
public class BoardService {
    private final BoardRepository boardRepository;

    ...

    public Page<Board> getBoardList(int page) {
        List<Sort.Order> sorts = new ArrayList<>();
        sorts.add(Sort.Order.desc("createdAt"));

        //pagesize: 한 페이지당 게시글 수
        Pageable pageable = PageRequest.of(page, 10, Sort.by(sorts));
        return this.boardRepository.findAll(pageable);
    }
}
    
// Board.java
@Entity
public class Board {
    ...
    @Column(nullable = false)
    private LocalDateTime createdAt;
    ...
}

 

필드명 변경 created_at > createdAt

언더바가 포함된 필드명으로 정렬을 지시할 경우 제대로 매핑하지 못하는 것 같다.

필드명을 카멜 표기법으로 변경했다.

4. 참조

https://jobc.tistory.com/127

 

[SpringBoot] JPA 언더바 자동변경 방지

JPA와 MySQL을 연동해서 사용할 경우, 테이블이름이나 칼럼명을 언더바(_)가 아닌 대문자 형식(ex: MyTable)으로작성하는 경우가 있다. 이 경우에 Entity의 테이블 이름을 MyTable로 작성하면, Spring JPA에서

jobc.tistory.com