더북(TheBook)

11. Models 폴더의 DotNetNote 폴더에 NoteCommentRepository.cs 파일을 생성한다. 댓글에 대한 CRUD를 구현하는 NoteCommentRepository 클래스의 내용을 다음과 같이 작성한다. 여기서는 앞서 NoteRepository 클래스와 같은 방식을 사용해도 되는데, 학습 목적상 데이터베이스 연결 문자열을 생성자 매개 변수로 받아서 사용하는 방식을 적용해보았다. Startup.cs 파일에서 NoteCommentRepository를 호출할 때 Configuration 개체로 데이터베이스 연결 문자열을 전송하는 코드를 구현할 내용이 이곳에 적용된다. 이 코드는 바로 다음에 나열할 것이다. NoteCommentRepository 클래스의 주요 코드는 저장 프로시저를 사용하는 대신에 인라인 SQL문을 사용하는 식으로 두 가지 코드를 모두 사용해보는 형태로 구성해보았다.

▼  /Models/DotNetNote/NoteCommentRepository.cs

using Dapper;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;

namespace DotNetNote.Models
{
  public class NoteCommentRepository : INoteCommentRepository
  {
      private string _connectionString;
      private SqlConnection con;
      
      public NoteCommentRepository(string connectionString)
      {
          // DB 연결 문자열 가져오는 또 다른 방법: Startup.cs에서 전달됨
          _connectionString = connectionString;
          con = new SqlConnection(_connectionString);
      }
      
      /// <summary>
      /// 특정 게시물에 댓글 추가
      /// </summary>
      public void AddNoteComment(NoteComment model)
      {
          // 파라미터 추가
          var parameters = new DynamicParameters();
          parameters.Add(
              ”@BoardId”, value: model.BoardId, dbType: DbType.Int32);
          parameters.Add(
              ”@Name”, value: model.Name, dbType: DbType.String);
          parameters.Add(
              ”@Opinion”, value: model.Opinion, dbType: DbType.String);
          parameters.Add(
              ”@Password”, value: model.Password, dbType: DbType.String);
          
          string sql = @”
                Insert Into NoteComments (BoardId, Name, Opinion, Password)
                Values(@BoardId, @Name, @Opinion, @Password);
                Update Notes Set CommentCount = CommentCount + 1 
                Where Id = @BoardId
;
          
          con.Execute(sql, parameters, commandType: CommandType.Text);
      }
      
      /// <summary>
      /// 특정 게시물에 해당하는 댓글 리스트
      /// </summary>
      public List<NoteComment> GetNoteComments(int boardId)
      {
          return con.Query<NoteComment>(
              “Select * From NoteComments Where BoardId = @BoardId”
              , new { BoardId = boardId }
              , commandType: CommandType.Text).ToList();
      }
      
      /// <summary>
      /// 특정 게시물의 특정 Id에 해당하는 댓글 카운트
      /// </summary>
      public int GetCountBy(int boardId, int id, string password)
      {
          return con.Query<int>(@“Select Count(*) From NoteComments 
                Where BoardId = @BoardId And Id = @Id And Password = @Password”
              , new { BoardId = boardId, Id = id, Password = password }
              , commandType: CommandType.Text).SingleOrDefault();
      }
      
      /// <summary>
      /// 댓글 삭제 
      /// </summary>
      public int DeleteNoteComment(int boardId, int id, string password)
      {
          return con.Execute(@“Delete NoteComments 
                Where BoardId = @BoardId And Id = @Id And Password = @Password; 
                Update Notes Set CommentCount = CommentCount - 1 
                Where Id = @BoardId”
              , new { BoardId = boardId, Id = id, Password = password }
              , commandType: CommandType.Text);
      }
      
      /// <summary>
      /// 최근 댓글 리스트 전체
      /// </summary>
      public List<NoteComment> GetRecentComments()
      {
          string sql = @“SELECT TOP 3 Id, BoardId, Opinion, PostDate 
                FROM NoteComments Order By Id Desc”;
          return con.Query<NoteComment>(sql).ToList();
      }
  }
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.