스프링 좋아요 기능 개발 오류

SoDEV·2025년 6월 30일

스프링 부트

목록 보기
13/17

문제

Current user principal is not of type

: Current user principal is not of type [org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken]:
  1. ArticleController
@GetMapping("/articles/{id}")
    public String getArticle(OAuth2AuthenticationToken oauthToken,@PathVariable Long id, Model model){
        Article article = articleService.findById(id);
     
        String nowUserEmail="";


        if(oauthToken!=null){
            System.out.println("oauth 가져옴: "+oauthToken.getPrincipal());
        }
  1. 처음에 접속할 때는 출력이 잘된다!
    oauth 가져옴: Name: [.........!!], Granted Authorities: [[OAUTH2_USER,
  2. 그러나 좋아요 기능을 실행한 뒤 다시 접속하면
    There was an unexpected error (type=Internal Server Error, status=500).
    Current user principal is not of type [org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken]: UsernamePasswordAuthenticationToken [Principal=org.springframework.security.core.userdetails.User [...]
    이렇게 나온다..

해결

  1. Authentication의 type에 따라 token을 가져오게 하였다.
 @GetMapping("/articles/{id}")
    public String getArticle(Authentication authentication,@PathVariable Long id, Model model){
       if(authentication instanceof  OAuth2AuthenticationToken){
            OAuth2AuthenticationToken auth2AuthenticationToken=(OAuth2AuthenticationToken) authentication;....
            }
       if(authentication instanceof UsernamePasswordAuthenticationToken) {
            UsernamePasswordAuthenticationToken userPassAuthToken=(UsernamePasswordAuthenticationToken)  authentication;

문제

There was an unexpected error (type=Internal Server Error, status=500).
Query did not return a unique result: 2 results were returned
org.springframework.dao.IncorrectResultSizeDataAccessException: Query did not return a unique result: 2 results were returned
	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:305)
  1. Like like=articleService.findLikeByArticle(id);
  • Query가 2개의 결과를 가져오는 문제가 생겼다.
  • 즉 ,현재의 article에 대해 두개의 like를 가져온다.

해결

  • article의 id 뿐만이 아니라 userName도 함께 가져와서 query문을 실행하게 하였다.
public class ArticleService {
	public Like findLikeByArticleAndUser(long id,String userName){

       Article article= articleRepository.findById(id).orElseThrow(()->
                new IllegalArgumentException("not found: "+id));

        return likeRepository.findByArticleAndUserName(article,userName);
    }
 }
public class Like {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id",updatable = false)
    private Long id;

    @Column(name="user_name",nullable = false)
    private String userName;

    @CreatedDate
    @Column(name="created_at")
    private LocalDateTime createdAt;

    @ManyToOne
    private Article article;
public interface LikeRepository extends JpaRepository<Like,Long> {
   Like findByArticleAndUserName(Article article,String userName);
}
profile
비가 와도 눈이 와도 파도를 향해서! 🌊🐢

0개의 댓글