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. 참조
[SpringBoot] JPA 언더바 자동변경 방지
JPA와 MySQL을 연동해서 사용할 경우, 테이블이름이나 칼럼명을 언더바(_)가 아닌 대문자 형식(ex: MyTable)으로작성하는 경우가 있다. 이 경우에 Entity의 테이블 이름을 MyTable로 작성하면, Spring JPA에서
jobc.tistory.com
'백앤드 개발 > Java & Spring' 카테고리의 다른 글
[Spring boot] 자주 쓰는 어노테이션 (1) | 2024.02.01 |
---|---|
[Spring boot] 로그인, 로그아웃 구현 by 스프링 시큐리티 (0) | 2023.11.30 |
[Spring boot] 타임리프 (0) | 2023.11.22 |
[Spring boot] 스프링 MVC 구조 이해 (0) | 2023.11.14 |
[Spring boot] 서블릿, JSP을 활용한 MVC 패턴 (0) | 2023.11.14 |