
유저의 비밀번호를 바꾸려면 Principal에서 유저객체를 얻어온 뒤 새로운 비밀번호를 지정하고 userRepository에서 저장해주면 업데이트 할 수 있다.
UserService에서 유저가 제대로 캐스팅되어 넘어온 지 확인하고 싶었다.
var user = (User) ((UsernamePasswordAuthenticationToken) connectedUser).getPrincipal();
System.out.println("user = " + user);
하지만 돌아온 건 LazyInitializationException 이었다:


User 모델에는 List<Token> tokens가 있다.
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "_user")
public class User implements UserDetails {
@Id // pk
@GeneratedValue // auto-increment, strategy = ...
private Integer id;
// ...생략
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private List<Token> tokens;
// ...생략
아시겠지만 롬복에는 @Data 어노테이션을 붙혀주면 toString() 메소드가 추가된다.
List<Token> tokens도 toString()에 포함된다.
그런데 앞서 System.out.println("user = " + user); 했으니 tokens가 없는데 접근하려고하니 LazyInitializationException이 발생한 것이다.
var user = (User) ((UsernamePasswordAuthenticationToken) connectedUser).getPrincipal();
// System.out.println("user = " + user);
프린트문을 없애준다면 LazyInitializationException 에러가 없어진다.
var user = (User) ((UsernamePasswordAuthenticationToken) connectedUser).getPrincipal();
System.out.println("user.getId() = " + user.getId());
System.out.println("user.getPassword() = " + user.getPassword());
user 전체를 프린트 하지 않고 세밀하게 얻어내면 에러가 나지않는다
