1. 제출해야 할 것결과물에 대한 소감

    1. 앱 개발 종합반 강의를 들으며 따라 만들어본 결과물은 어땠나요?
    2. 좋았던 점, 아쉬웠던 점을 기반으로 다음 주차에 여러분들을 서포트할 예정입니다!
  2. 발표 자료

    1. 간략하게 작성해도 됩니다.

    2. 중요한 것은

      기능 분담 이름

      박채현: MemberView

      • UICollectionView 이용
        • 컬렉션뷰에서 보여질 하나의 셀 UICollectionViewCell 다음과 같이 작성
        • UIView 내부에 UIImageView, UILabel을 이용하여 이미지와 이름, TMI 표현
      • 멤버에 대한 데이터 구조체 EvenMember 선언
        • 각각의 멤버를 구분할 키 값, 영문이름, 한글이름, TMI, Asset 내 이미지 파일이름, 해시태그 배열, 자기소개, 역할, 블로그 URL 주소, Git URL 주소를 상수로 가짐
        • 해당 상수값들은 모두 private, 객체 생성시 초기값 전달, get메소드 이용하여 값 접근

      박시연: MemberDetailView, TempView

      • MemberView의 Cell 을 탭하면 해당 Indexpath.row를 전달하여 해당 Member의 소개를 Present 해주는 화면입니다.
      • 임시 TempViewController를 만들어서 버튼을 입력하고 각각 화면이 이동되도록 하여 현재 이슈나 적용화면을 보면서 작업하기 편하게 적용하였습니다.

      황도일: LaunchScreen, IntroductionView

      • LaunchScreen:
        • 앱 구동 시 제일 처음 보이는 로딩 화면
        • AppDelegate를 수정해 런치스크린 지연시간 구현 (최소 2초)
        • AppIcons 이미지를 재활용한 Asset을 UIImageView로 구현
      • IntroductionView
        • 메인뷰에서의 첫번째 탭인 소개탭 속 화면
        • @IBOutlet을 이용하여 UILabel로 소개 문구와 팀 이름 구현 (Storyboard + ViewController)
        • UIImageView로 배경 이미지 구현 (ViewController)

      박민석: GoalView

      • 팀과 팀원들의 목표를 띄울 GoalView를 TableView를 통해 구현하여 스크롤을 하며 볼 수 있도록 코드를 작성하였다.
      • TableView 안에 Custom TableView Cell을 구현하여 팀과 팀원들의 아이콘을 띄울 ImageView, 그리고 이름과 목표를 띄울 Label을 하나의 셀에 배치하였다.

      나영진: PromiseView

      • 프로젝트 기간동안 지켜야 할 팀원들의 약속을 테이블 뷰를 활용하여 구현하였다.
      • 셀에 들어갈 이미지,라벨 등을 오토레이아웃을 활용하여 구현하였고 데이터는 클래스와 구조체 등을 활용하여 재사용이 가능하도록 코드를 작성하였다 .

      장상경: MainView

      • MainView에서 CollectionView와 PageView를 연동하여 탭바를 구현하였다.
      • 탭을 선택하면 CollectionViewCell의 Index값을 PageView에 전달하고, PageView를 스와이프하면 PageView의 Index값을 CollectionView에 전달하여 유기적으로 연동되도록 구성하였다.

      어려웠던 점 & 해결한 내용

      각 화면 구현 중 어려웠던 점, 고민했던 점 &

      🌼 각 화면 구현 중 스스로 해결했거나 특별했던 경험

      박채현: MemberView

      뷰에 대한 개념을 이해하지 못했는데 결국 안드로이드와 말하는 것만 다르지 결국 비슷한 매커니즘으로 작동했다. 처음에는 유튜브 하면서 따라가다가 반복되는 것을 보고 알아차린 후에는 코드가 읽히기 시작했다.

      박시연: MemberDetailView, TempView

      MemberDetailView

      1. compositionalLayout

      Simulator Screenshot - iPhone 16 Pro - 2024-10-24 at 18.48.13.png

      해당 뷰는 간단하게 CollectionView에 scrollVIew를 붙여서 작성할 생각이었으나 새로운 시각으로 compositionalLayout을 사용하였다. but, compositionalLayout은 같은 cell의 모양이 반복되는 UI에 최적화? 되어있다는 또다른 의견을 들었으나..이미 되돌아갈수 없는 강을 건넌 후였다..! 최대한 기존 UI 를 가져가고 CollectionViewCell 을 활용하였다.

      1. UI 는 접근성이 그나마 쉬워보이는 storyboard로 하려고했으나 맥북 용량의 한계로 코드로 진행하였습니다.

      2. class 앞에 final을 붙이는 이유!

      final class MemberDetailViewController: UIViewController {
          let imageView = UIImageView()
          var selectedMember: EvenMember?
          
      

      → 다른 클래스가 final 이 붙은 class 를 상속할 수 없도록 하기위함입니다.(상속으로 인해 기존 클래스 동작이 변경되지 않게 안정성을 위하여 사용합니다.) → 컴파일 시 성능 개선을 위함입니다.

      1. lazy 를 붙이는 이유!
      lazy var collectionView: UICollectionView = {
              let layout = createCompositionalLayout()
              let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
              collectionView.translatesAutoresizingMaskIntoConstraints = false
              return collectionView
          }()
      

      → Member cell에서 탭하면 생성되는 화며으로 미리 초기화할 필요가 없어서 사용하였습니다. 객체 생성 순서를 좀더 유연하게 관리하거나 순환 참조 문제를 피할 수 있다는 장점이 있습니다.

      TempView

      각 화면을 맡아서 진행하고 있고, PageViewController라는 부모뷰 안에 모든 뷰가 포함되어있기때문에 코드 작성 후 빌드 확인이 어려운 부분이 있었습니다. 그래서 임시 TempViewController를 만들어서 버튼을 입력하고 각각 화면이 이동되도록 하여 현재 이슈나 적용화면을 보면서 작업하기 편하게 적용하였습니다.

      황도일: LaunchScreen, IntroductionView

      LaunchScreen

      • AppIcons Asset은 이미지로 바로 사용 못해서 당황함 → 같은 이미지로 새 Image Set를 생성해서 해결함
      • UIImageView(AppLogo)에 가운데 정렬 및 크기 제한을 위한 Constraints 추가가 잘 안되었는데, 스토리보드의 XML 코드를 직접 수정해서 추가함 (나중에 스토리보드에서 제대로 추가하는 방법 알게됨)
      • LaunchScreen 지연시간 조정: 앱아이콘은 충분히 보여주되 사용자 경험에 불편을 주지 않는 시간이 뭘까? 하고 고민하였음

      IntroductionView

      • 작업 흐름 상 메인뷰와 분리하여 작업할 수 밖에 없었기에, 알맞은 문자/그림 배치를 가늠하는 것이 어려웠음 → 작업 우선순위를 조정해 해결함
      • 배경이미지를 위로 갈수록 투명하게 구현하고 싶었음 → 코드를 어떻게 짤지 고민하다가 리소스 낭비라고 생각 → 포토샵으로 직접 수정해서 해결함

      박민석: GoalView

      • 처음에 테이블 뷰 셀을 기본 제공되는 테이블 뷰 셀로 하여 작업하였는데, 기본 테이블 뷰 셀 안에는 다양한 기능을 추가할 수 없는 것을 몰라 계속 연결 되지 않았다는 오류를 접하였다.
      • 오토 레이아웃으로 셀 내 오브젝트들을 정렬하는 방법을 몰라 오토 레이아웃 코드를 찾아 이해하는데 어려움을 느꼈다.
      • IBOutle으로 연결해놓은 오브젝트와 코드로 작성한 오토 레이아웃이 충돌해 에러를 일으키는 걸 해결하느라 어려웠다.
      • 코드 작성도 아직 매우 미숙한데 깃의 사용법도 전혀 모르고 있던 상태에서 코드도 작성하고 깃도 사용하려니 어려움을 많이 느꼈다.

      • 기본 테이블 뷰 셀이 아니라 커스텀 셀 클래스를 새로 만들어 그 안에 셀에 들어갈 내용들을 넣고 수정하였다.
      • 오토 레이아웃의 코드가 비슷한 것이 반복되는 걸 보고 기능을 확인하며 정렬에 성공하였다.
      • 코드로 작성하는 법을 익히고자 IBOutlet으로 연결한 오브젝트들을 코드로 변경하여 오토레이아웃과의 충돌을 해결하였다.

      나영진: PromiseView

      기초 문법만 아는 상태였기에 프로젝트를 잘 따라갈 수 있을지 두려웠으나

      뭐라도 해보려고 하였고 튜터님의 말씀에 따라 재사용이 가능하도록 테이블 뷰를 구성해보려고 하였다.

      모든 것이 어려웠으나 하나씩 찾아가며 작성하다보니 끝까지 할 수 있게 되었다.

      장상경: MainView

      느낀 점, 앞으로의 각오

      박채현: MemberView

      무조건 스토리보드로 만들어야 하는 줄 알아서 막막했는데 코드로 짜니 속성값 주는 것도 편하고 재미있었습니다. 겁을 먹는 바람에 쉬운 화면을 만들고 싶었는데 다음 프로젝트에는 조금 더 난이도 있는 화면을 만들어서 문제가 생겨서 해결하는 즐거움을 느끼고 싶습니다.

      박시연: MemberDetailView, TempView

      시간이 촉박하게 느껴져서 코드리뷰나 조금더 심도있는 고민을 못했던 점이 아쉽습니다. 팀 프로젝트로 Git 협업을 처음해봤는데 매 순간 처음 겪는 내용이라 팀원들께 계속 질문하느라 미안하고 고마운 마음이 컸습니다!

      황도일: LaunchScreen, IntroductionView

      Git을 공부해둬서 다행이었다. 스토리보드는.. 공부를 안해둬서 힘들었다. 런치스크린과 소개뷰 모두 구현할 기능이 단순했는데, Xcode를 사실상 처음 만지다보니 그렇게 쉽지는 않았다. 프로젝트에 대한 공헌도는 내가 구현한 기능들보다도 Git의 문제 해결이나

      박민석: GoalView

      간단한 자기소개 앱이었지만 내가 생각한 것보다 훨씬 난이도가 높았다. xcode로 swift 코드를 작성하는 것도, git을 사용해 팀원들과 작업 상황을 공유하는 것도, 매일 하루에 12시간 이상씩 화면을 들여다보며 앉아있는 것도 힘들고 어려웠다. 그럼에도 서로 존중하며 소통하고 어려움을 같이 고민하며 프로젝트를 완성한 경험 덕분에 그 과정들이 즐겁고 보람차다고 느꼈고 중도에 포기하지 않는 힘이 된 것 같다.

      나영진: PromiseView

      팀원분들의 많은 도움 덕분에 앞으로의 개발자가 되기 위해

      한 발짝 나아갈 수 있는 기회가 되었던 것 같다.

      하지만 아직 배워야 할 게 너무 많아 시간을 열심히 투자해야 할 것 같다고 몸소 느끼는 중읻.

      장상경: MainView

      프로젝트를 시작하기 전에는 UIKit이 너무 큰 벽이고 어렵게 느껴졌는데, 막상 해보니 그 나름의 매력과 재미를 느낄 수 있었다. 깊이 팔 수록 매력이 있지만, 그만큼 많은 것을 알아야 하고 어렵다고 생각했다. 내가 어디까지 할 수 있을지 모르겠지만 UIKit을 완전히 내 것으로 만드록 싶다고 생각했다.

  3. 프로젝트 결과물(github)