프로그래밍사업/사이드 프로젝트

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

ironwhale 2024. 6. 2. 09:00

이번에는 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);
    }


}