inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링과 JPA 기반 웹 애플리케이션 개발

@AuthenticationPrincipal를 통해 인증 객체로 가져온 Account 업데이트 시 merge 가 아닌 set 업데이트 문제점

635

손경민

작성한 질문수 2

0

안녕하세요. 강의 진행 중에 궁금한 점이 생겨 문의드립니다.

강의에서는 Account 객체 업데이트가 필요할 시 AccountRepository의 save()를 통하여

merge 방식으로 업데이트를 진행하는데 저는 merge 방식으로 하지 않고 Account를 findById() 로 조회하여 영속성 상태로 만든 후에 set 프로퍼티로 업데이트를 진행하였습니다.

    @Transactional
    public void updateProfile(Account account, Profile profile) {

        account = accountRepository.findById(account.getId())
                        .orElseThrow(IllegalArgumentException::new);

        modelmapper.map(profile, account);
        //accountRepository.save(account);
    }

가령 프로필 업데이트 시 이렇게 하면 account 가 정상적으로 데이터베이스에 반영되나@AuthenticationPrincipal에 담긴 인증 객체는 초기 상태인 account 로써 동기화가 되지 않습니다.

따라서, 업데이트 후 프로필 폼으로 이동 시에 업데이트가 안된 화면이 조회되어 일일이 폼 조회 시에도 account를 재조회하여 화면 폼에 뿌려주는 방식으로 변경하였으나 혹여 set 프로퍼티로 업데이트 할 때 @AuthenticationPrincipal에 담긴 인증객체도 같이 동기화 되도록 할 수 있는 방법이 있을까 싶어 문의드립니다.

구글링으로 알아보려하였으나 원하는 정보를 찾지 못해 질문드립니다. 감사합니다.

spring-boot thymeleaf spring JPA java

답변 1

0

손경민

[자문자답]

https://www.inflearn.com/questions/311345

해당 강의 질문 내역 확인 중 비슷한 질문을 발견하여 참고하여 소스를 변경하였습니다.

private void syncAuthenticationUser(Account account) {
    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
            new UserAccount(account),
            account.getPassword(),
            List.of(new SimpleGrantedAuthority("ROLE_USER")));

    SecurityContextHolder.getContext().setAuthentication(token);
}

 

@Transactional
public void updateProfile(Account account, Profile profile) {

    Account findAccount = accountRepository.findById(account.getId())
                    .orElseThrow(IllegalArgumentException::new);

    modelmapper.map(profile, findAccount);

    syncAuthenticationUser(findAccount);
}

 

다음과 같이, AccountService의 login() 메서드의 로그인 처리를 위한 Account 객체를 Token에 전달하여 SecurityContextHolder.getContext().setAuthentication(token); 로 등록하는 부분을 따로 메서드로 추출하여 Account 정보를 데이터베이스에 업데이트하는 로직은 업데이트 후 인증 객체를 재등록하는 방식으로 변경하였습니다.

해당 방식으로 변경하니 spring security 인증 객체인 Account가 갱신? 되어 조회 폼에서 별도로 Account 객체를 데이터베이스에서 재조회하는 방식으로 진행하지 않아도 모두 정상적으로 데이터가 표출되었습니다.

다만, 업데이트가 이루어질 때마다 인증 객체를 재등록하는 방식이 옳은 방식인지는 잘 모르겠습니다.

더 좋은 방법이 있다면 알려주시면 감사하겠습니다.

Study 개설하는 로직에 대해서 궁금점이 있습니다.

0

72

1

앱 재시작 후 회원가입

0

121

1

app.host 관련 질문이 있습니다

0

106

1

강의 버전 정보

0

136

1

event, study 참조

0

238

2

비밀번호 변경 로직 질문있습니다.

0

145

1

프로필 수정 처리 merge 질문입니다.

0

117

1

회원가입 성공 후 redirect이동시 권한 질문

0

516

3

HtmlEmailService 개발하다 생긴 의문입니다

0

260

2

postgreSql 연결하여 JPA 를 통해 테이블 생성시 ZONE 테이블 생성에서 에러가 납니다

0

440

2

수업질문 [긴급] 로그인안되는 문제 말씀해주시는 부분 반영해서 최종 질문드립니다

0

272

2

[긴급-재업로드]수업질문 로그인 안 되는 문제

0

246

1

[긴급] 로그인해도 네비게이션 바가 안 바뀌고 있습니다!! 로그인이 안 됩니다 도와주세요

0

285

1

cropper 오류 문제로 질문드립니다..

0

295

2

authentication관련 질문...

0

504

2

모임참가 취소 할때 로직 질문

0

363

3

안녕하세요 기선님 질문이있습니다..

0

237

1

HTML코드 및 강의 중간자료들

0

689

3

springSecurity

0

532

2

버전 질문입니다.

0

311

1

부트스트랩, css

0

362

2

영속성 컨텍스트 질문

0

257

2

다시 강의를 보니 드는생각..

0

359

2

5:50에 나오는 HTML코드는 어디서 찾을 수 있나여?

0

320

1