Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Refactor] 에러 핸들링 개선 #35

Open
wants to merge 7 commits into
base: dev
Choose a base branch
from
Open

Conversation

around-forest
Copy link
Collaborator

관련 이슈

완료 및 수정 내역

  • 에러 핸들링 구체화

리뷰 노트

과정

1차로 Business Model의 에러를 추가 및 구체화 하고,
2차로 Repository Layer의 에러를 추가 및 구체화 하고,
3차로 Presentation Layer의 에러를 추가 및 구체화 했습니다.

어떻게 해야 Error Log를 보고 개발자가 쉽게 상황을 파악할 수 있을까 고민한 결과,
1차에서 throw한 Error가 2차로, 2차에서 throw한 Error가 3차로 가 최종적으로 ViewModel에서 로그로 출력되게 했습니다.

각 부분에서 독립적으로 로그를 찍게할 수도 있지만, 그렇게 하면 로그를 보고 개발자가 다시 어떤 흐름에서 발생했는지, 예를 들어 HummingViewModel -> RoomActionRepository -> Network의 흐름에서 Network에서만 에러 로그가 찍힌다면 해당 에러 로그가 HummingViewModel에서 발생했는지 아니면 Network에 연결하는 다른 ViewModel에서 발생했는지 파악해야하는 과정이 필요하게 됩니다.

따라서 Presentation Layer 이전의 Error는 따로 로그로 찍지 않고, throw만 하게 한 뒤 Presentation Layer 까지 전달이 됐을 때 흐름을 타고 출력하게 했습니다.

image

물론 정의된 Error를 throw하기 때문에, 필요에 따라 각 Layer에서 throw된 Error를 로그에 따로 찍을 수 있습니다.

Presentation Layer에서는 각 ViewModel에서 사용하던 ASLogKit 의존성을 없애고 한 곳에서 통합 및 에러를 관리하고자 LogHandler와 ASErrors를 추가했습니다.

정의한 Errors는 선행 코드의 에러를 포함하고자 localizedDescription을 매개변수로 전달받게 했습니다.

DataDownloadRepository와 AudioHelper를 제외하고 다른 모든 Business Model과 Repository Layer의 Error는 ViewModel 단계에서 로그에 찍힙니다.

제외된 두 코드는 사용하는 하위 코드가 많아 ViewModel까지 분류하기에 무리가 있다 판단하여 각 코드 내에서 로그를 찍도록 했습니다.

@around-forest around-forest self-assigned this Jan 21, 2025
@around-forest around-forest linked an issue Jan 21, 2025 that may be closed by this pull request
1 task
Copy link
Collaborator

@hyunjuntyler hyunjuntyler left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다 👍

Comment on lines +6 to +47
do {
let tempURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString + ".m4a")
try data.write(to: tempURL)
let file = try AVAudioFile(forReading: tempURL)

guard
let format = AVAudioFormat(
commonFormat: .pcmFormatFloat32,
sampleRate: file.fileFormat.sampleRate,
channels: file.fileFormat.channelCount,
interleaved: false
),
let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: AVAudioFrameCount(file.length))
else {
return []
}

try file.read(into: buffer)
guard let floatChannelData = buffer.floatChannelData else {
return []
}

let frameLength = Int(buffer.frameLength)
let samples = Array(UnsafeBufferPointer(start: floatChannelData[0], count: frameLength))
var result = [CGFloat]()
let chunkedSamples = samples.chunked(into: samples.count / samplesCount)

for chunk in chunkedSamples {
let squaredSum = chunk.reduce(0) { $0 + $1 * $1 }
let averagePower = squaredSum / Float(chunk.count)
let decibels = 10 * log10(max(averagePower, Float.ulpOfOne))

let newAmplitude = 1.8 * pow(10.0, decibels / 20.0)
let clampedAmplitude = min(max(CGFloat(newAmplitude), 0), 1)
result.append(clampedAmplitude)
}

try? FileManager.default.removeItem(at: tempURL)

return result
} catch {
throw ASAudioErrors.analyzeError(reason: error.localizedDescription)
Copy link

@gen-com gen-com Jan 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 건우님, 잘 지내고 계신가요 ? 잠깐 구경 왔습니다.

음성 파일을 분석하는 코드를 꼼꼼히 잘 짜주셨는데, 너무 길이가 길지 않나요 ?

데이터를 파일로 쓰는 부분, 파일로 쓴 데이터를 읽어와 청크 단위로 분석하는 부분을 나누면 어떤가요 ?
가독성이 더 올라갈 수 있을 것 같습니다.

궁금한 점이 있다면 데이터를 파일로 변환한 다음에 분석해야하는 이유가 있나요 ?

@@ -0,0 +1,24 @@
import Foundation

enum ASAudioErrors: Error, LocalizedError {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LocalizedError가 이미 Error 프로토콜을 채택하고 있습니다.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

모든 케이스가 이유를 가진다면 구조체로 만드는 것은 어땟을지요 ?

@gen-com
Copy link

gen-com commented Jan 22, 2025

오류를 스택으로 쌓아 개발자가 추적하기 쉽도록 구조화 한 것이 인상적이네요. 잘 보고 갑니다:)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Refactor] 에러 핸들링 개선
6 participants