Spring Boot + JPA + Oracle: DEL_YN 컬럼을 이용한 논리적 삭제 처리 구현하기
개요
Spring Boot 애플리케이션에서JPA와 Oracle을 조합하여 삭제 API를 구현할 때, 실제 DELETE SQL을 실행하는 대신 논리적 삭제를 위해 DEL_YN 컬럼 값을 'Y'로 업데이트하는 방식으로 삭제 처리를 구현해야 하는 경우가 있습니다. 이때, dataRegDtti와 같은 ID 컬럼을 사용하여 해당 레코드를 식별하고, DEL_YN 값을 변경하는 방법을 소개합니다.
이 포스팅에서는 DEL_YN 컬럼을 'Y'로 업데이트하여 논리적 삭제를 처리하는 API의 서비스 클래스 구현 방법에 대해 설명합니다.
1. 요구 사항
dataRegDtti라는 ID 컬럼을 기준으로 해당 데이터를 찾아서 삭제하지 않고 논리적으로 삭제를 처리합니다.- 논리적 삭제는 실제 레코드를 삭제하지 않고,
DEL_YN이라는 컬럼을'Y'로 변경하는 방식으로 구현됩니다. - API 호출 시 전달받은
dataRegDtti값을 통해 특정 레코드를 식별하여DEL_YN컬럼을 업데이트해야 합니다.
2. 해결 방법
2.1. 엔티티 클래스 설계
먼저, 데이터베이스에서 논리적 삭제를 위한 컬럼인 DEL_YN을 갖는 엔티티 클래스를 설계해야 합니다. 이 클래스는 dataRegDtti라는 ID 값을 기준으로 데이터를 찾아 DEL_YN을 업데이트할 수 있도록 구성합니다.
예시: 엔티티 클래스 (Entity Class)
import jakarta.persistence.*;
@Entity
@Table(name = "YOUR_TABLE_NAME")
public class YourEntity {
@Id
@Column(name = "DATA_REG_DTTI")
private String dataRegDtti;
@Column(name = "DEL_YN")
private String delYn;
// Getters and Setters
public String getDataRegDtti() {
return dataRegDtti;
}
public void setDataRegDtti(String dataRegDtti) {
this.dataRegDtti = dataRegDtti;
}
public String getDelYn() {
return delYn;
}
public void setDelYn(String delYn) {
this.delYn = delYn;
}
}
DEL_YN컬럼은 논리적 삭제를 나타내기 위한 필드입니다. 'Y'로 설정되면 삭제된 상태를 의미하고, 'N'으로 설정되면 활성 상태임을 나타냅니다.
2.2. JPA Repository 설계
DEL_YN 값을 'Y'로 업데이트하는 쿼리를 작성하기 위해 JPA Repository를 정의합니다. @Modifying과 @Query를 활용하여 DEL_YN 컬럼을 업데이트하는 쿼리를 작성할 수 있습니다.
예시: Repository 클래스 (Repository Class)
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.transaction.annotation.Transactional;
public interface YourEntityRepository extends CrudRepository<YourEntity, String> {
// DEL_YN을 'Y'로 업데이트하는 쿼리
@Modifying
@Transactional
@Query("UPDATE YourEntity e SET e.delYn = 'Y' WHERE e.dataRegDtti = :dataRegDtti")
void updateDelYnByDataRegDtti(String dataRegDtti);
}
@Modifying:UPDATE와 같은 데이터 수정 작업을 처리하기 위한 어노테이션입니다.@Transactional: 데이터베이스 트랜잭션을 관리하는 어노테이션으로, 쿼리가 실행되는 동안 트랜잭션을 시작하고 커밋합니다.
2.3. 서비스 클래스 구현
이제 서비스 클래스에서 YourEntityRepository를 사용하여 논리적 삭제를 처리하는 메서드를 작성합니다. 해당 메서드는 dataRegDtti 값을 파라미터로 받아, DEL_YN 컬럼을 'Y'로 업데이트하는 로직을 처리합니다.
예시: 서비스 클래스 (Service Class)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class YourEntityService {
private final YourEntityRepository yourEntityRepository;
@Autowired
public YourEntityService(YourEntityRepository yourEntityRepository) {
this.yourEntityRepository = yourEntityRepository;
}
public void deleteEntityById(String dataRegDtti) {
// 논리적 삭제를 위한 DEL_YN 컬럼 업데이트
yourEntityRepository.updateDelYnByDataRegDtti(dataRegDtti);
}
}
deleteEntityById(String dataRegDtti)메서드는dataRegDtti를 받아 해당 엔티티의DEL_YN값을'Y'로 업데이트하는 작업을 합니다.@Autowired를 통해YourEntityRepository를 주입받고, 이를 이용해 실제 삭제 로직을 처리합니다.
2.4. 컨트롤러 구현
서비스 클래스에서 정의한 삭제 메서드를 호출하는 REST API를 구현합니다. 해당 API는 dataRegDtti 값을 요청 파라미터로 받아 서비스를 호출하고, 클라이언트에게 처리 결과를 반환합니다.
예시: 컨트롤러 클래스 (Controller Class)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class YourEntityController {
private final YourEntityService yourEntityService;
@Autowired
public YourEntityController(YourEntityService yourEntityService) {
this.yourEntityService = yourEntityService;
}
@DeleteMapping("/delete/{dataRegDtti}")
public ResponseEntity<String> deleteEntity(@PathVariable String dataRegDtti) {
// 서비스 메서드를 호출하여 논리적 삭제 처리
yourEntityService.deleteEntityById(dataRegDtti);
return ResponseEntity.ok("Entity marked as deleted.");
}
}
@DeleteMapping("/delete/{dataRegDtti}"):dataRegDtti를 URL 경로 변수로 받아 DELETE 요청을 처리합니다.- 서비스의
deleteEntityById메서드를 호출하여 논리적 삭제를 수행합니다.
3. 테스트
위와 같은 구현을 통해, DELETE 요청이 들어오면 실제로 데이터베이스에서 레코드를 삭제하지 않고, DEL_YN 컬럼을 'Y'로 업데이트하여 논리적 삭제를 처리할 수 있습니다.
예시 요청:
DELETE /delete/20250218152330123456
dataRegDtti가20250218152330123456인 레코드의DEL_YN값이'Y'로 업데이트됩니다.
4. 결론
Spring Boot와 JPA를 활용하여 논리적 삭제를 구현하는 방법을 알아보았습니다. DEL_YN 컬럼을 사용하여 실제 데이터를 삭제하지 않고, 상태를 'Y'로 변경하는 방식은 데이터 무결성을 유지하면서도 데이터를 복구할 수 있는 장점을 제공합니다. 이 방법을 사용하면 삭제된 데이터를 나중에 복원하거나 분석할 수 있는 이점이 있습니다.
Comments
Post a Comment