Skip to content

๐Ÿ‘€ Watch It - ์˜ํ™” ๋˜๋Š” TV ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

Notifications You must be signed in to change notification settings

ji-yeon224/WatchIt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๋ฏธ๋ฆฌ๋ณด๊ธฐ


๐Ÿ—“๏ธ ํ”„๋กœ์ ํŠธ

  • ๊ฐœ์ธํ”„๋กœ์ ํŠธ
  • 24.04.12 ~ 24.05.23

โœ๏ธ ํ•œ ์ค„ ์†Œ๊ฐœ

  • ์˜ํ™” ๋˜๋Š” TV ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

๐Ÿ’ป ๊ธฐ์ˆ  ์Šคํƒ

  • SwiftUI, TCA
  • Combine, async/await
  • Chart, Realm, Alamofire, Kingfisher, AxisRatingBar
  • TMDB API

๐Ÿ“– ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

  • SwiftUI๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ
  • TCA ์•„ํ‚คํ…์ณ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ๋ฐฉํ–ฅ ํ๋ฆ„ ๊ตฌํ˜„
  • ์ž‘ํ’ˆ ๊ฒ€์ƒ‰ ๋ฐ ์ž‘ํ’ˆ ๋ณ„ ๋ณ„์  ์ €์žฅ ๊ตฌํ˜„

๐Ÿšจ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

โœ”๏ธ Text ๋‚ด์˜ ๋ผ์ธ ์ˆ˜ ํƒ์ง€

  • ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋ ค๋Š” ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์ • ๋ผ์ธ ์ˆ˜ ์ดํ•˜๋ฉด ์ „๋ฌธ์„ ๋ณด์—ฌ์ค˜๋„ ๋˜์ง€๋งŒ ๋ผ์ธ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๊ฒŒ ๋˜๋ฉด ๋”๋ณด๊ธฐ ๋ฒ„ํŠผ์„ ์‚ฝ์ž…ํ•˜๋ ค๊ณ  ํ•˜์˜€์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์—ˆ์„ ๊ฒฝ์šฐ ๋ผ์ธ ์ˆ˜๋ฅผ ์•Œ์•„๋‚ด๊ธฐ๊ฐ€ ์–ด๋ ค์›€
  • iOS 16.0๋ถ€ํ„ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ViewThatFits๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ์ค€ ๋ผ์ธ ์ˆ˜๋ฅผ ๋„˜์–ด๊ฐ€ ํ™”๋ฉด์ด ์ž˜๋ฆฌ๊ฒŒ ๋˜๋ฉด ๋”๋ณด๊ธฐ ๋ฒ„ํŠผ์„ ์‚ฝ์ž…ํ•˜๋„๋ก ๊ตฌํ˜„
// TruncatedTextView.swift
private func calculateTruncation() -> some View {
	ViewThatFits(in: .vertical) {
		Text(text)
			.font(Constants.FontStyle.caption.style)
			.hidden()
			.onAppear {
				guard isTruncated == nil else { return }
				isTruncated = false
			}
		Color.clear
			.hidden()
			.onAppear {
				guard isTruncated == nil else { return }
				isTruncated = true
			}
	}
}

โžก๏ธ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ์ž์„ธํžˆ ๋ณด๊ธฐ

โœ”๏ธ onAppear() ์ตœ์ดˆ ํ˜ธ์ถœ ์‹œ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๊ตฌํ˜„

  • onAppear() ์‹œ์ ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ, ํƒญ ์ด๋™ ํ›„์—๋„ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋˜์–ด ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
  • UIKit์˜ viewDidLoad()์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์˜ ํ•„์š”์„ฑ์„ ๋Š๋‚Œ
  • ์ƒ์œ„ ๋ทฐ์—์„œ ํ•ด๋‹น ํ™”๋ฉด์˜ onAppear() ํ˜ธ์ถœ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•˜๊ณ , @Binding์„ ํ†ตํ•ด onAppear() ์ตœ์ดˆ ํ˜ธ์ถœ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์ˆ˜ํ–‰
struct MovieListView: View {

ย  ย  @Binding var viewLoaded: Bool
ย  ย  init(viewLoaded: Binding<Bool>) {
ย  ย  ย  ย  self._viewLoaded = Binding(projectedValue: viewLoaded)
ย  ย  }
ย  ย  var body: some View {
ย  ย  ย  ย  WithPerceptionTracking {
ย  ย  ย  ย  ย  ย  ScrollView(.vertical) {
		...
ย  ย  ย  ย  ย  ย  }
ย  ย  ย  ย  ย  ย  .task {
ย  ย  ย  ย  ย  ย  ย  ย  if !viewLoaded {
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  viewLoaded = true
ย  ย  ย  ย  ย  ย  ย  ย  ย  ย  store.send(.viewDidLoad) // ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์š”์ฒญ
ย  ย  ย  ย  ย  ย  ย  ย  }
ย  ย  ย  ย  ย  ย  }
ย  ย  ย  ย  }
ย  ย  }
}

๐Ÿ”Ž ์ฃผ์š” ๊ธฐ๋Šฅ

โœ”๏ธ ๋ฉ”์ธ ํŠธ๋ Œ๋“œ ํ™”๋ฉด

  • ์ƒ๋‹จ์˜ ํƒญ์„ ํ†ตํ•ด ์˜ํ™” ํŠธ๋ Œ๋“œ์™€ TV ์‹œ๋ฆฌ์ฆˆ ํŠธ๋ Œ๋“œ๋ฅผ ๋‚˜๋ˆ„์–ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ ์ž‘ํ’ˆ ์ƒ์„ธ ํ™”๋ฉด

  • ์„ ํƒํ•œ ์ž‘ํ’ˆ์˜ ํฌ์Šคํ„ฐ์™€ ์ค„๊ฑฐ๋ฆฌ, ๋ฐฐ์šฐ์™€ ์Šคํƒญ ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹œ์ฒญํ•œ ์ž‘ํ’ˆ์ด๋ผ๋ฉด ๋ณ„์ ์„ ๋ฉ”๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • ์•„์ง ๋ณด์ง€ ์•Š์•„์„œ ์ฐœํ•ด๋‘๊ณ  ์‹ถ์€ ์ž‘ํ’ˆ์ด๋ผ๋ฉด ์ƒ๋‹จ ๋ฒ„ํŠผ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ ๊ฒ€์ƒ‰ ํ™”๋ฉด

  • ์›ํ•˜๋Š” ์ž‘ํ’ˆ์„ ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ํ•˜์—ฌ ์˜ํ™” ๋˜๋Š” TV ์‹œ๋ฆฌ์ฆˆ๋ฅผ ํ•„ํ„ฐ๋ง ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ ๋งˆ์ดํŽ˜์ด์ง€

  • ๋ณด๊ณ ์‹ถ์€ ์ž‘ํ’ˆ๊ณผ ํ‰๊ฐ€ ์ž‘ํ’ˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ง‰๋Œ€ ์ฐจํŠธ๋ฅผ ํ†ตํ•ด ๋‚˜์˜ ํ‰์  ๋ถ„ํฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ‰๊ฐ€ ์ž‘ํ’ˆ ๋ฆฌ์ŠคํŠธ๋Š” ํ‰์  ๋†’์€ ์ˆœ ๋˜๋Š” ๋‚ฎ์€ ์ˆœ์œผ๋กœ ํ•„ํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ๐Ÿป ํšŒ๊ณ 

  • SwiftUI์— ๋Œ€ํ•œ ํ•™์Šต์„ ์œ„ํ•ด ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ๋ผ์„œ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋Š๋ ค์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ์— ๊ฐ์„ ์žก๊ณ  ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ๋“ค์„ ์‹œ๋„ํ•ด๋ณด์•˜๊ธฐ์— ๋Š๋ ธ์ง€๋งŒ ์˜๋ฏธ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค.
  • ์ฒ˜์Œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” RxSwift์ฒ˜๋Ÿผ Combine์„ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ ์ดํ›„์— async/await์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค. async/await์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋‹ˆ ๋น„๊ต์  ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ์–ด๋Š์ •๋„ SwiftUI๊ฐ€ ์ต์ˆ™ํ•ด์ง€๊ณ  ๋‚œ ํ›„ ์•„ํ‚คํ…์ณ๋ฅผ ์ ์šฉํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๋‹ค๋˜ TCA๋ฅผ ์ ์šฉํ•˜๊ณ ์ž ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํ•™์Šต์ด ํ•„์š”ํ•˜์—ฌ ์ ์šฉํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์ข€ ํ•„์š”ํ•˜์˜€๋‹ค. ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ•™์Šต ํ›„ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜์˜€๋”๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ์‹œ๊ฐ„์ด ์ ๊ฒŒ ๊ฑธ๋ ธ๋‹ค. ์ด์ „์— ์ ์šฉํ•ด๋ณด์•˜๋˜ ReactorKit๊ณผ ๋น„์Šทํ•˜์—ฌ ์ดํ•ดํ•˜๋Š”๋ฐ ํฐ ์–ด๋ ค์›€์€ ์—†์—ˆ๋‹ค.

About

๐Ÿ‘€ Watch It - ์˜ํ™” ๋˜๋Š” TV ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages