오늘 배운 것

24-05-28 Spring 팀 프로젝트

무무11 2024. 5. 28. 23:58

오늘은 스프링 팀 프로젝트 필수 수현 단계 코드 작성을 하는 시간을 가졌다. 팀원들과 다같이 모여 작업을 하는 것이 생각보다 어려운 작업이었다. git에도 익숙하지 않았기 때문에 어려움이 많았던 것 같다.

 

git 사용법을 어느정도 익혔다는 것 만으로도 충분한 수확이 있었던 날인것 같다.

 

여기에는 프로젝트 진행과정중에 생긴 의문에 대해 정리해보았다.

 

1. @Transactional 어노테이션

오늘 팀원들과 같이 스프링 코드를 짜다가 나오게 된 얘기가 있었다. @Transactional 어노테이션과 관련된 내용이었는데 아래와 같이 단순히 게시글을 삭제하는 경우에도 이 어노테이션이 필요한가 아닌가에 대한 얘기가 나왔었고 나도 이 부분에 대해서 잘 알고 있다고 생각했는데 당시에는 생각이 잘 떠오르지 않았다.

 

결론적으로 말해서 @Transactional을 붙이지 않아도 잘 삭제가 된다. 하지만 그 과정을 잘 들여다볼 필요가 있다. 아래 코드를 한 번 잘 살펴보자

fun deletePost(postId: Long) {
    val post: Post = postRepository.findByIdOrNull(postId) ?: throw ModelNotFoundException("Post", postId)
    postRepository.delete(post)
}

먼저 함수의 첫째 줄을 보자. 먼저 DB를 조회해서 POST 엔티티를 하나 만들어 변수 post에 넣어주게 된다. 그런데 이 때 @Transactional을 붙이지 않았기 때문에 바로 영속성 컨텍스트가 닫히게 된다. 때문에 post는 준영속상태가 된다.

 

그런 다음 삭제를 진행하게 된다. 이렇게 되면 준영속 상태의 post를 삭제하려면 다시 DB를 조회해서 POST 엔티티를 하나 새로 만든다음 post와 병합을 하게되고 DB에 삭제 쿼리가 날라가 삭제가 진행되게 된다.

 

다시 말해 DB 조회가 두 번 이루어지고 SELECT 쿼리가 두 번 날라가게 된다.

 

하지만 @Transacitional을 붙이면 영속성 컨텍스트가 중간에 종료되지 않기 때문에 다시 DB를 조회하고 엔티티를 병합하는 불필요한 과정이 일어나지 않게된다.

 

직접 @Transactional을 붙였을때 안 붙였을때 쿼리가 어떻게 나가는지 확인해보았다.

 

먼저 @Transactional을 붙이지 않고 삭제 작업을 진행해보았다. 아래와 같이 SELECT 쿼리가 두 번 나가는 것을 볼 수 있다.

그런 다음 이번에는 @Transactional을 붙여 보았다.

위와 같이 SELECT 쿼리가 한 번 나가는 것을 볼 수 있다. 따라서 불필요한 쿼리를 방지하기 위해 어노테이션을 붙여주는 것이 좋을 것이라 결론 내릴 수 있다.

 

JPA의 동작 원리를 어느정도 이해하고 나니 위와 같은 의문이 생겼을 때 직접 과정을 따라가면서 어떤 일이 발생하는지 파악하는 것이 가능해졌다. 앞으로도 공부하면서 내가 사용하는 프로그램의 동작 원리에 대해서도 생각해보고 공부해보는 시간을 가져봐야 겠다는 생각이 들었다.

 

2. 오늘 배운 것

- git 사용법에 대해 조금 더 알게되고 익숙해지게 되었다.

- 협업하는 과정에서 예상하지 못한 문제들이 상당히 많이 발생했었는데 역시 이런 경험 자체가 아주 중요하다는 것을 깨달을 수 있었다.