저번에 프로젝트를 완성하지 못하여 스터디를 진행했다. SpringSecurity authenticated를 테스트할 때 자꾸 null exception이 발생했는데, Repository에서 findById 함수 리턴 타입을 Vo타입에서 Entity로 바꿨더니 정상적으로 작동했다. 이유에 대해서는 조금 더 공부가 필요해 보인다.
그리고 저번에 추가했더느MapStruct를 사용한 코드를 다른 조원이 pull받아 사용하려 했더니 자꾸 Mapper가 존재하지 않는다는 오류가 발생했다. 처음에는 Mapper를 사용하지 않고 수정 코드를 다시 작성하는 방법으로 진행하려고, MapStruct Lib는 프로젝트에서 제거했다. 하지만 계속해서 같은 오류가 발생하여 방법을 찾아보니, 이는 Maven Clean -> Install을 진행하여 해결했다. Spring 내에 Configuration 오류인듯 했다. 다시 수정코드를 Mapper로 작성하며 이유를 찾아보기로 했다.
이후 각자의 브랜치를 머지하려 했지만, 몇가지 약속한 형식에 안맞는 코드들이 있어 수정을 진행했다. 그리고 SpringSecurity 테스트 코드를 작성하고 실행했을 때 SecurityContext.getAuthenticate에서 Null이 발생하여 오류가 발생했다. 이 부분도 수정이 필요해 보였다.
SpringSecurity에서 기본적으로 제공하는 로그인 페이지에서 로그인을 진행하고, 그 세션 아이디 값을 복사하여 Postman에 설정해주고 Post를 진행하면 정상적으로 진행되는 것을 확인했다.
머지 전에 생각보다 진행해야 하는 분량이 많아 4월 6일에 다시 모여 끝내기로 했다.
조원 한분이 갑자기 6일에 회식이 잡히셔서 다음 날인 7일에 스터디를 진행했다.
전에 발생한 SecurityContext.getAuthenticate에서 발생한 NullException의 이유를 알아냈다. SpringSecurity에서 로그인을 진행하면 SpringSecurity에 Authenticate 관련 값들이 생성되는데, 테스트 코드에서는 로그인을 진행하지 않아서 NullException이 발생한 것이다.
Postman에서 로그인 후 생성된 세션 값을 복사해서 postman으로 post를 했을 때 정상적으로 진행된 이유도 이 때문이다.
SpringSecurity의 Context의 Authentication를 설정해주기 위해 다음과 같이 코드를 작성했다.
@BeforeEach
public void 유저_생성_및_인증(){
String username = "users";
String password = "password";
LoginReqUserDto dto = LoginReqUserDto.builder().username(username).password(password).build();
userService.create(dto);
UserEntity user = userRepository.findByUsername(username).get();
SecurityContext context = SecurityContextHolder.getContext();
context.setAuthentication(new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities()));
}
하나의 유저를 생성하고, 그 User정보를 바로 DB에서 가져온 후 SpringSecurty의 Context의 Authentication을 User의 정보로 설정해주는 코드다.
이 코드를 작성하고, 테스트 코드가 정상적으로 진행되는 것을 확인 했다.
이후 수정한 테스트 코드를 Push했고, 다른 브랜치들을 Master브랜치에 Merge하면서 스터디는 끝났다.