Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

iOS 개발일지

0802 새싹 22회차 정리 본문

SeSAC iOS 데뷔과정 2기

0802 새싹 22회차 정리

Lia's iOS 2022. 8. 2. 19:52
iOS 앱 개발자 데뷔 과정 22회차

 

 

 

 

#0. Memo

- searchBar 구현하기

searchBar를 구현하기 위해서는 VC에서 UISearchBarDelegate 프로토콜을 채택해야 한다.

extension을 활용해 프로토콜을 채택 후 서치바 버튼 클릭 함수를 작성하고, 그 안에서 정보를 받아오는 메서드를 호출했다.

이 때 여러가지 고려할 수 있는 사항이 많지만 나중에 고치기로 했다.

viewDidLoad에 searchBar.delegate = self 코드도 잊지 말고 작성하자.

 

 

 

- TableView에서 데이터 표현하기

받아온 데이터를 테이블뷰에 나타내는 코드를 작성했다.

우선 빈 배열을 만든 다음 (Type은 미리 만들어놓은 Struct로 설정했다) 나타낼 데이터를 cell에 입력하고

반목문을 통해 전달받은 데이터를 빈 배열에 추가한 후, 작업이 모두 끝나면 테이블뷰를 갱신한다.

여기까지만 진행한다면, 제대로 갱신은 되지만 테이블뷰가 새로운 정보로 교체되는 것이 아닌 계속 쌓이는 형태가 될 것이다.

list.removeAll() 메서드를 사용해 검색 버튼을 눌렀을 때 이전 결과가 사라지도록 작성하면 된다.

 

 

 

- API Key 모아서 관리하기 (feat. gitignore)

API Key는 사용 제한도 있고, 유출되면 좋지 않기 때문에 따로 모아서 관리하는 작업이 필요하다.

이는 임시적인 방법임에 유의하자.

구조체와 타입 저장 프로퍼티를 활용해 관리

 

실제 사용

이렇게 한 파일에 Key를 모아놓은 다음, gitignore을 이용해서 해당 파일을 제외시키면 GitHub에 Push할 때 업로드 되지 않는다.

 

.gitignore를 적용시키는 방법을 알려주는 방법은 쉽게 알 수 있으니, 적용시키며 헤맸던 부분의 해결방법만 적겠다.

.gitignore 파일에 제대로 작성을 했는데 적용이 안 될 때 생각할 수 있는 원인 중 하나는 이미 Git이 추척중일 때이다.

해당 APIKey Struct가 있는 Constant 파일에는 다른 Struct도 작성되어 있고, 이 파일은 이미 GitHub에 올라가있는 상태였다.

그렇기 때문에 .gitignore가 제대로 적용되지 않았던 것이기 때문에 우선 추적을 풀어줘야 한다.

 

git add 전에 git rm -r --cached [파일명] 을 입력하면 원격에 저장된 파일은 삭제되며 추적이 풀리고, 로컬 저장소는 남아있게 된다.

git rm -r 을 사용할 경우 로컬 저장소에서도 파일이 삭제되니 주의해야 한다.

 

 

이제 git status --ignored 명령어를 통해 igonre 처리된 모든 파일들의 목록을 조회해보면, 제대로 반영된 것을 볼 수 있다.

 

 

 

- 네이버 Papago API 사용하기

전에 구현했던 로또 번호와 맥주 정보는 따로 요청할 값이 거의 없었고, 박스오피스 순위도 Key와 날짜만 입력했었다.

이번에 구현할 TranslateView는 네이버 Papago API를 이용하는데 전달하는 값이 조금 다르다.

규모가 큰 API는 이렇게 예제가 있는데, API 레퍼런스를 보면 어떤 값을 전달해야 하는지 알 수 있다.

 

위의 요청 예를 참고해서 코드에 적용시키면 아래와 같다.

AF.request의 파라미터는 url, method 2개가 기본이지만 쉼표를 찍고 자동완성을 확인하면 정말 많은 파라미터가 있다.

 

 

 

- 오류코드 대응하기

API를 사용하다 보면 언젠가는 오류 코드를 마주하게 된다.

이 오류 코드는 원인에 따라 숫자가 다르기 때문에 자세한 사항은 API 가이드 등에서 확인할 수 있다.

네이버 오류코드 공통가이드

그리고 이런 오류가 발생할 수 있는 상황들에 대응하는 코드를 작성할 수 있다.

번역이 실패했을 시 결과창에 errorMessage를 보여주는 코드

 

 

 

 

#1. Checklist

- App Transport Security Settings

[0728 새싹 19회차 정리] #1. Checklist 참고

 

 

- HTTP

[0801 새싹 21회차 정리] #1. Checklist 참고

 

 

 

- HTTP Request - HTTP Response

[0801 새싹 21회차 정리] #1. Checklist 참고

 

 

 

- HTTP Status Code

[0801 새싹 21회차 정리] #1. Checklist 참고

 

 

 

- HTTP Header

메타 정보

HTTP Header는 여러 유형(공통 헤더, 요청헤더, 응답 헤더, 엔티티 헤더)이 있다.

그 중 요청/응답 헤더는 요청/응답에 대한 일반(General) 정보를 포함한다. 예) 요청 시간, 요청에 사용 된 브라우저 등

서버에 요청할 때에는 요청 헤더, 서버가 클라이언트/브라우저로 응답을 다시 보낼 때에는 응답 헤더이다.

헤더의 프로퍼티는 이름-값(Name-Value) 쌍으로 설정되며, 콜론 ' : ' 으로 구분된다.

 

 

 

- HTTP Body

실질적인 데이터

요청에 대한 응답 값으로, 실제 데이터 컨텐츠/메세지 본문이 나타난다.

 

 

 

- HTTP Get

서버로부터 정보를 조회하는 메서드이다.

Get은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리스트링을 통해 전송한다.

( 퀴리스트링이란 URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터를 가리키며, 만약 요청 파라미터가 여러 개일 경우 &로 열결한다. )

그리고 Get은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있다.

정적 컨텐츠를 요청했을 때 요청을 캐시해두고, 동일한 요청이 발생하면 서버로 요청을 보내지 않고 캐시된 데이터를 사용한다.

 

 

 

- HTTP Post

리소스를 생성/변경하기 위한 메서드이기 때문에 Get과 달리 전송할 데이터를 HTTP 메세지의 Body에 담아 전송한다.

HTTP 메세지의 Body는 길이 제한 없이 데이터를 전송할 수 있기 때문에 Get과 달리 대용량 데이터 전송이 가능하다.

이처럼 Post는 데이터가 Body로 전송되고 내용이 눈에 보이지 않아 Get처럼 내용을 바로 볼 수는 없지만, Post 요청도 크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있기 때문에 유의미한 보안은 아니다.

 

 

 

 

#2. Assignment

- Lottery API 구현하기

(도전) 앱이 실행되어 처음 네트워크 통신을 할 때 매주 토요일 진행되는 로또 회차에 맞춰, 가장 최근 회차 가져오기

처음에는 과제의 '매주 토요일'에 집착한 결과, 저번주 토요일 날짜를 반환하는 함수를 만들었다.

하지만 이건... 이건 한시간동안 공들여 만든 지우개똥 같은 코드였다.

로또 API에서 회차별 리스트를 한꺼번에 주지 않는 이상, 저번주 토요일이고 저저번주 토요일이고 몇회차인지 알 길이 없다.

 

그래서 이번에는 첫 회차의 날짜를 구하고, 오늘과 날짜를 비교한 후 7로 나눠서 회차를 계산하는 함수를 만들었다.

가장 최근 회차를 계산하는 함수
viewDidLoad에서 함수 적용

2002년부터 단 한번도 빠지지 않고 진행했는지 최신 회차가 알맞게 나온다!

검색해보니 로또 추첨 방송은 매주 오후 8시 35분에 진행한다고 해서, 대충 9시정도면 결과가 나올 것 같아 시간까지 넣었다.

currentDrwNo에 1을 더한 이유는 첫 회차를 계산 결과에 포함하기 위해서이다.

이제 매주 토요일마다 자동으로 가장 최근 회차를 가져 올 것이다.

 

그리고 Picker에서 선택할 수 있는 회차도 고정이 아닌, 1회부터 가장 최근까지 불러오도록 바꿔줘야 한다.

그런데 위에서 만든 함수를 여기에서도 적용하려고 하면, 보다시피 에러가 발생한다.

메세지를 확인해보니 초기화보다 먼저 호출이 되었다는 의미로, 호출 시점이 꼬였다는 것이다.

lazy

그렇다면 꼬이지 않게 나중에 호출되도록 하면 될 것 같아 lazy 키워드를 붙이니 에러가 사라졌다.

 

 

 

- 영화진흥위원회 API 구현하기

수업에서 진행한 씬을 개선하여, 서버 Response에서 원하는 데이터를 추가해서 자유롭게 뷰 완성하기

결과물

 

 

(도전) 앱이 실행되어 처음 네트워크 통신을 할 때, 고정된 날짜값이 아니라 항상 어제 기준의 날짜로 정보를 가져오기

어제 날짜를 문자열로 반환하는 yesterday 메서드를 작성하고, viewDidLoad의 requestBoxOffice 파라미터로 전달했다.

 

 

 

 

- 번역 API 구현하기

수업에서 진행한 씬을 개선하여, 텍스트뷰1에 글자를 입력 후 번역하기 버튼을 누르면 텍스트뷰2에 결과가 출력되도록 완성하기

결과물

 

 

 

- Beer API 구현하기

맥주 리스트가 보이는 앱을 간단히 서버통신 하여 테이블뷰 또는 컬렉션뷰에 구현하기

 

"서버 통신 학습이 목적으로, UI는 자유롭게 구상해주세요" 라고 말씀하셔서 정말 자유롭게 구상했다.

아무리 그래도 저건 심한것 같아서 레이아웃을 고치고 싶지만, 오늘은 이미 늦어서 자야할 것 같다.

내일 시간 나면 하는걸로...ㅎㅎ

 

과제 하면서 별것도 아닌데 괜히 시간 썼던 부분은 for문의 json.arrayValue 부분이다.

arrayValue를 꼭 써야한다. 명심!