코젤브

[MySQL] SQL 쿼리문(Insert/Select) 사용 시 실패 여부 확인 본문

컴공의 일상/C#

[MySQL] SQL 쿼리문(Insert/Select) 사용 시 실패 여부 확인

코딩하는 젤리 2024. 7. 26. 17:57

C# ASP.NET core 기준으로 작성된 글입니다! (.NET 8.0)

SqlKata 사용하여 C#에서 API Server 개발 중

 

API Server에서 Repository를 만들어 데이터베이스를 처리하는데,
이때 실패 여부를 판단할 때 주의해야한다!

-> 반환값 확인이 필요한 경우가 있으니까!

 

아무생각없이 코드를 짜다보면 쿼리 실패 시 예외처리만 진행하기도 한다... << 그 사람이 바로 접니다

 

 

하지만 데이터베이스 작업에서 INSERT, SELECT, UPDATE, DELETE 등의 SQL 쿼리를 실행할 때 실패 여부를 확인하는 방법에는 두 가지 주요 방식이 있다.

  1. 예외 처리(Exception Handling)
    쿼리가 실패 시 예외 발생
    데이터베이스 연결 문제나 쿼리 구문 오류 등의 상황에서 유용하게 처리 가능
  2. 반환 값(Return Value) 확인
    일부 쿼리, 특히 INSERT, UPDATE, DELETE와 같은 데이터 수정 쿼리는 성공 여부를 반환 값으로 확인 가능
    예를 들어, 영향을 받은 행(row) 수를 반환하는 경우가 많음!
    반환 값이 0이면 해당 조건을 만족하는 행이 없다는 것을 의미!

 

1. 예외처리

try
{
    var rowsAffected = await _queryFactory.Query("account")
                                          .InsertAsync(new { user_id = UserId, user_pw = hashedPassword, salt = salt });
    Console.WriteLine($"{rowsAffected} rows inserted.");
}
catch (MySqlException ex)
{
    Console.WriteLine($"Database error: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"An error occurred: {ex.Message}");
}

-> 누구나 기본적으로 잊지 않는다!

 

2. 반환 값 확인

var rowsAffected = await _queryFactory.Query("account")
                                      .InsertAsync(new { user_id = UserId, user_pw = hashedPassword, salt = salt });

if (rowsAffected > 0)
{
    Console.WriteLine("Insert successful.");
}
else
{
    Console.WriteLine("Insert failed or no rows affected.");
}

-> 잊지 말기!

 

 

따라서 위의 두가지를 함께 사용하면!

public async Task<ErrorCode> RegisterAccount(string UserId, string UserPw)
{
    using (var transaction = await _connection.BeginTransactionAsync()) // 트랜잭션 시작
    {
        try
        {
            var salt = Security.SaltString();
            var hashedPassword = Security.MakeHashingPassWord(salt,UserPw);

            var rowsAffected = await _queryFactory.Query("account")
                                        .InsertGetIdAsync<int>(new
                                        {
                                            user_id = UserId,
                                            user_pw = hashedPassword,
                                            salt = salt
                                        });

            if (rowsAffected == 0)
            {
                _logger.LogError("No rows were inserted for UserId: {UserId}", UserId);
                await transaction.RollbackAsync();
                return ErrorCode.InsertFailed;
            }

            _logger.LogInformation($"Account successfully registered for UserId: {UserId}.");


            var tokenResult = await InitializeLoginToken(hiveUserId);
            if (tokenResult != ErrorCode.None)
            {
                _logger.LogError("Failed to initialize token entry for UserId: {UserId}", hiveUserId);
                await transaction.RollbackAsync();
                return tokenResult;
            }
            await transaction.CommitAsync();
            return ErrorCode.None; // Success
        }
        catch (MySqlException ex)
        {
            _logger.LogError(ex, "Database error when registering account with UserId: {UserId}", hiveUserId);
            await transaction.RollbackAsync();
            return ErrorCode.DatabaseError;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to register account with UserId: {UserId}", hiveUserId);
            await transaction.RollbackAsync();
            return ErrorCode.InternalError;
        }
    }
}

-> 좋네요

 

요약

  • 예외 처리: 예외 발생 여부를 확인하여 데이터베이스 작업의 실패를 감지
    주로 심각한 오류(예: 데이터베이스 연결 오류, 쿼리 구문 오류 등)를 처리하는 데 유용

  • 반환 값 확인: 쿼리의 영향을 받은 행 수 등을 반환 값으로 확인하여 작업의 성공 여부를 검증
    주로 쿼리가 의도한 대로 실행되었는지 확인하는 데 유용

이 두 가지 방법을 함께 사용하여 데이터베이스 작업의 신뢰성을 높일 수 있다!