dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • AI Tech
  • 서블릿
  • 일기
  • 백준
  • Baekjoon
  • 반성
  • 기록
  • HackerRank mysql
  • 프로그래머스 SQL
  • Hackerrank
  • 스프링
  • 네이버 부스트캠프
  • dp
  • BFS
  • 회고
  • 백준 DP
  • 부스트캠프
  • c++
  • 프로그래머스
  • 그래프탐색

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

개발 공부/스프링

[SpringBoot x JPA] Soft Delete #1 Select (해당 Status 조건 추가 조회 방법) - @Where

2022. 9. 11. 00:11
728x90

현재 상황

저는 현재 서버 개발 중, 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을 통해서 편리하게 해결할 수 있었습니다.

편리해서 좋긴 하지만 해당 어노테이션의 동작 원리는 나중에 간단하게라도 찾아봐야 할 것 같습니다.

이 기능만을 위해서 추가했지만, 혹시나 저도 모르는 사이에 오류를 발생시킬 수도 있기 때문입니다..!

728x90
저작자표시 비영리 변경금지 (새창열림)

'개발 공부 > 스프링' 카테고리의 다른 글

[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
    '개발 공부/스프링' 카테고리의 다른 글
    • [Junit5, Mockito] Mockito를 이용해서 Void 메서드 Mocking하기
    • [Github Actions] CI 스크립트에 Redis 환경 추가하기
    • [SpringBoot x JPA] List 초기화에서 Builder 패턴 사용 시 NullPointerException
    • [SpringBoot] response.sendRedirect(url)가 동작하지 않는 경우
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바