부트캠프 팀원들과 사이드 프로젝트를 진행하면서 멤버 도메인쪽에서 익명 사용자를 저장하기 위한 로직을 작성하던 중 아래와 같은 오류를 만났다.
Request processing failed: org.springframework.orm.jpa.JpaSystemException: Identifier of entity 'com.jeongseok.ormistackoverflowmember.member.infrastructure.MemberEntity' must be manually assigned before calling 'persist()’
이 오류 지금 멤버 테이블에 pk값을 DB에 위임해서 생성하는 방식으로 만들었는데 애플리케이션이 시작하는 시점에 pk가 null인 상태로 시작되기 때문에 오류가 발생했다. 문제를 해결하기 위해 다시 내 소스를 자세히 봤다.
내가 구현하려던 것은 클라이언트가 서버에 최초 요청을 보낼때 필터에서 사용자를 구분지을 수 있는 별도의 UUID를 생성한 뒤 데이터베이스에 pk 값으로 저장하는 로직을 작성하고 있었다.
@Table(name = "members")
public class MemberEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
@Column(name = "session_id")
private String sessionId;
private String id;
@Enumerated(EnumType.STRING)
@Column(name = "role")
private RoleType role;
해당 엔티티를 자세보니 pk값을 DB에 위임하게끔 작성해놓은 것이다. 습관적으로 pk값을 저렇게 설정하다보니 이런 문제가 발생했다.
결국 다음과 같이 수정한 후 UUID 값이 저장될 수 있도록 만들었다.
@Entity
@Getter
@Setter
@Table(name = "members")
public class MemberEntity {
@Id
@Column(name = "member_id")
private String id;
@Enumerated(EnumType.STRING)
@Column(name = "role")
private RoleType role;
@OneToOne(mappedBy = "memberEntity", fetch = FetchType.LAZY)
private StaffEntity staffEntity;
public void updateRole(RoleType role) {
this.role = role;
}
}
'개발 일지' 카테고리의 다른 글
서버 도메인 없이 EC2 서버에 https 적용하기 (0) | 2024.09.07 |
---|---|
메소드 오버라이딩시 super 키워드 조심하기 (0) | 2024.08.16 |
@Bean vs @Component (0) | 2024.08.16 |
DB 작업시 @Transactional는 항상 써야할까? (0) | 2024.06.28 |
동일한 bean으로 등록되는 문제 (0) | 2024.06.27 |