인프런 커뮤니티 질문&답변

jd님의 프로필 이미지

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

25강. Spring Data JPA를 이용해 자동으로 쿼리 날리기

updatName 메소드 질문입니다.

해결된 질문

23.08.16 18:58 작성

·

210

1

안녕하세요 강사님, 강의 잘 듣고있습니다.

강의에서 updateName 메소드를 domain에 작성하였는데 그 이유가 궁금합니다. 다른 기능은 userrepository의 메소드를 활용하는 것 같은데 수정 기능은 다른 이유가 궁금합니다.

감사합니다.

답변 1

2

최태현님의 프로필 이미지
최태현
지식공유자

2023. 08. 16. 21:27

안녕하세요~ b_lion님! 크으~~ 기가 막힌 질문이십니다~~ 👍 👍

 

천천히 답변 드려 보도록 하겠습니다!

 

사실 말씀해주신 것처럼, UserRepository, 즉 Spring Data JPA를 활용해 업데이트 혹은 삭제 쿼리를 날릴 수 있습니다.

 

하지만, 저희는 userRepository.updateName(이름) 과 같이 Repository를 사용하지 않고, User 객체의 값을 바꿔 저장하도록 했죠. 저장을 할 때, save 를 직접 호출할 수도 있고, 영속성 컨텍스트의 변경 감지 (dirty check)를 사용할 수도 있었고요.

 

그 이유는 JPA라는 ORM 기술을 조금 더 제대로 활용하기 위해서입니다.

<23강. 문자열 SQL을 직접 사용하는 것이 너무 어렵다!!> 에서 말씀드렸던 것처럼,

  • 객체지향 언어 Java와

  • 테이블 형식의 데이터를 관리하는 언어 SQL은


미묘하게 서로 맞지 않는 부분이 존재하고, 이를 해결하기 위해 ORM 이라는 기술이 등장했죠.

 

대규모의 애플리케이션에서 "객체지향적인 설계"가 유지보수성을 높이는 것은 충분히 증명되었기에, "객체"를 중심으로 많은 설계가 이루어 졌고, 이러한 객체를 DB에 테이블 형태로 잘~~ 저장하기 위해 ORM 이라는 기술이 등장한 흐름입니다.

 

ORM 이라는 기술은 "객체를 제어하기만 하면~ DB Table에 데이터가 잘~~ 반영되는 마법" 입니다.

때문에 이런 기술을 더 잘~ 활용하려면, 직접 update SQL을 날리는 것 보다는 객체를 바꾸고 이것이 DB Table에 잘~ 반영되도록 하는 것이 좋겠죠.

그렇게 되면, Backend Engineering 에서는 객체 설계에 더 집중하며 유지보수성이 높고, 확장성 높은 구조를 갖추는데 많은 시간을 쏟을 수 있게 될 것입니다.

 

실제로 조금 어려운 내용이지만, 트랜잭션 내부에서 update 쿼리가 직접 나가게 되면, 이전에 불러왔던 객체는 이상한 값을 들고 있다거나~ 영속성 컨텍스트에 모종의 혼선이 생길 수도 있다거나~ 하는 이슈가 생길 수도 있습니다.

// 이렇게 유저를 가져왔다고 해보죠!
User user = userRepository.findById(1); 

// 그리고 바로 DB에 직접 업데이트를 합니다.
userRepository.updateName(user.getId(), "새로운 이름");

// 그리고 제일 처음 가져왔던 user의 이름을 가져오면 어떻게 될까요?!
user.getName();
// 이 객체는 update 이전에 가져왔기 때문에 옛날 이름을 갖고 있을 거에요!

 

다만, 이 방법이 항상 옳고, Spring Data JPA를 이용해 업데이트를 절대 하지 않는 것은 아닙니다!

image

추가 영상인, <MyBatis 적용과 DB 접근 기술 비교>에서도 말씀드렸던 것처럼 만능인 도구는 없다보니,

다수의 데이터를 한 번에 업데이트 해야 하는 경우는

 

객체를 하나씩~ 하나씩~ 불러와서
객체의 값을 하나씩~ 하나씩~ 바꾸고
변경 감지로 하나씩~ 하나씩~ 업데이트 쿼리를 날리는 것보다

 

객체를 굳이 가져오지 않고 UPDATE 테이블 SET field=value WHERE 조건
으로 수만, 수십만개의 데이터를 한 번에 바꾸는 것이 훨씬 효과적일 수 있을 겁니다.

 

 

깔끔하게~ 두 줄 요약 드려보면 다음과 같습니다.

  1. 우리가 객체를 업데이트 한 이유는 ORM을 잘 활용하기 위해서이다.

  2. 다만, 항상 이렇게 해야 하는 것은 아니고 각각의 방식의 장점을 적절히 취할 수 있어야 한다.

 

제 답변이 도움이 되었으면 좋겠습니다.

감사합니다!! 🙏🙏

jd님의 프로필 이미지
jd
질문자

2023. 08. 18. 15:55

잘 이해되었습니다. 친절한 답변 감사드립니다!!

jd님의 프로필 이미지

작성한 질문수

질문하기