현재 상황
저는 현재 서버 개발 중, Delete 요청 시 실제로 데이터를 삭제하는 Hard Delete 방식이 아닌 해당 데이터의 Status를 변경해서 관리하는 Soft Delete 정책을 사용 중입니다.
그러나 요구 사항 중, 이메일 또는 닉네임이 중복되지 않아야 하는 조건이 있었습니다.
위에서 설명했듯이, 실제로 데이터가 지워지는 것이 아니기 때문에 회원 탈퇴한 유저의 데이터는 그대로 DB에 저장되어 있습니다. 따라서 동일한 닉네임으로 다른 유저가 회원 가입하는 경우 탈퇴된 유저의 영향을 받으면 안 됩니다.
조회할 때 어떻게?
사실 이전 프로젝트에서는 Spring Data JPA를 이용해서 메서드를 만들고 쿼리를 만들었던 기억이 있습니다.
Optional<Member> findByNickNameAndAccountStatus(String nickName, AccountStatus status);
하지만 현재 프로젝트에 회원 탈퇴를 적용할 경우, 조회하는 쿼리 메서드에 모두 Status 관련 조건을 추가해줘야 하는 문제점이 발생했습니다.
1. 해당 조회를 사용하는 메서드를 하나하나 변경해줘야 한다.
2. 단순 조회 쿼리뿐만 아니라 다른 조건에서도 사용할 때 매번 해당 조건을 기억해서 넣어줘야 한다.
따라서 저는 일일이 조건을 넣어주는 방법은 그다지 좋은 방법이 아니라고 생각했고 JPA의 기능을 좀 더 살펴봤습니다.
@Where
해당 Entity 객체에 @Where(clause = 원하는 조건)을 써주면, 해당 Entity를 조회할 때 자동으로 조건이 추가됩니다.
실제 SQL문에 들어가는 문법에 맞춰서 작성해줘야 합니다.
(저는 처음에 ACTIVE 작성 시 앞 뒤에 ' '를 붙여주지 않아서 SQL 문법 에러가 계속 발생했었습니다..
실제 동작하는 SQL 문법으로 써야 정상 동작합니다!)
@Where(clause = "account_status = 'ACTIVE'")
저는 활성화 상태인 유저만 조회하는 것을 원했으므로 해당 조건을 추가해줬습니다.
그리고 조회 쿼리를 실행시켜봤고, 정상적으로 해당 조건이 추가되는 것을 확인할 수 있었습니다.
Hibernate:
select
member0_.member_id as member_i1_3_,
...
from
member member0_
where
(
member0_.account_status = 'ACTIVE'
)
and member0_.email=?
해당 Member Entity를 조회하는 경우엔 모두 포함됩니다.
다른 객체에서 Lazy Loading 하는 경우 또한 해당 Where 조건이 포함돼서 select가 진행됩니다.
결론
따라서 저는 매번 Status 조건을 추가한 메서드를 모두 변경해서 사용하거나 조건을 추가해주지 않고, @Where을 통해서 편리하게 해결할 수 있었습니다.
편리해서 좋긴 하지만 해당 어노테이션의 동작 원리는 나중에 간단하게라도 찾아봐야 할 것 같습니다.
이 기능만을 위해서 추가했지만, 혹시나 저도 모르는 사이에 오류를 발생시킬 수도 있기 때문입니다..!
'개발 공부 > 스프링' 카테고리의 다른 글
[Junit5, Mockito] Mockito를 이용해서 Void 메서드 Mocking하기 (0) | 2022.10.05 |
---|---|
[Github Actions] CI 스크립트에 Redis 환경 추가하기 (0) | 2022.10.02 |
[SpringBoot x JPA] List 초기화에서 Builder 패턴 사용 시 NullPointerException (0) | 2022.08.08 |
[SpringBoot] response.sendRedirect(url)가 동작하지 않는 경우 (0) | 2022.07.09 |
[SpringBoot] Custom Exception 에러 처리 및 리팩토링 (Custom Exception) (0) | 2022.06.27 |