• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

Jpa 데이터베이스 매칭 관련 질문입니다.

24.02.27 22:40 작성 24.02.27 22:52 수정 조회수 224

0

안녕하세요 강사님.
인프런 스터디 과제 7일차 문제 1번 jpa 코드로 변환하던 중 warehousingDate 컬럼 부분에서 문제가 발생하였습니다.

Fruits의 테이블 컬럼 이름은 warehousingDate 입니다.

 

{
    "name":"바나나",
    "warehousingDate":"2024-02-25",
    "price":7000
}

jpa 코드로 바꾼 후 위에처럼 post 하였더니 아래와 같은 결과가 나왔습니다.

Unknown column warehousing_date in field list라고 에러가 뜹니다. 처음에는 @Column(name="warehousing_date") 을 붙이지 않아서 에러가 나는 줄 알고 @Column(name="warehousing_date") 을 붙이고도 진행하였더니 똑같은 에러가 발생하였습니다.

그래서 Fruits 앤티티 warehousingDate 변수명을 warehousing_date로도 변경을 해봤더니 똑같은 에러가 발생하였습니다.
Fruits 엔티티는 아래와 같습니다.

@Entity
public class Fruits {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @Column(name="warehousing_date")
    private LocalDate warehousingDate;
    private long price;

    @Column(nullable = true)
    private boolean sales;


    public Fruits() {
    }

    public Fruits(String name, LocalDate warehousingDate, long price, boolean sales) {
        this.name = name;
        this.warehousingDate = warehousingDate;
        this.price = price;
        this.sales = sales;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LocalDate getWarehousingDate() {
        return warehousingDate;
    }

    public void setWarehousingDate(LocalDate warehousingDate) {
        this.warehousingDate = warehousingDate;
    }

    public long getPrice() {
        return price;
    }

    public void setPrice(long price) {
        this.price = price;
    }

    public boolean isSales() {
        return sales;
    }

    public void setSales(boolean sales) {
        this.sales = sales;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

컨트롤러 코드는 아래와 같습니다.

@PostMapping("/api/v1/fruit")
public void fruitInformation(@RequestBody FruitCreateRequest information){
    fruitService.saveInformation(information);
}

서비스 코드는 아래와 같습니다.

private final FruitJpaRepository fruitRepository;

    public FruitService(FruitJpaRepository fruitRepository) {
        this.fruitRepository = fruitRepository;
    }

public void saveInformation(FruitCreateRequest request){
    fruitRepository.save(new Fruits(request.getName(),request.getWarehousingDate(), request.getPrice(), request.getSales()));
}

RequestDto 코드는 아래와 같습니다.

public class FruitCreateRequest {

    private String name;
    private LocalDate warehousingDate;
    private long price;
    private boolean sales;
    @JsonIgnore
    private Long id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LocalDate getWarehousingDate() {
        return warehousingDate;
    }

    public void setWarehousingDate(LocalDate warehousingDate) {
        this.warehousingDate = warehousingDate;
    }

    public long getPrice() {
        return price;
    }

    public void setPrice(long price) {
        this.price = price;
    }
    public void setSales(boolean sales) {
        this.sales = sales;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public boolean getSales(){
        return sales;
    }
}

 

혹여나 제가 놓친 부분이 없는 지 확인해 주시면 감사하겠습니다.
그리고 fruits 컬럼명은 warehousingDate 라 적었는 데 hibernate는 warehousing_date과 매칭할려는지 알고싶습니다.
질문이 서투른 점 양해바랍니다..

답변 2

·

답변을 작성해보세요.

0

안녕하세요! 🙂 강의에서 추가적으로 제공되는 강의나 미니 프로젝트와 관련한 질문은 현재 대답해드리기 어렵습니다. 😢 혹시나 스터디에 참여하고 계시면, 디스코드와 같은 커뮤니케이션 채널에서 질문 부탁드리겠습니다. 감사합니다! 🙏

물론, 제가 봤을 때 AI 인턴이 답변해준

제공해주신 Entity 클래스에서는 warehousingDate 필드에 명시적으로 @Column(name="warehousing_date") 어노테이션을 사용하여 컬럼명을 지정해 주셨습니다. 여기서 발생한 오류 메시지에 따르면, 데이터베이스에는 ‘warehousing_date’라는 컬럼이 실제로 존재하지 않아 보입니다. 이 문제를 해결하기 위해 데이터베이스 스키마를 확인하고 ‘warehousing_date’ 컬럼이 실제로 존재하는지, 올바르게 생성되었는지 검토해 보셔야합니다.

위 내용이 맞다고 생각합니다. 감사합니다! 🙇

현재 인프런 워밍업클럽 스터디 참가자 인데 스터디 참가자도 질문게시판이 아니라 디스코드 질문코너 채팅창에 질문을 남겨야 답변해주시는건가요..??

@Column(name="warehousing_date") 어노테이션을 안붙일때도 똑같은 에러가 발생하였습니다.. 데이터 베이스 스키마를 확인해보니 컬럼명이 warehousingDate 라서 Entity 필드에 warehousingDate 라 칭했습니다.

그랬더니 hibernate에서는 갑자기 warehousing_date 필드명을 찾을 수 없다고 뜨네요...

디스코드 채팅창에도 질문남기겠습니다.

 

현재 인프런 워밍업클럽 스터디 참가자 인데 스터디 참가자도 질문게시판이 아니라 디스코드 질문코너 채팅창에 질문을 남겨야 답변해주시는건가요..??

넵넵!! "공간뿌웅이"님의 닉네임을 보고 제가 스터디 참여자 분이신지 확인하기 어려워서 디스코드로 소통하는 것을 선호하고 있습니다. 😢 물론, 이번에 질문 주신 내용은 아래 AI 인턴에서 "홍진욱"님이라고 적혀 있고 진욱님께서 스터디 참여자이신 것을 알고 있기에 위에 "데이터베이스 스키마를 확인하고 ‘warehousing_date’ 컬럼이 실제로 존재하는지, 올바르게 생성되었는지 검토해 보셔야합니다." 에 대한 추가 의견을 덧붙여 두었습니다.

 

@Column(name="warehousing_date") 어노테이션을 안붙일때도 똑같은 에러가 발생하였습니다.. 데이터 베이스 스키마를 확인해보니 컬럼명이 warehousingDate 라서 Entity 필드에 warehousingDate 라 칭했습니다.

그랬더니 hibernate에서는 갑자기 warehousing_date 필드명을 찾을 수 없다고 뜨네요...

에 대해서 더 설명을 드려보면, 👍

 

저희가 필드 이름을 camelCase로 적더라도 실제 데이터베이스에서는 snake_case 의 필드와 매핑되는 정책이 있습니다.

예를 들어 warehousing_date 라는 DB의 column 이름은 Entity의 warehousingDate 라는 이름과 대응되는 것이죠. 때문에 @Column 어노테이션을 사용하지 않고 warehousingDate 필드를 Entity에 만드시면, warehousing_date 라는 필드와 대응됩니다.

(참고로 말씀드리면 이런 기본 정책은 설정을 통해 바꿀 수 있지만, 보통은 기본 정책을 그대로 사용합니다.)

감사합니다! 😊 🙏

넵 답변 감사드립니다..! 그럼 DB의 column 이름은 snake_case 형식으로 설정하는 것이 보통 관례인것인가요?? 예를 들어 warehousingDate가 아니라 warehousing_date 로 작성하는 것 처럼요!

네네 맞습니다! 일반적으로 DB 네이밍은 snake_case를 사용해요! 👍

넵 답변 감사합니다!!!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.02.27

안녕하세요, 인프런 AI 인턴입니다. 홍진욱님, 질문해 주셔서 감사합니다.

제공해주신 정보를 검토해 본 결과, warehousingDate 컬럼과 관련하여 발생하는 문제는 가능성이 높지만, 정확한 원인을 파악하기 위해서는 추가적인 정보가 필요합니다. 그러나 유사한 경우에 대해 다룬 기존 답변이 있기 때문에, 이를 참고하시면 문제를 해결하는 데 도움이 될 수 있습니다.

문제가 발생하는 주된 이유는 Java 엔티티의 필드명과 데이터베이스의 컬럼명이 일치하지 않을 때 생기는 것으로 보입니다. JPA(Hibernate)는 Java 클래스의 필드명을 기준으로 쿼리를 생성하며, 기본적으로 카멜케이스(camelCase)의 필드명을 데이터베이스에서 스네이크 케이스(snake_case)로 매핑하려고 합니다.

제공해주신 Entity 클래스에서는 warehousingDate 필드에 명시적으로 @Column(name="warehousing_date") 어노테이션을 사용하여 컬럼명을 지정해 주셨습니다. 여기서 발생한 오류 메시지에 따르면, 데이터베이스에는 ‘warehousing_date’라는 컬럼이 실제로 존재하지 않아 보입니다. 이 문제를 해결하기 위해 데이터베이스 스키마를 확인하고 ‘warehousing_date’ 컬럼이 실제로 존재하는지, 올바르게 생성되었는지 검토해 보셔야합니다.

아래는 유사한 문제에 대한 답변 링크입니다. 참고하셔서 문제 해결에 도움을 받으시길 바랍니다.

이 기존 답변들은 엔티티 클래스 내 필드 이름과 관련하여 JPA가 어떻게 데이터베이스의 컬럼과 매칭하는지 설명하고 있으며, 비슷한 문제에 직면한 다른 학생들이 어떻게 해결했는지 상세한 답변이 포함되어 있습니다.

혹시나 제가 제공한 링크로도 해결이 되지 않거나, 추가적인 정보가 필요하다면 SQL 로그 또는 스키마 생성 쿼리를 보내주시면 더 정확한 도움을 드릴 수 있을 것 같습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.