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

Junyoung_Choi님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

Dirty Checking을 로그인 기능에 적용하고 싶은데 잘 되지가 않습니다..

작성

·

204

0

안녕하세요 JPA 기초 강의부터 QueryDSL 강의까지 모든 과정을 완강하고, 현재 개인 프로젝트로 복습하고 있는 학생입니다!

주제와 조금 엇나갈 수 있는데, 다름이 아니라 Spring Security를 활용해 로그인된 사용자의 개인정보 변경을 구현 중에 있는데, 다음과 같이 현재 로그인 중인 사용자의 정보를 @AuthenticationPrincipal를 통해 가져와 updateProfile 메소드로 정보를 수정하려 하고 있습니다.

그런데 Merge를 사용하지 않고 Dirty Checking을 사용해 Account 정보를 업데이트를 하자니 현재 Account가 영속 상태가 아니어서 상태를 업데이트해도 DB에 반영되지 않습니다. 그래서 일단 현재 Account도 update하고, AccountRepository를 통해 실제 Account도 불러와 다시 한번 update를 하는 방식으로 작성하긴 했는데 올바른 방법이 아닌 것 같습니다.

이런 상황에서 (1) 실제로 DB에서 가져온 Account를 업데이트한 뒤, 현재 로그인한 상태의 Account에 대입하는 방법은 없을까요? 아니면 (2) 현재 Account를 강제로 영속상태로 바꾼 뒤 업데이트하여 DB에 반영하는 방법이 더 나은 방식인가요?

답변 3

0

김영한님의 프로필 이미지
김영한
지식공유자

2020. 06. 06. 22:09

스프링 시큐리티를 공부하는 것도 좋지만, 처음이라면 저는 단순하게 스프링 인터셉터와 서블릿 세션 개념 두가지를 학습하시고, 이것만 가지고 로그인을 구현해보시길 권장합니다.

추천할만한 예제 프로젝트는 딱 떠오르지가 않네요^^;;

0

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

2020. 06. 06. 10:08

너무 모르는게 많네요.. 혹시 로그인과 관련된 추천할만한 예제 프로젝트가 없을까요?

0

김영한님의 프로필 이미지
김영한
지식공유자

2020. 06. 03. 22:42

안녕하세요. Junyoung_Choi님

이렇게 고민을 한다는 것은 사실 근본적으로 뭔가 잘못된 상태일 확율이 높습니다^^!

스프링 시큐리티에서 엔티티인 Account를 바로 사용했는데요. 이것은 좋지 않은 설계라 생각합니다.

AccountDto처럼 엔티티와 관계가 없는 것을 로그인 세션 정보로 사용하시는 것을 권장합니다. 그래야 이런 혼선이 사라집니다.

그리고 실제 Account 엔티티에 담겨있는 정보는 매우 많지만, 세션정보로 사용할 AccountDto는 훨씬 단순해야 합니다.

추가로 엔티티 자체를 캐시하거나, 세션에 담는 것은 영속성 컨텍스트라는 매커니즘을 활용해야 하는 JPA 엔티티와는 잘 맞지 않습니다.

정리하면 로그인 세션, 캐시 등으로 사용할 데이터는 엔티티를 사용하는 것이 좋지 않습니다.

도움이 되셨길 바래요^^