코딩기록 저장소 🐕/스스로 프로젝트와 연습

프로젝트(SpringBoot)에 JPA적용해보기6 삭제와 @Transactional

kimkongmom 2024. 5. 21. 10:34

 

 

회원 삭제 (난이도 ⭐)

 

삭제할 수 있는 방법이 다양하게 있는데요 저는 단순하게 id를 받아와서 삭제하는걸로 해봤습니다.

 

 

☁️ Repository

find메서드로 id를 먼저 찾아줍니다.

member가 null이 아니면 remove로 memer를 삭제시켜줍니다.

// 삭제 메소드
public void delete(Long id) {
    Member member = em.find(Member.class, id);
    if (member != null) {
        em.remove(member);
    }

}

 


☁️ Service

삭제에서도 필수로 @Transactional어노테이션을 사용해줘야합니다 깜빡하고 안써서 

There was an unexpected error (type=Internal Server Error, status=500). No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call 

이오류를 접했습니다.🥲

@Transactional
@Override
public void deleteMember(Long id) {
  memberRepository.delete(id);
}

 


☁️ Controller

// 회원 삭제
@PostMapping(value ="/deleteMember")
public String deleteMember(Long id){
    memberService.deleteMember(id);
    return "redirect:/members/check";
}

 

 


☁️ Html

<form>태그로 th:action에 id값을 서버로 보내줍니다.

<tbody>
   <tr th:each="member : ${members}">
      <td th:text="${member.id}"></td>
      <td th:text="${member.name}"></td>
      <td th:text="${member.age}"></td>
      <td>
         <form th:action="@{/members/deleteMember(id=${member.id})}" method="post">
            <button type="submit">삭제</button>
         </form>
      </td>
   </tr>
</tbody>

 

 

 

Jpa를 적용하면서 @Transactional의 중요성을 세삼 깨닫게 되었습니다. 까먹고 쓰지않으면 오류와 대면하게 됩니다.😭

 

짚고 넘어갑시다!

 

⭐@Transactional 어노테이션⭐

 

메서드에서 데이터베이스와 상호작용할 때 트랜잭션을 관리하기 위함입니다. 트랜잭션은 데이터베이스 작업을 원자적으로 수행할 수 있도록 보장하며, 여러 작업이 성공적으로 완료되거나 모두 롤백되도록 합니다. @Transactional 어노테이션이 필요한 경우와 그렇지 않은 경우는 다음과 같은 기준에 따라 결정됩니다:

@Transactional가 필요할때!


데이터베이스에 변경을 가하는 작업
데이터베이스에 데이터를 삽입(insert), 수정(update), 삭제(delete)하는 작업.
이러한 작업은 부분 실패가 발생하면 데이터 무결성을 해칠 수 있으므로 트랜잭션 내에서 수행해야 합니다.


여러 데이터베이스 작업을 원자적으로 수행해야 하는 경우
여러 데이터베이스 작업을 하나의 트랜잭션으로 묶어서 원자적으로 수행해야 할 때 사용합니다.
예를 들어, 여러 레코드를 수정하거나 여러 테이블에 걸쳐 작업을 수행하는 경우.

 

@Transactional이 필요하지 않을때


단순 조회 작업
데이터베이스에서 데이터를 조회하는 작업은 일반적으로 트랜잭션이 필요 없습니다.
트랜잭션을 사용하지 않아도 데이터 무결성에 영향을 미치지 않기 때문입니다.


비즈니스 로직만 포함된 경우
데이터베이스와의 상호작용이 없는 비즈니스 로직만 포함된 메서드