Skip to content

Latest commit

 

History

History
653 lines (532 loc) · 28.6 KB

File metadata and controls

653 lines (532 loc) · 28.6 KB

티로그

오늘을 기록하는 습관, 티로그와 함께 티로깅 여정을 시작해봐요!

TLog Landing Images

다운로드

download tlog for iOS

개발 참여

먼저, 프로젝트 관리를 읽어보세요.

준비물

  • Xcode 15.0 이상
  • brew (아래 패키지를 설치합니다.)
  • SwiftLint
  • swiftformat-for-xcode

시작하기

  1. 저장소를 클론합니다.

    $ git clone https://github.com/nbcamp/tlog-ios.git
  2. develop 브랜치로 이동합니다.

     $ git checkout develop
  3. develop 브랜치로부터 새로운 브랜치를 생성합니다.

    $ git checkout -b feature/[이슈번호]
  4. TLog.xcodeproj 파일을 Xcode로 실행합니다.

  5. 작업 완료 후, develop 브랜치로 Pull Request를 생성합니다.

    $ git push origin feature/[이슈번호]
  6. Pull Request를 생성합니다.


프로젝트 소개

티로그는 작성한 TIL을 관리하고 커뮤니티를 통해 타인과 공유할 수 있는 서비스입니다.
꾸준히 작성하기 어려운 TIL 작성. 티로그와 함께하며 오늘 배운 내용을 기록하는 습관을 만들어보세요.

TIL이란, Today I Learned의 약자로 "오늘 내가 배운 내용"을 그 날 배운 새롭거나 흥미로운 내용을 간단하게 정리하여 기록하는 것을 말합니다.

프로젝트 시연

TLog Demo

제공하는 기능

  • OAuth 기반의 사용자 인증 기능을 제공하여 손쉽게 로그인할 수 있습니다. (Apple)
  • 블로그의 RSS 주소를 통해 새롭게 작성한 게시글을 자동으로 앱에 등록할 수 있습니다.
  • 작성한 글을 달력을 통해 일/월별 단위로 조회할 수 있습니다.
  • 오늘을 포함한 TIL 연속 작성일을 계산하여 달력에 시각적으로 표시합니다.
  • 앱에 등록한 게시글을 커뮤니티에 공유하여 타인과 소통할 수 있습니다.
  • WebView를 제공하여 앱 내에서 게시글을 확인할 수 있습니다.
  • 게시글의 제목, 내용, 태그 기반으로 검색할 수 있습니다.
  • 게시글에 좋아요를 눌러 따로 저장할 수 있고, 다른 사용자를 팔로우할 수 있습니다.
  • 다른 사용자가 좋아요한 게시물을 확인할 수 있습니다.
  • 차단/신고 기능을 제공합니다. 차단할 경우, 해제하지 않는 한 해당 사용자를 찾을 수 없습니다.

프로젝트 관리

Git 관련

Git Workflow
  1. git clone [저장소 이름]
  2. cd [저장소 이름]
  3. git checkout develop
  4. git checkout -b feature/[이슈번호]
  5. git status
  6. git add [작업한 파일]
  7. git commit (Commit Convention 항목 참고)
  8. git push origin feature/[이슈번호]
  9. Pull Request 생성 (gh도 사용해보세요!)
  10. Code Review
  11. Merge (Conflict 발생 시 대응 전략 항목 참고)
  12. git checkout develop
  13. git pull origin develop → 주의!! 새로운 브랜치 생성 시 반드시 진행할 것
  14. 3번 항목부터 반복
Commit Convention
  • 첫 줄에 유형작업한 내용 설명을 반드시 작성합니다.
  • 작업한 내용 설명은 한글로 작성하셔도 됩니다. (e.g. feat: 로그인 페이지 추가)
  • 작업한 내용에 대해 부가 설명이 필요하다면 body에 작성합니다.
  • 각 문단은 반드시 한 칸 띄워져 있어야 합니다.
유형: 작업한 내용 설명

optional body

optional footer

# 유형: description
# ------------------------------------------------
# feat: 새로운 기능 추가
# fix: 버그 수정
# docs: 문서 수정
# style: 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우
# refactor: 코드 리펙토링
# test: 테스트 코드, 리펙토링 테스트 코드 추가
# chore: 빌드 업무 수정, 패키지 매니저 수정
Branching 전략
  • main, develop, feature, hotfix 브랜치를 활용합니다.
    • main: 현재 배포할 브랜치입니다.
    • develop: 개발 진행 중인 브랜치입니다.
    • feature: 기능 단위의 브랜치입니다.
    • hotfix: main 브랜치에서 발생한 치명적인 문제를 수정하기 위한 브랜치입니다.
  • feature 브랜치는 반드시 develop 브랜치로부터 분기해야 합니다.
  • feature 브랜치 이름 규칙: feature이슈번호` (e.g. `feature/15`)
Merge 전략
  • Merge Commit
    • 병합하려는 커밋 목록과 함께 새로운 병합 커밋을 생성하여 목적 브랜치에 병합합니다.
    • 사용하지 않습니다.
  • Squash Merge
    • Pull Request에서 발생한 커밋 목록을 하나로 묶어 생성한 하나의 커밋을 목적 브랜치에 병합합니다.
    • 생성한 Pull Request를 develop 브랜치에 병합할 때 사용합니다.
  • Rebase Merge
    • 로컬 브랜치를 최신화할 때 사용합니다.(develop → 현재 작업 중인 브랜치로 병합할 때)
    • develop -> main 병합할 때 사용합니다.
    • main 혹은 develop 브랜치의 히스토리를 깔끔하게 유지할 수 있습니다.
    • 해당 이슈에 치명적인 문제가 있을 때 해당 작업만 Drop하기 쉽습니다.
    • 새로운 커밋 생성 없이, 기존 커밋에 곧바로 병합합니다.
    • 기존의 커밋 히스토리를 그대로 유지한 채로 최신화할 수 있습니다.
    • 새로운 병합 커밋을 생성하지 않으므로 WIP Commit과 함께 사용하기 용이합니다.
Resolve Conflict 전략
  • Pull Request 병합 과정에서 충돌이 발생했을 때 진행합니다.
  • 충돌 해결은 반드시 로컬에서 진행합니다. 임의로 Github 사이트 내에서 진행하지 않습니다.
  • 충돌 해결 후 프로젝트가 제대로 실행되는지 반드시 확인합니다.
  • 충돌 해결을 위해 VSCode 3-way Merge Editor를 활용해보세요.
# 1. 현재 작업 브랜치에 위치해있습니다.
$ git branch
main
develop
* feature/10 

# 2. 현재 작업 중인 변경내역이 있다면 진행해주세요. (브랜치 변경 안될 때)
# 임시로 모든 변경 사항을 wip 커밋으로 만들어둡니다.
$ git add .
$ git commit -m "wip" # work in progress란 의미

# 3. 반드시 develop 브랜치로 이동 후 pull을 해주세요.
$ git checkout develop 
$ git pull origin develop

# 4. 다시 작업 브랜치로 이동 후 rebase를 진행합니다.
$ git checkout feature/10
$ git rebase develop # 충돌 발생!

# 5. 충돌을 해결합니다.
# 5-1. 충돌을 해결하고 continue로 rebase를 계속 진행합니다.
$ git rebase --continue
# 5-2. 충돌 해결 도중 취소하고 싶다면 abort로 되돌립니다.
$ git rebase --abort

# 6. 2번 작업을 진행해서 wip 커밋이 있다면, 반드시 reset해주세요.
# wip 커밋이 원격 저장소로 올라가지 않도록 주의해주세요.
$ git reset HEAD^

# 5. 작업 브랜치를 강제로 push합니다.
# ref: https://stackoverflow.com/q/52823692
$ git push --force-with-lease origin feature/10
Github Project
  • Github Project를 활용하여 프로젝트를 관리합니다.
  • 작업(Task) 진행 관리
    • 할 일대기 중인 작업 목록입니다.
    • 진행 중현재 진행 중인 작업 목록입니다.
    • 코드 리뷰코드 리뷰가 필요하거나 진행 중인 작업 목록입니다.
    • 변경 필요코드 리뷰를 마치고 변경이 필요한 작업 목록입니다.
    • 병합 대기 중코드 리뷰 완료 후 병합 대기 중인 작업 목록입니다.
    • 완료완료되어 병합된 작업 목록입니다.
  • 작업 순서
    1. 할 일목록에서 작업할 티켓을 골라 본인을 할당합니다.
    2. 할 일목록에서 진행할 작업 티켓을 진행 중목록으로 옮깁니다.
    3. 작업이 완료되면 Pull Request를 생성하고 코드 리뷰를 받습니다.
    4. 본인의 티켓이 변경 필요목록에 위치한다면 이를 우선적으로 진행 중목록으로 옮긴 뒤 작업합니다.
    5. 이하 작업은 자동으로 이뤄집니다.
      1. Pull Request 생성 시 코드 리뷰로 이동합니다.
      2. 다른 사람들은 올라온 Pull Request에 대해 코드 리뷰를 진행해주셔야 합니다. 코드 리뷰 승인 시 병합 대기 중목록으로 이동합니다.
      3. Pull Request가 Changes Request 상태로 변경되면 변경 필요목록으로 이동합니다.
      4. Pull Request가 병합되면 완료목록으로 이동합니다.

코드 관련

코드 컨벤션
  • 프로젝트의 안정성 및 코드 품질을 유지하기 위해 SwiftFormat과 SwiftLint를 적용합니다.
    • SwiftFormat: 설정한 규칙에 맞춰 코드를 포맷팅해줍니다.
    • SwiftLint: 작성한 Swift 코드에서 발생할 수 있는 잠재적인 문제와 컨벤션 오류를 감지합니다.
  • 좀더 Swift스러운 코드를 작성하기 위해 API Design Guideline을 기반으로 코드를 작성합니다. 이에 관해 코드 리뷰에서 의논해봅시다.
  • 높은 품질을 가진 코드는 잠재적인 버그를 최소화하고 읽기 편하며 유지보수하기 좋습니다.
  • Xcode에서 제공하는 Spell Checker를 켜고 오타에 주의합시다…!
  • Code SmellNinja Code를 주의합시다!

프로젝트 구조

Resources

  • AppDelegate, SceneDelegate, Assets.xcassets, Info.plist 등 앱의 기본적인 설정 혹은 정적 파일을 갖습니다.

Models

  • 단순한 데이터 구조를 표현하기 위한 구조체입니다.
  • 주로 네트워크 응답으로 전달되는 JSON 형식의 데이터를 디코딩하기 위한 목적으로 활용하며 모든 구조체가 Codable 프로토콜을 채택하고 있습니다.
  • 서버로부터 전달된 데이터의 불변성을 유지하기 위해 모든 저장 속성을 let으로 선언하였습니다.

Services

  • APIService 혹은 RssService처럼 Model을 준비하는 역할을 수행합니다.
  • Raw한 데이터를 받아와 변환 및 가공하여 ViewModel에게 제공합니다.

ViewModels

  • Model에서 제공하는 구조체 데이터를 활용하여 View에서 사용할 수 있도록 가공하는 역할을 수행합니다.
  • 데이터가 변경되었을 때 이를 View에 반영하기 위해 Combine을 활용하여 Data Binding을 구성합니다.

Views

  • UI 관련 로직을 담당합니다.
  • 사용자 입력이 발생하였을 때 이를 ViewModel에 전달하고, ViewModel로부터 전달받은 데이터를 화면에 표시합니다.

기술 스택

UIKit (iOS 15.0)
  • Apple App Store에서 제공하는 전 세계 iOS 사용 현황을 참고해봤을 때, 현재 23년 5월 30일 기준으로 총 94%의 사용자가 iOS 15 버전 이상을 사용하고 있습니다. 다양한 사용자가 iOS 15 버전의 환경에서도 원활한 사용자 경험을 제공하기 위해 최소 버전을 15.0으로 결정하였습니다.
SwiftLint, SwiftFormat
  • 일관된 형식의 코드 작성을 강제하여 프로젝트 전반의 코드 품질을 높입니다.
  • 읽기 쉬운 코드를 작성하도록 유도하며, 잠재적인 버그 발생을 최소화합니다.
  • SwiftLint의 경우, Build Phase에 스크립트를 추가하여 각자 컴퓨터에 설치된 swiftlint를 실행하여 linting이 가능하도록 했습니다.
  • SwiftFormat은 위와 같은 방식으로 함께 적용했을 때, SwiftFormat에 의한 변경사항이 Xcode에 잘 반영이 되지 않는 문제가 있어, swiftformat-for-xcode를 각자 설치하여 formatting을 진행하게끔 했습니다. (설치방법)
PinLayout, FlexLayout
Moya (+MoyaSugar)
  • Enum을 활용하여 HTTP 요청과 함께 전달해야 할 Body 혹은 Query Param에 대해 타입 안전성을 높여 human error를 방지합니다.
  • 높은 수준으로 추상화하여 URLSession 혹은 Alamofire에 비해 코드의 복잡도가 줄어듭니다.
  • MoyaSugar를 추가로 도입하여 HTTP method를 endpoint와 함께 작성할 수 있게 수정되면서 전처럼 일일이 따로 작성해줘야하는 불편함을 개선하였습니다. 또한, 사용자 정의 연산자 => 를 제공하여 보다 편리하게 Body 혹은 Param을 전달할 수 있게 되었습니다.
FSCalendar
  • 달력 UI를 손쉽게 작성할 수 있도록 도와주고, 유연한 커스터마이징이 가능합니다.
  • iOS 16부터 사용 가능한 UICalendarView와 달리 다양한 버전의 iOS와 잘 호환됩니다. 최소 iOS 버전을 15.0으로 설정한 만큼 이를 채용하였습니다.
XMLCoder
  • 마치 JSON 문서를 JSONDecoder를 활용하여 쉽게 디코딩하는 것처럼 XML 문서를 파싱하여 Swift의 구조체로 변환할 수 있습니다.
  • RSS 데이터를 추출하기 위해 XML Parsing 용도로 활용하였습니다.
  • delegate 기반의 XMLParser은 재귀적으로 동작하는 방식이기 때문에 코드의 복잡도가 높아지는 문제가 있어, 이를 통해 해결할 수 있었습니다.
Then
  • 객체를 생성하고, 속성을 설정하고, 메서드를 호출하는 과정을 체이닝 형식으로 작성할 수 있습니다.
  • 즉시 실행 클로저 방식으로 작성하는 것에 비해 클로저 내에서 인스턴스를 생성 및 반환 과정을 생략할 수 있으며, 단축 매개변수 이름($0)을 활용할 수 있어 불필요한 코드라인을 줄이고 가독성을 높일 수 있습니다.
MVVM (Combine)
  • MVC의 고질적인 문제인 ViewController가 비대해지는 문제를 방지합니다.
  • 각 로직의 역할을 정확히 분리하여 일관적이고 유지보수하기 쉬운 코드를 작성합니다. (관심사 분리)
  • Combine을 활용하여 MVVM 아키텍처에서 View와 ViewModel 사이의 Data Binding을 구성할 수 있습니다.

아키텍쳐 다이어그램

---
title: Tech Architecture Diagram
---
graph TD
  subgraph ServerDockerContainer[Docker Container]
      BunJS[Bun.js Server]
  end

  subgraph MySQLDockerContainer[Docker Container]
      MySQL[(MySQL)]
  end

  subgraph EC2
      ServerDockerContainer
      MySQLDockerContainer
  end

  subgraph S3
      Images(Images)
  end

  subgraph AWS
      EC2
      S3
  end

  subgraph Clients
      User1([User1])
      User2([User2])
      User3([User3])
  end

  subgraph Github
      ClientRepo[Client Repo: Swift]
      ServerRepo[Server Repo: JS]
      GithubAction[[Github Action]]
  end

  subgraph DockerHub
      BunJsImage(Bun.js Image)
      MySQLImage(MySQL Image)
  end

  ClientRepo --Deploy--> AppStore((App Store))
  AppStore --Distribute--> Clients
  Clients <--HTTP--> BunJS
  Clients --Get Images--> S3

  ServerRepo --Push to main branch--> GithubAction
  GithubAction --Deploy using SSH--> EC2
  BunJS <--Prisma ORM--> MySQL

  GithubAction --Build and Push Image--> BunJsImage
  BunJsImage --Pull Image--> BunJS
  MySQLImage --Pull Image--> MySQL

  BunJS --Save Images--> S3

  style ClientRepo fill:#f9d9ff,stroke:#333,stroke-width:2px
  style BunJS fill:#d9f9ff,stroke:#333,stroke-width:2px
  style MySQL fill:#d9f9ff,stroke:#333,stroke-width:2px
  style ClientRepo fill:#d9ffd9,stroke:#333,stroke-width:2px
  style ServerRepo fill:#d9ffd9,stroke:#333,stroke-width:2px
  style BunJsImage fill:#ffd9d9,stroke:#333,stroke-width:2px
  style MySQLImage fill:#ffd9d9,stroke:#333,stroke-width:2px
  style GithubAction fill:#ffffff,stroke:#333,stroke-width:2px
  style User1 fill:#FAF6F0,stroke:#333,stroke-width:2px
  style User2 fill:#FAF6F0,stroke:#333,stroke-width:2px
  style User3 fill:#FAF6F0,stroke:#333,stroke-width:2px
Loading
  • 소스 코드는 Github을 통해 iOS 클라이언트와 JS 서버를 별도의 저장소로 관리하고 있습니다.
  • iOS 클라이언트의 경우 App Store를 통해 배포되어 사용자에게 제공됩니다.
  • 서버는 AWS EC2에 위치해 있으며 HTTP 형식으로 클라이언트와 통신합니다.
  • 이미지는 서버에 의해 AWS S3에 저장되며 클라이언트가 필요할 때 S3에서 이미지를 가져올 수 있습니다.
  • 서버에 대한 더 자세한 플로우는 API 서버 저장소에 정리되어 있습니다.

네비게이션 플로우차트

---
title: Navigation Flowchart
---
flowchart TD
    Open((앱 실행))

    Background((백그라운드))

    LoadingVC(로딩 화면)

    subgraph RootVC[Root - NavigationController]

        actived{응답 확인}

        SignInVC(로그인 화면)
        AgreeVC(이용 약관 동의 화면)

        subgraph TabBarController
            subgraph HomeTab[홈 탭]
                subgraph NavigationController1[NavigationController]
                    HomeVC(홈 화면)
                end
            end
            subgraph CommunityTab[커뮤니티 탭]
                subgraph NavigationController2[NavigationController]
                    CommunityVC(커뮤니티 화면)
                end
            end
            subgraph MyProfileTab[내 정보 탭]
                subgraph NavigationController3[NavigationController]
                    MyProfileVC(내 정보 화면)
                end
            end
        end

        AgreeVC -->|dismiss| TabBarController
        SignInVC <-->|present/dismiss| TabBarController
    end

    Open --> LoadingVC

    LoadingVC -->|사용자 인증 정보 요청| actived

    Background -->|사용자 인증 정보 요청| actived
    actived -->|인증 필요| SignInVC
    actived -->|약관 동의 필요| AgreeVC
    actived -->|인증 완료| TabBarController
    SignInVC -->|회원 가입 시| AgreeVC
    

    style actived fill:#F6FDC3,stroke:#333
    style LoadingVC fill:#CDFAD5,stroke:#333

    style HomeVC fill:#E0F4FF,stroke:#39A7FF
    style CommunityVC fill:#E0F4FF,stroke:#39A7FF
    style MyProfileVC fill:#E0F4FF,stroke:#39A7FF
Loading
  • 앱 실행 시, 사용자 인증 요청과 함께 로딩 화면이 먼저 나타납니다.
  • 네트워크 응답이 오면 RootViewController를 띄웁니다. 그 후, 사용자 인증 여부를 확인하여 다음의 과정을 실행합니다.
    • 사용자 인증이 필요한 경우, 로그인 화면을 띄웁니다. (present)
      • 로그인 성공 시, 회원가입일 경우 이용 약관 동의 화면을 띄웁니다. (present)
      • 로그인 성공 시, 기존 회원이라면 로그인 화면을 닫습니다. (dismiss)
    • 이용 약관 동의가 필요한 경우, 이용 약관 동의 화면을 띄웁니다. (present)
      • 이용 약관 동의 시, 이용 약관 화면을 닫습니다. (dismiss)
  • 위 과정은 백그라운드 상태에서 앱을 실행했을 때도 동일하게 적용됩니다.
  • 앱을 사용하던 중 인증 토큰이 만료되면 로그인 화면을 다시 띄웁니다. (present)

팀원 소개

  • Git 및 코드 컨벤션 관련 규칙 작성
  • 프로젝트 구조 설정, 팀원 작업 할당 및 일정 관리
  • Bun.js 기반 Rest API 서버 작성 Github
  • Moya 라이브러리를 활용한 Network 계층 추상화
  • UI에 곧바로 적용할 수 있도록 ViewModel 작성
  • PinLayout & FlexLayout 조사 및 적용
  • 네비게이션 및 레이아웃 관련 오류 수정
  • 배포 자동화를 통한 API 서버 장애 즉각 대응
  • README 문서 작성
  • 앱 전반에 사용될 공용 컴포넌트 구현(버튼, 텍스트필드, View, TableViewCell 등등)
  • 로그인 화면 UI 및 애플 로그인 기능 구현
  • 블로그 등록/수정/삭제/목록 화면 UI 및 기능 전반 구현
  • 팔로우 목록 화면 UI 및 전체적인 팔로우/언팔로우 기능 구현
  • 차단/신고 버튼, 차단한 사용자 화면 UI 구현
  • 앱 로고 및 스크린샷 디자인
  • 앱 배포 관련 전반적인 작업
  • 달력 UI 구현
  • 사용자 TIL 연속 작성 시 달력에 연속일자 확인 표시 기능 구현
  • RSS ViewModel에서 RSS파싱 및 달력에서 사용될 데이터 가공
  • 블로그 등록시 RSS 자동완성 기능 및 각종 유효성 검사 기능 구현
  • 내 정보 페이지 UI 및 기능 구현
  • 유저 정보 페이지 UI 및 기능 구현
  • 더보기 바텀시트 UI 및 기능 구현
  • 회원 정보 수정 페이지 UI 및 기능 구현
  • WebKit을 활용한 WebViewController 구현
  • 개인정보 처리방침 및 이용약관 발급
  • QA 작업
    • Navigation 및 TabBar의 공유방식으로 인해 UI가 깨지는 현상 탐지
    • 메인 블로그 진입후 뒤로가기 시 앱이 죽는 현상 탐지
    • 좋아요 버튼 해제 시 아이콘 깜빡이는 현상 탐지
    • UISegmentedController 반복 운동시 유저들의 기본 프로필이 바뀌는 현상 탐지
    • 메인 블로그 진입후 뒤로가기 시 앱이 죽는 현상 탐지

개발 타임라인

1주차 (2023.10.10 ~ 10.13)
  • 팀 규칙, 일정 계획 수립
  • 프로젝트 기획 및 디자인 작성
  • 사용할 기술 스택 선정
  • Github 저장소 생성 및 Project 작성
  • 작업 티켓 (Issue) 생성 및 할당
  • 프로젝트 관리 자동화
2주차 (2023.10.14 ~ 10.20)
  • 기획에 맞춰 Database Schema 설계
  • Moya 라이브러리 기반 Network Layer 작성
  • 애플 로그인 기능 구현 조사
  • PinLayout & FlexLayout 라이브러리 기반 UI 구현
  • 로그인, 홈, 내 정보, 내 정보 수정, 블로그 목록/등록/수정 화면 작성
  • 재사용성 높은 Custom UI View 구현
  • 달력 UI 구현
3주차 (2023.10.21 ~ 10.27)
  • PinLayout, FlexLayout 활용 방법 공부
  • APIService 작성 (API Endpoint 정리)
  • Model을 활용하여 CRUD 기능을 제공하는 ViewModel 작성
  • Custom View 추가 작성 및 리팩토링
  • 커뮤니티, 팔로우, 웹뷰 화면 작성
  • 애플 로그인 기능 구현
  • 달력 관련 비즈니스 로직 작성 (XMLParser)
4주차 (2023.10.28 ~ 11.03)
  • API Endpoint 전면 개선 (RESTful API 설계 목적)
  • MoyaSugar 도입 및 코드 정리
  • 앱 이용 약관 및 개인 정보 처리 방침 화면 작성
  • 내 정보, 다른 사용자 화면 기능 연결
  • 커뮤니티 화면 기능 구현 (Infinite Scrolling, PullToRefresh)
  • 블로그 목록/등록/변경/삭제 기능 연결
  • 유효성 검사 기능 추가
  • 팔로우/팔로잉 기능 구현
  • 중복 코드를 Custom View로 분리하여 제거
  • XMLParser를 XMLCoder로 수정
  • 앱 아이콘 디자인
5주차 (2023.11.04 ~ 11.10)
  • RSS로 불러온 게시글을 서버로 전송하는 로직 추가
  • RssService 추가하여 RSS 관련 로직 전부 분리
  • 달력 UI 로직 개선 (버그 수정)
  • FlexLayout이 적절히 적용되지 않은 부분 수정
  • 다른 사용자의 블로그 정보 불러오기 기능 추가
  • 게시글 좋아요 기능 연결 및 목록 표시
  • 커뮤니티 사용자 차단/신고 화면 추가
  • 키보드 관련 문제 검토 및 수정
  • 팔로우 기능 추가 및 개선
  • 전반적인 UI 오류 검토 및 개선
  • 앱 배포 준비
6주차 (2023.11.11 ~ 11.17)
  • API 관련 오류 수정
  • 레이아웃 관련 오류 수정
  • 네비게이션 관련 오류 수정
  • 이미지 업로드를 위한 API 추가 및 S3 연동
  • 첫 번째 앱 배포 시도 (실패)
  • 이용 약관 동의 화면 추가 및 기능 연결
  • 커뮤니티 목록 화면에 차단/신고 기능 추가
  • 두 번째 앱 배포 시도 (성공!)