• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

postgresql 연동 문의

23.11.23 17:51 작성 조회수 142

0

Postgresql DB 사용시 auto_increment 옵션이 업어서

아래와 같이 작성하여 order등록 테스트 진행시 id 값이 null 이어서 에러가 나타납니다.

create table orders (

  id int primary key,

  user_id varchar(50) not null,

  product_id varchar(20) not null,

  order_id varchar(50) not null,

  qty int default 0,

  unit_price int default 0,

  total_price int default 0,

  created_at datetime default now()

)

테이블을 직접 생성하지 않고 소스의 jpa의 create 옵션을 사용하여 orders 테이블을 생성하고 상품을 등록하면 id 값이 자동으로 등록이 되는되 내부적으로 id값이 맵핑되는 로직이 따로 존재 하는 건가요?

 

테이블을 수동으로 생성 후 id 값을 맵핑시킬수 있는 로직이 따론 존재 하는 걸까요?

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.11.25

안녕하세요, 인프런 AI 인턴입니다.

hibnos님께서 Spring에서 Postgresql 데이터베이스와 연동하는 과정에서 auto_increment 옵션에 대한 문의를 주셨군요.

Postgresql에서는 auto_increment 옵션 대신 SERIAL 혹은 BIGSERIAL 데이터 타입을 사용하여 자동으로 증가하는 정수 값을 처리합니다. 질문하신 내용과 관련하여, 아래와 같이 테이블을 생성할 때 id 컬럼에 SERIAL 타입을 지정하면 자동으로 값이 증가하게 됩니다.

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id VARCHAR(50) NOT NULL,
    product_id VARCHAR(20) NOT NULL,
    order_id VARCHAR(50) NOT NULL,
    qty INT DEFAULT 0,
    unit_price INT DEFAULT 0,
    total_price INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT NOW()
);

JPA를 사용하여 테이블을 생성하는 경우 @Id@GeneratedValue 어노테이션을 사용해주셨는데, 매핑된 엔티티의 id 필드에 GenerationType.IDENTITY 전략을 적용하면 데이터베이스가 제공하는 자동 증가 기능을 사용하여 id 값을 자동으로 할당 받을 수 있습니다. Postgresql의 SERIAL 타입과 이 설정은 호환되어 정상 작동합니다.

만약 데이터베이스에 테이블을 수동으로 생성했고, JPA를 사용해 자동으로 id 값을 생성하고 싶다면, @Id@GeneratedValue 어노테이션의 사용법을 그대로 유지하면서 테이블의 id 컬럼 타입을 SERIAL로 지정해주시면 됩니다.

JPA의 Entity 상태나 ID 생성 메커니즘에 대해서는 Spring Data JDBC 문서의 “ID Generation” 섹션에 자세한 정보가 있으니 참고하는 것도 도움이 될 것입니다.

혹시 다른 설정이나 더 궁금한 점이 있으시면 추가로 문의해주세요.