CustomerEntity
@Getter
@NoArgsConstructor( access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Entity
@Table(name = "customer")
public class CustomerEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "customer_id")
private Long customer_id;
@Column(name = "customer_username", nullable = false)
private String customer_username;
@Column(name = "customer_password", nullable = false)
private String customer_password;
}
CustomerRepository
@Repository
public interface CustomerRepository extends JpaRepository<CustomerEntity, Long> {
}
CheckitApplicationTests
@SpringBootTest
class CheckitApplicationTests {
@Autowired
private CustomerRepository customerRepository;
@Test
void testJpa(){
CustomerEntity customerEntity = CustomerEntity.builder()
.customer_username("name")
.customer_password("password")
.build();
this.customerRepository.save(customerEntity);
}
}
id를 생성하는 부분에서 java.sql.SQLException: Field 'id' doesn't have a default value 오류가 나서,
GenerationType을 AUTO로 바꾸니 오류가 해결이 되었지만..
AUTO로 바꾸고 CheckitApplicationTests를 실행시켜 기본키가 1인 행이 저장 되었다.
CheckitApplicationTests를 다시 실행하니, 기본키가 중복이 된다는 오류를 맞이하였다.
Duplicate entry '1' for key 'customer.PRIMARY' GenerationType.AUTO 라는 오류가 떴다.
원인은 기본키에 '1'이라는 값이 중복되는 것이었다.
왜 중복이 되는 것일까?
구글링을 통해 기본키에 Auto Increment 기능을 추가해주고 오류가 해결되었다. (다시 IDENTITY로 바꿔줌. AUTO도 가능)
AUTO_INCREMENT
먼저, AUTO_INCREMENT를 사용하는 이유에 대해 알아보자.
개발을 하다보면 기본키에 AUTO_INCREMENT속성을 부여하는 경우가 많다고 한다.
이러한 속성이 필요한 이유는 바로 여러 명의 클라이언트가 동시에 데이터베이스를 사용할 수 있다는 점에서 시작한다.
-- 클라이언트 A
insert into customer(customer_id, customer_username, customer_password) VALUES
(1, 'user1','password1')
-- 클라이언트 B
insert into customer(customer_id, customer_username, customer_password) VALUES
(1, 'user2','password2')
-- 클라이언트 C
insert into customer(customer_id, customer_username, customer_password) VALUES
(1, 'user3','password3')
새로운 데이터를 모두 1번 id로 입력하려고 시도했다고 가정하자.
이 경우, 3명 중 1명은 통과하지만 나머지 2명은 아래와 같은 에러 메세지를 보게 될것이다.
Duplicate entry '1' for key 'customer.PRIMARY'
위와 같은 상황이 발생하지 않기 위해 AUTO_INCREMENT 속성을 사용한다!!
AUTO_INCREMENT 속성을 가진 컬럼은 새로운 데이터가 입력 될 때 자동으로 1씩 증가된 값이 저장된다.
따라서 사용자들은 id를 지정해 줄 필요가 없으며, 아래와 같이 데이터를 입력하게 된다.
-- 클라이언트 A
insert into customer(customer_username, customer_password) VALUES
('user1','password1')
-- 클라이언트 B
insert into customer(customer_username, customer_password) VALUES
('user2','password2')
-- 클라이언트 C
insert into customer(customer_username, customer_password) VALUES
('user3','password3')
따라서 에러 메세지 없이 데이터를 입력할 수 있게 되는 것이다!
AUTO_INCREMENT를 1로 초기화 해주고, CheckitApplicationTests를 3번 실행시킨 모습이다.
기본키인 customer_id가 정상적으로 1,2,3씩 저장되었다.
틀린 부분이 있다면 지적해주시면 감사하겠습니다.
Reference
Primary Key & AUTO_INCREMENT를 사용하는 이유
[JPA] "java.sql.SQLException: Field 'id' doesn't have a default value" 오류 해결
'Server' 카테고리의 다른 글
[JPA] cannot drop table '' referenced by a foreign key constraint '' on table 오류 해결 (0) | 2024.08.05 |
---|---|
[JPA] JPA란 / 영속성 컨텍스트 #1 (0) | 2024.08.02 |
DDD 개념 / DAO와 Repository 차이 (0) | 2024.07.31 |
[SpringBoot] 패키지 구조 선택하기 계층형/도메인형 (0) | 2024.07.30 |
[SpringBoot] DTO, DAO, VO 개념 알아보기 (0) | 2024.07.12 |