본문 바로가기

Spring

[Spring]기능 - 작성자 출력하기

질문 혹은 답변을 작성할 때 어떤 사람이 작성했는지 알 수 있는 기능이 있으면 좋지 않을까?

 

그래서 작성자를 등록하고, 출력할 수 있도록 해보자.

 

 

1. 엔티티 변경

Question과 Answer을 작성한 작성자를 저장하기 위해 엔티티를 수정해야 한다.

@ManyToOne
private SiteUser author;

각각 Question.java와 Answer.java 파일에 SiteUser을 저장할 수 있도록 엔티티를 수정한다.

 

2. AnswerController 수정

현재 로그인 되어있는 유저를 확인하기 위해 Principal 객체를 사용한다.

매개변수로 Pricipal 객체를 줄 수 있도록 한다.

public String createAnswer(Model model, @PathVariable("id") Integer id,
         @Valid AnswerForm answerForm, BindingResult bindingResult, Principal principal)

Principal 객체란?

현재 로그인된 사용자를 확인하기 위해 Spring Security가 제공하는 객체.

Principal 객체를 사용하는 방법은

SiteUser siteUser = this.userService.getUser(principal.getName());

getName을 사용하여 로그인된 사용자의 id를 가져올 수 있다.

 

 

3. UserService 수정

현재 로그인된 SiteUser객체를 사용자 명을 통해 가져오기 위해 UserService를 수정한다.

public SiteUser getUser(String username) {
    Optional<SiteUser> siteUser = this.userRepository.findByusername(username);
    if (siteUser.isPresent()) {
        return siteUser.get();
    } else {
        throw new DataNotFoundException("siteuser not found");
    }
}

 

 

4. AnswerService 수정

작성자 정보를 확인하기 위해 AnswerService의 create 메서드에 작성자를 수정한다.

public Answer create(Question question, String content, SiteUser author) {
    Answer answer = new Answer();
    answer.setContent(content);
    answer.setCreateDate(LocalDateTime.now());
    answer.setQuestion(question);
    answer.setAuthor(author);
    this.answerRepository.save(answer);
    return answer;
}

왜 SiteUser 객체를 통째로 들고오나?

이는 SiteUser 객체를 들고온다는 뜻이 아닌 SiteUser_id를 사용한다는 뜻이다.

이를 보면 author_id를 사용한다는 것을 알 수 있다.

 

 

5. AnswerService.create()를 사용하기 위한 수정

create 메서드를 사용하기 위해 SiteUser 객체를 넣어주어야 한다.

그러기 위해서는 Principal 객체를 사용해 사용자를 불러오고, 사용자를 create 메서드의 파라미터로 넣어주어야 한다.

public String createAnswer(Model model, @PathVariable("id") Integer id,
           @Valid AnswerForm answerForm, BindingResult bindingResult, Principal principal) {
    Question question = this.questionService.getQuestion(id);
    SiteUser siteUser = this.userService.getUser(principal.getName());
    if (bindingResult.hasErrors()) {
        model.addAttribute("question", question);
        return "question_detail";
    }
    this.answerService.create(question, answerForm.getContent(), siteUser);
    return String.format("redirect:/question/detail/%s", id);
}

이와 같이 답변이 아닌 질문도 가능하다.

 

그런데, 로그아웃된 상태에서 작성하면 오류가 발생한다.

이는 Principal객체가 필요하기 때문인데, 어노테이션 하나를 넣어 로그인이 되어있지 않다면 로그인을 자동으로 할 수 있도록 하자.

@PreAuthorize("isAuthenticated()")

이는 로그인이 필요한 메서드임을 의미하는데, create하는 모든 메서드에 붙여주자.

 

 

마지막으로 @PreAuthorize("isAuthenticated()") 어노테이션을 사용하기 위해 SecurityConfig 클래스에 꼭 @EnableGlobalMethodSecurity(prePostEnabled = true) 어노테이션을 붙여주어야 한다.

 


그러면 작성자까지 등록 하였으니 출력을 시킬 수 있도록 해보자.

question_detail.html / question_list.html 파일을 작성자까지 포함하여 출력하도록 수정해보자.

  • 리스트

  • 상세

작성자까지 잘 나온다.

'Spring' 카테고리의 다른 글

[Spring]기능 - 추천 기능  (0) 2022.08.23
[Spring]기능 - 질문 수정 및 삭제  (0) 2022.08.22
[Spring]기능 - 회원가입  (0) 2022.08.18
CSRF(Cross Site Request Forgery)  (0) 2022.08.18
[Spring]Spring Security  (0) 2022.08.18