본문 바로가기
기타

[ASP.NET Core/APOD] 댓글 저장 방식에 대한 고찰

by 항붕쿤 2023. 4. 10.

내가 만든 댓글 저장 기능은 다음과 같은 로직으로 작동한다.

댓글 입력을 누르면 입력한 정보(닉네임, 비밀번호, 댓글내용)가 컨트롤러의 Details 메서드로 넘어간다
-> 댓글이 입력된 날짜와 그 댓글의 게시글Id를 컨트롤러에서 구하여 댓글 모델의 속성에 저장한다.
-> 데이터베이스에 댓글 모델을 추가하고 댓글을 저장한 게시글 모델의 List 자료형 Comments 속성에도 댓글을 저장한다.
-> 데이터베이스를 저장하고 댓글을 저장한 게시글로 리다이렉션한다.

하지만 댓글 삭제기능을 구현하며 한가지 의문점이 들었다.
'굳이 게시글 모델의 List 자료형 Comments 속성하고 댓글 모델 두군데에 데이터를 저장할 필요가 있을까?'

댓글 저장 기능을 구현할 때 뿐만 아니라 댓글 삭제 기능을 구현할 때 게시글 모델의 List 자료형 Comments 속성과 댓글 모델에 존재하는 데이터를 삭제해야하는 번거로움이 존재하고 데이터베이스의 용량을 두배로 먹으며 List 자료형은 C#에서 사용되는 데이터 구조기 때문에 visual stuio의 SQL Server 객체 탐색기에서 List 자료형을 가진 데이터 속성이 보이지않아 관리가 힘들다.

글로 쓰면서 정리해보고나니 굳이 List 자료형 모델 속성에 댓글 데이터를 저장할 필요가 없는것 같다. 앞으로 댓글 기능을 구현할 때는 그냥 댓글 모델에만 댓글 데이터를 저장해야겠다.

원래의 댓글 저장 방식

[HttpGet]
public async Task<IActionResult> Details(int? id)
{
    if (id == null || _context.APODModel == null)
    {
        return NotFound();
    }

    var apodModel = await _context.APODModel.Include(p => p.Comments).FirstOrDefaultAsync(m => m.Id == id);
    if (apodModel == null)
    {
        return NotFound();
    }

    var viewModel = new APODAndCommentViewModel
    {
        APOD = apodModel,
        Comment = new CommentModel(),
    };

    return View(viewModel);
}

[HttpPost]
public async Task<IActionResult> Details(int id, [Bind("APOD, Comment")] APODAndCommentViewModel commentModel)
{
        commentModel.Comment.Date = DateTime.Now;
        commentModel.Comment.PostId = id;

        _context.CommentModel.Add(commentModel.Comment);

        var apodModel = await _context.APODModel.Include(p => p.Comments).FirstOrDefaultAsync(m => m.Id == id);
        apodModel.Comments.Add(commentModel.Comment);

        await _context.SaveChangesAsync();

        return RedirectToAction(nameof(Details), new { id = commentModel.Comment.PostId });
}

수정 후

[HttpGet]
public async Task<IActionResult> Details(int? id)
{
    if (id == null || _context.APODModel == null)
    {
        return NotFound();
    }

    var apodModel = await _context.APODModel.FirstOrDefaultAsync(m => m.Id == id);
    if (apodModel == null)
    {
        return NotFound();
    }

    var commentModel = _context.CommentModel.Where(c => c.PostId == id).ToList();
    var viewModel = new APODAndCommentViewModel
    {
        APOD = apodModel,
        New_Comment = new CommentModel(),
        Comment = commentModel,
    };

    return View(viewModel);
}

[HttpPost]
public async Task<IActionResult> Details(int id, [Bind("APOD,New_Comment,Comment")] APODAndCommentViewModel commentModel)
{
        commentModel.New_Comment.Date = DateTime.Now;
        commentModel.New_Comment.PostId = id;

        _context.CommentModel.Add(commentModel.New_Comment);

        await _context.SaveChangesAsync();

        return RedirectToAction(nameof(Details), new { id = commentModel.New_Comment.PostId });
}