더북(TheBook)

7. 마찬가지로 NoteComment 모델 클래스를 바탕으로 NoteComments 테이블에 데이터 입출력을 구현하는 리파지터리 클래스를 NoteCommentRepository라는 이름으로 구현한다. 이번에는 학습을 위해 저장 프로시저가 아닌 인라인 SQL 구문으로 표현해보았다.

▼  ~/DotNetNote/Models/NoteCommentRepository.cs

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

namespace DotNetNote.Models
{
  public class NoteCommentRepository
  {
      private SqlConnection con;
      
      public NoteCommentRepository()
      {
          con = new SqlConnection(ConfigurationManager.ConnectionStrings[
              “ConnectionString”].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();
      }
  }
}

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