TIL(22-12-28(수))

allnight5·2022년 12월 28일
0

TIL

목록 보기
26/55
UserDetails userDetails = userDetailsService.loadUserByUsername(username);

userDetailsServiceImpl에서 loadUserByUsername메소드를 호출하여
DB에서 username과 같은 사용자를 찾은후 UserDetailsImpl(UserDetails를 인터페이스를 상속한)형태로 반환하여 다형성을 만족시키는 형태로 UserDetails 로 받는다.
UserDetailsImpl 인터페이스 안에는 유저라는 객체와 유저이름 이렇게 2개의 변수가있다.

return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); 

스프링 UsernamePasswordAuthenticationToken

에대해서 검색하면 자세한 설명을 알수있고 간단한 설명으로는
인터페이스 Principal에서 상속받은 인터페이스 Athentication
추상클래스로서 Athentication 를 넣은 AbstratAuthenticationToken
그리고 이 내용을 구현한 구현클래스가UsernamePasswordAuthenticationToken입니다.

Principal -> Athentication -> AbstratAuthenticationToken -> UsernamePasswordAuthenticationToken
다형성으로 한 메소드 안에서 구현하면서 userId를 넣어줄경우
Authentication newAuth = new UsernamePasswordAuthenticationToken(
userId, null, userDetails.getAuthorities());
이러한 형식으로 넣어서 구현해주면 됩니다.
Principal의 경우 타입정보(getClass)와 이름(getName)만 가지고 있습니다.

Authentication

UsernamePasswordAuthenticationToken 구현체 및 세션 정보를
보관하는 객체에서 필요한 정보를 뽑아내는 메소드를 가지고 있습니다
게다가 아래와 같은 방법들이있고 저희는 그중 3번째인 세 번째 생성자인 권한 리스트 객체 반환 을 반환을 사용하여
UsernamePasswordAuthenticationToken의 마지막에 넣어주는것과 userDetails에 유저에 대한 객체도 넣어줍니다.
Object getPrincipal() : 첫 번째 생성자로 주입한 객체 반환
Object getCredentials() : 두 번째 생성자로 주입한 객체 반환
Collection<? extends GrantedAuthority> getAuthorities() : 세 번째 생성자인 권한 리스트 객체 반환
Object getDetails() : 세션정보를 가진 WebAuthenticationDetails 객체 반환
이것으로 sercurity패키지 안에있는 두 클래스의 자세하면서도 간단한 설명은 맞추었고
이게 config로 넘어가도록 하겠다.

어제 열심히 공부한 트랜잭션, 프록시, 영속성 컨텍스트를 조금 이해한것 같아서 JPA로 부모쪽에 자식 데이터를 넣어주려는 행위를 해보려하였다.

서버 클래스이다.

@Transactional
public PostResponseDto createPost(PostRequestDto requestDto, User user) { 
//        User users = userRepository.findByUsername(user.getUsername()).orElseThrow(
                () -> new IllegalArgumentException("유저가 존재하지 않습니다.")      
        );//addUser에 다시 검색해서 넣으면.. 들어간다.
        Post post = new Post(requestDto, user.getUsername(),user);
	post.addUser();
        //Post post = new Post(requestDto, user.getUsername()); //처음에 한거 오류코드
	//post.addUser(user); // 처음에 한 오류코드

서버클래스에서 월요일 처음에한 오류코드 주석과 같이 진행을 하였다.

failed to lazily initialize a collection of role: com.blogpost.entity.User.posts: could not initialize proxy - no Session

이러한 오류가 떳었다. 그래서 화요일날 다시 공부하면서. 이게 post쪽에 로그인 하면서 가져온 유저정보를 넣어주면 트랜잭션에서 영속성 컨텍스트가 post로 넘어가 user 컨텍스트가 삭제되어서 안되는 구나로 이해를 하고 이제 post에 넣은것을 바로 user에 넣어주는 형식으로 했는데도 오류가 났다. 그런데.. 생각해보니.. 트랜잭션 메소드 안이라서 매개변수 상태로 받아서 다른 변수에 넣어도 유지가 될것이다.. 유저저장소에서 유저의 이름을 찾아서 그 정보를 넣어주면 연결이 되는데 왜 그렇게 해서 찾아온 매개변수값으로는 할수 없는지 알수없다..

post entity클래스에서 addUser

    public void addUser(User user){ 
		this.users = user;
        users.getPosts().add(this);
    }
    public void addUser(){ 
        this.users.getPosts().add(this);
    }

user entity클래스에 연관관계

    @OneToMany(mappedBy = "users" , cascade = CascadeType.REMOVE, orphanRemoval = true)
    private final List<Post> posts = new ArrayList<>();
profile
공부기록하기

0개의 댓글