본문 바로가기

[스프링부트/업무일지 만들기] 업무일지를 저장하고 수정하고 삭제하고 읽어오기

ironwhale 2024. 6. 2.

이번에는 DB에 업무일지를 저장하고 수정하고 삭제하고 읽어오는 코드를 작성해보겠습니다. 스프링 데이터 JPA를 이용해 간단하게 구현해보겠습니다. 


Repository 만들기

스프링 데이터 JPA를 이용하면 손쉽게 DB에서 데이터를 읽어오고 삭제하고 저장하는 기능을 구현할 수 있습니다. 여기서는 검색 기능도 미리 추가 하였습니다. 그리고 자신이 쓴 글만 볼수 있게 하기 위해 이메일을 입력 받습니다. 보통의 다른 사이트와 같이 이메일을 아이디로 사용하는 업무일지 입니다. 

전체코드

@Repository
public interface WorkLogRepository extends JpaRepository<WorkLog, Long> {

    @Query(
            "select distinct w from WorkLog w " +
                    "where w.log like %:kw% AND w.userName = :email"
    )
    List<WorkLog> findAllByKeyword(@Param("kw") String kw,@Param("email") String email);

    List<WorkLog> findByUserName(String email);
}

서비스 만들기 

앞서 만든 WorkLogRepository를 가지고 오는데 @RequiredArgsConstructor를 사용해서 생성자를 통해 리포지토리를 입력받습니다. 그리고 스프링에서는 자동으로 이 리포지토리 객체를 주입해줍니다. 

 

다른건 아마도 스프링 공부를 하셨으면 쉽게 이해가 되실텐데 update 메소드는 살짝 이해가 어려울 실 수도 있습니다.

일단 @Transactional 애너테이션을 꼭 붙이셔야 되고 안쓰시려면 그냥 레포지토리에 save 메소드를 호출하셔야 update쿼리가 나가게 됩니다. 수정하는 로직 동작 방식은 일단 수정하고자 하는 데이터를 찾아오고 그 불러온 데이터 객체의 데이터를 setter와 같은 메소드로 수정하시면 됩니다. 자세한 내용은 JPA의 동작 방식에 관하여 공부하시면 왜 이렇게 동작하는지 아실 수 있으실겁니다. 

 

그냥 원리보단 수정방법에 대해 정리하면 우선 수정할 데이터를 불러오고 그 데이터 객체를 수정하고 이때 @Transactional를 붙인다로 정리할 수 있겠습니다. 

 

전체코드

@Service
@RequiredArgsConstructor
public class WorkLogService {

    private final WorkLogRepository workLogRepo;

    public WorkLog saveLog(WorkLog workLog) {
        return workLogRepo.save(workLog);
    }

    public WorkLog findById(Long id) {
        Optional<WorkLog> workLog = workLogRepo.findById(id);
        return workLog.orElseThrow(() -> new IllegalArgumentException("not found" + id));
    }

    public List<WorkLog> findByKeyword(String keyword,String userName) {
        return workLogRepo.findAllByKeyword(keyword,userName);
    }

    public List<WorkLog> findAll(String userName) {
        return workLogRepo.findByUserName(userName);
    }

    @Transactional
    public WorkLog updateWorkLog(Long id, UpdateWorkLogRequest 
    request,String userName) {
        WorkLog workLog = workLogRepo.findById(id)
        	.orElseThrow(() -> new IllegalArgumentException("not found" + id));

        if(!workLog.getUserName().equals(userName)) {
            throw new SecurityException("You are not allowed to update this log");
        }
        workLog.update(request.getLog(), request.getTags());

        return workLog;
    }

    public void deleteWorkLog(Long id) {
        workLogRepo.deleteById(id);
    }


}

댓글