[iOS][공부일지] - 사이드 프로젝트에 대한 작업기록 및 복기

Uno·2021년 7월 26일
0

공부일지

목록 보기
1/5

21.07.26

Today's Programming

<목차>
1. 아무리 급하더라도 Input 지점과 Output 지점을 확실히 하자.
2. String 으로 Response 를 받는 경우, 데이터 처리가 힘드니 가능하면 실수 형식의 데이터로 받자.
3. 절대 값이 필요한 경우 용이한 Swift 메소드

1. 아무리 급하더라도 Input 지점과 Output 지점을 확실히 하자.


컨트롤러와 컨트롤러 간 데이터를 전달하고, 그 데이터를 바탕으로 UI를 그리는 경우나 API 메소드를 호출하여 서버와 통신하는 경우 특히 중요하다고 느꼈습니다.

제가 겪었던 경험들 중 하나를 예시로 들자면,

"비밀번호 찾기" 로직 입니다.

첫 번째 컨트롤러에서 다음 데이터를 입력받습니다.

  • 아이디
  • 사용자의 휴대전화번호
  • 휴대전화로 전송된 인증번호

이후 API를 호출하여, 아이디와 휴대전화가 일치한지, 그리고 인증번호의 유효성검사를 진행한 후, 서버에서 이에 대한 응답을 알려줍니다.

만약 Reponse가 true라면, 두 번째 컨트롤러를 호출하고 아니라면 호출하지 않고 Alert을 나타냅니다.

두 번째 컨트롤러가 실행되었다면,

이전 컨트롤러에서 작성 했던 아이디 데이터를 가져와서 새로운 비밀번호를 입력받고, 비밀번호 수정 API를 호출합니다.

이렇게 이전 컨트롤러에서 아이디를 받았을 때만 다음 API를 호출할 수 있는 구조로 되어있었습니다.

지금 예시는 단순한 예시이기 때문에 아이디가 정상적으로 컨트롤러에 전달되었는지만 확인하면 됩니다.

하지만 복잡한 경우에는

  • 전역변수에 있는 JWT 값
  • UserDefault에 있는 최초 로그인 여부판단 Boolean 값
  • 전달해야하는 데이터 자체가 많은 경우

이런 경우도 있었습니다.

Solution)

이러한 문제를 해결하기 위해서는 데이터 흐름이 눈에 보이도록 하면 좋겠다는 생각을 했습니다.

그래서 제가 생각한 해결책이 대단한 건 아니구요.

"손으로 데이터 흐름을 작성하기" 입니다.

이 방법을 사용하다보면 이런 생각이 듭니다.

이거 시간이 너무 오래걸리는거아냐?

저도 이런 생각으로 귀찮다생각하고 안썼습니다.
하지만 나중에 데이터가 꼬이면서 디버깅을 몇 시간씩 하다보면,

손으로 꼭 쓰게 될겁니다^_^

2. String → Int 로 변환할 때, String의 값을 모두 확인해봐야한다. 아니면 Optional Error 혹은 Default 값으로 변환되므로 원하는 UI가 출력되지 않을 수 있다.


API Response로 오는 데이터가 예를들어, "오늘부터 1일이야!" 이런 데이터가 넘어온다고 가정해봅시다. 이렇게 데이터가 넘어오게 되면, 클라이언트 입장에서 그냥 바로 데이터를 그려주면 된다고 생각하기 쉽습니다.

하지만 1주일 후에 이런 요구가 추가되면 어떻게 될까요?

못된 고객사 : 특별한 날에는 텍스트가 좀 변경되어야 좋을 것 같은데요? 해주세요!(막무스가내스)

제 개발하는 시간이 부족헤서 서버개발자분께 "결과값을 한번에 보내주면 제가 편할 것 같다" 라고 말씀을 드렸습니다. 실제로 그 덕분에 시간을 절약하고 다른 부분을 할 수 있었죠.

하지만 추가 요구사항이나 생각하지 못했다가 나중에 발견한 UI 적용해야할 사항을 발견한다면, 조금 난감해집니다.

struct ResponseData: Decodable {
 var message: String = "오늘부터 1일이야!"
}

이렇게 온다면, 제가 [오,늘,부,터,일,이,야,!] 부분을 모두 제거해야겠죠.

물론 이부분은 Swift에서 기본적으로 제공하는 좋은 메소드들이 많이 있어서 어려운 부분은 아닐겁니다.
ex) .index(_:,offSetBy:), slice(), .. 등등

다만, 애초에 1만 넘어온다면, 굳이 문자열을 추가로 다룰 필요가 없겠죠.

데이터를 요리하는건 클라이언트의 몫이다. 절대 서버에게 부탁하지말자.
-Uno-

3. 절대 값이 필요한 경우 용이한 Swift 메소드


데이터를 처리하다보니, 절대값이 필요한 경우가 있더라구요. 간단하게 사용할 수 있으니 활용해보세요!

let dDay: Int = -10
print(">>DEBUG: \(dDay.magnitude)")

let year: Int = 2021
print(">>DEBUG: \(year.magnitude)"

추후 이 메소드는 직접 구현할 수 있으면, 글을 추가해보겠습니다!

profile
iOS & Flutter

0개의 댓글