ArticleController는 ArticleApiController와 같이 게시글 관련 요청을 처리하는 컨트롤러입니다. 다른 점은 @RestController이 아닌 @Controller를 사용하였으며 @GetMapping 메서드들만 모아놓았습니다.

package tomato.classifier.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import tomato.classifier.dto.ArticleDto;
import tomato.classifier.dto.CommentDto;
import tomato.classifier.entity.Article;
import tomato.classifier.entity.Comment;
import tomato.classifier.entity.User;
import tomato.classifier.repository.ArticleRepository;
import tomato.classifier.repository.CommentRepository;
import tomato.classifier.repository.UserRepository;
import tomato.classifier.service.ArticleService;
import tomato.classifier.service.CommentService;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

@Controller
@Slf4j
@RequestMapping("/article")
@RequiredArgsConstructor
public class ArticleController {

    private final UserRepository userRepository;

    private final ArticleService articleService;

    @GetMapping()
    public String articleMain(Model model) {

        List<ArticleDto> allArticles = articleService.getAllArticles();
        Collections.reverse(allArticles);
        model.addAttribute("articles", allArticles);

        return "article/articleMain";
    }

    @GetMapping("/add")
    public String articleAdd(Model model) {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String username = ((UserDetails) principal).getUsername();
        log.info(username);

        model.addAttribute("writer", username);
        return "article/articleAdd";
    }

    @GetMapping("/{articleId}")
    public String articleDetail(@PathVariable Integer articleId, Model model, HttpSession session) {

        ArticleDto articledto = articleService.getArticle(articleId);
        List<CommentDto> comments = articleService.getComments(articleId);
        articleService.updateView(articleId);
        //예외처리 할 것
        if (session.getAttribute("SPRING_SECURITY_CONTEXT") != null) {
            Authentication loggedInUser = SecurityContextHolder.getContext().getAuthentication();
            String username = loggedInUser.getName();
            model.addAttribute("commentWriter", username);
        }
//        //예외처리 할 것
//        if (session.getAttribute("SPRING_SECURITY_CONTEXT") != null) {
//            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
//            if (principal instanceof UserDetails) {
//                String username = ((UserDetails) principal).getUsername();
//                model.addAttribute("commentWriter", username);
//            }
//        }
        model.addAttribute("article", articledto);
        model.addAttribute("comments", comments);

        return "article/articleDetail";
    }

    @GetMapping("/edit")
    public String edit(@RequestParam Integer articleId, Model model) {
        //예외처리 할 것
        ArticleDto article = articleService.getArticle(articleId);
        model.addAttribute("article", article);

        return "article/articleUpdate";
    }

}