프로젝트를 진행하면서 테스트를 하다 DB 내 데이터를 그냥 삭제하는 경우도 있다.
그 때 상위 테이블과 연관된 하위 테이블 내 데이터를 삭제해서 상위 테이블 조회 시, 하위 테이블 데이터가 없다고 오류가 나는 경험을 했다.
(삭제할 때 사용 중인 부분이 있으면 삭제를 막아두는 것을 구현하기 전에 일어난 일이다.)
이 때, 하위 테이블 데이터를 따로 service 부분으로 빼려했는데 차장님께서 어노테이션에 필요한 기능이 존재한다며 힌트를 주어 알아냈다.
이해하기 쉽게 그림으로 설명을 이어가겠다.
예를 들어, 상위 테이블은 회사 비품 테이블이고 하위 테이블은 사원 테이블로 예시를 들겠다.
상위 테이블: 비품 테이블
id | DeviceName | Employee |
---|---|---|
1 | 마우스 | 2 |
하위 테이블: 사원 테이블
id | EmployeeNumber | Name |
---|---|---|
2 | 20241120 | 곰돌이 |
비품 엔티티: Device
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String DeviceName;
@ManyToOne(fetch = FetchType.LAZY)
private Employee employee;
사원 테이블의 "곰돌이"가 삭제된다면, Device 엔티티를 조회할 때 Emloyee에 해당하는 pk 값이 없다고 오류가 난다.
이 때 유용하게 쓸 수 있는 어노테이션이 @NotFound 이다.
엔티티 내 해당 컬럼에 어노테이션을 선언해주면 값이 없으면 무시하고 서비스가 진행된다.
수정 후 비품 엔티티: Device
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String DeviceName;
@ManyToOne(fetch = FetchType.LAZY)
@NotFound(action = NotFoundAction.IGNORE)
private Employee employee;
에러 메시지로 인해 서비스가 중단되지 않고 계속 실행되어야 할 경우 필요할 때 쓰면 유용할거 같다.