spring CRUD에 대한 학습을 이어가던 도중,
postman을 통하여 작동 여부를 확인하고 있었다.
@Getter
@Entity
@Table(name = "users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(length = 50, nullable = false)
private String name;
@Column(unique = true, nullable = false)
private String email;
private String address;
이러한 속성을 지닌 엔티티를 생성하는 코드를 postman으로 확인하는 과정에서
의문점을 하나 발견하게 되었다.
첫 번째 생성에서 성공적으로 생성된 것을 확인할 수 있다.

두 번째 생성에서 유니크 특성을 지닌 이메일이 중복되어 오류 발생 -> 정상 작동 확인

세 번째 생성에서 이메일을 변경하여 생성 시도 -> 성공적으로 생성?

이 과정에서 의문이 들었던 것이다.
왜? 이메일 중복으로 오류가 발생해서 생성 실패했던 것이 아닌가?
세 번째 생성에서 User의 id가 2가 아닌 3으로 생성되었는가?
우선 간단하게 생각하였을 때, 두 번째 생성에서 오류가 발생했으나 그 오류가 id : 2를 차지했다고 생각했다.
이를 확인하기 위해 전체 목록을 조회해보았을 때, id값이 1, 3인 user만 조회되었다.
id : 2를 지닌 오류값이 같이 조회될 줄 알았으나, 1과 3만 조회되는 것을 통해 가설이 틀렸다고 가정했다.
반은 맞고, 반은 틀렸다.
결과적으로 id : 2 생성 도중 오류가 발생하였고, 그로 인해 다음 생성이 id : 3으로 생성되었다. 전체 조회에서는 당연히 오류가 발생하여 user 생성 실패한 id : 2는 조회가 안되었던 것이다.
db는 멀티스레딩 환경이기 때문에
id : 2가 unique에 걸렸을 때, 끝난 상황이 아닌 계속 남아있는 상태
이 와중에 생성 시도를 하여 id : 3이 진행중인 상황..
이 때 id : 2는 실패하였는데,
이걸 다시 쓸 수 있게 하려면 진행중이거나 완료된 id가 2보다 큰 쿼리인 id : 3의 id가 2가 되어야한다.
이 과정이 복잡하기 때문에 위와 같은 결과로 동작!