updatName 메소드 질문입니다.
안녕하세요 강사님, 강의 잘 듣고있습니다.
강의에서 updateName 메소드를 domain에 작성하였는데 그 이유가 궁금합니다. 다른 기능은 userrepository의 메소드를 활용하는 것 같은데 수정 기능은 다른 이유가 궁금합니다.
감사합니다.
답변 1
2
안녕하세요~ b_lion님! 크으~~ 기가 막힌 질문이십니다~~ 👍 👍
천천히 답변 드려 보도록 하겠습니다!
사실 말씀해주신 것처럼, UserRepository, 즉 Spring Data JPA를 활용해 업데이트 혹은 삭제 쿼리를 날릴 수 있습니다.
관련 문서 - https://www.baeldung.com/spring-data-jpa-modifying-annotation
주요 검색어 :
Spring Data JPA 업데이트orSpring Data JPA @Modifying
하지만, 저희는 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를 이용해 업데이트를 절대 하지 않는 것은 아닙니다!

추가 영상인, <MyBatis 적용과 DB 접근 기술 비교>에서도 말씀드렸던 것처럼 만능인 도구는 없다보니,
다수의 데이터를 한 번에 업데이트 해야 하는 경우는
객체를 하나씩~ 하나씩~ 불러와서
객체의 값을 하나씩~ 하나씩~ 바꾸고
변경 감지로 하나씩~ 하나씩~ 업데이트 쿼리를 날리는 것보다
객체를 굳이 가져오지 않고 UPDATE 테이블 SET field=value WHERE 조건
으로 수만, 수십만개의 데이터를 한 번에 바꾸는 것이 훨씬 효과적일 수 있을 겁니다.
깔끔하게~ 두 줄 요약 드려보면 다음과 같습니다.
우리가 객체를 업데이트 한 이유는 ORM을 잘 활용하기 위해서이다.
다만, 항상 이렇게 해야 하는 것은 아니고 각각의 방식의 장점을 적절히 취할 수 있어야 한다.
제 답변이 도움이 되었으면 좋겠습니다.
감사합니다!! 🙏🙏
패키지 구분에 대해 궁금한게 있습니다
0
20
2
리액트 관련 질문이 있습니다.
0
64
2
스프링부트 버전
0
73
2
7강 강의를 들으려고 했는데 오류가 나서 서버가 안 켜지는거 같아요.
0
59
2
33강. UserLoanHistory의 관계성에 대한 질문
1
56
2
Java JDK 버전 문의의 건
0
132
2
ec2 에서 Linux버전이 달라져서 설치가 안되는것 같은데 자료 최신화좀 해주세요.
0
88
3
h2 console 접속했을 테이블 질문
1
65
1
ec2 서버에서 스프링 실행도 되고 인바운드 설정까지 했는데 index.html 안됨
0
75
2
15강. updateUser() 질문
0
55
2
깃허브 질
0
82
2
여기까지 다 끝냈다고 하셨는데
0
79
2
왜안될까요
0
70
2
MySQL 창이안ㄴ뜹니다
0
59
2
포스트맨
0
50
1
spring 개념적인 질문
0
71
2
인텔리제이 샘플코드 실행 안됨 오류
0
140
2
aws 배포할때 .env 파일에 저장한 환경변수에 관하여 여쭤볼게 있습니다
0
85
1
마이그레이션 오류입니다.
0
171
3
Whitelabel Error Page 오류가 났습니다.
0
163
2
안녕하십니까! 오류가 났습니다.. 도와주세요 ㅜㅜ
1
93
3
궁금한게 있습니다.
0
60
2
DTO 관련
0
70
2
궁금한게 있습니다!
0
68
2





