일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 객체지향
- inflearn
- http
- inflearn http
- 기술블로그
- Til
- 백엔드
- 인프런
- 개발일기
- 공부블로그
- 공부기록
- 자바
- inflearn spring
- java 기초
- java if
- 자바 기초
- 스프링
- java
- 인프런 스프링
- til 2021
- Today I Learned
- 개발자
- 자바 스프링
- Java Spring
- fastcampus
- java기초
- Spring
- 인프런 http
- 코린이
- 자바기초
- Today
- Total
코딩하는 쨈이
[SwiftUI/Firebase] Sign In With Email - 1) AuthenticationView 만들기(@StateObject, final Class) 본문
[SwiftUI/Firebase] Sign In With Email - 1) AuthenticationView 만들기(@StateObject, final Class)
정쨈 2024. 1. 26. 23:46앱스쿨을 수강하는 동안 큰거온다 프로젝트(최종 플젝 전전..)에서 로그인 기능을 맡았었는데
당시에는 코드를 치면서 모르는 부분에 대한 공부보단 기능을 빠르게 만들어야한다는 압박?감 때문에
이 코드가 왜 이렇게 동작되는지 모르고 어영부영 따라가며 기능을 만들어서 푸시한적이 많았다.
급할수록 돌아가라는 말처럼 그동안 헷갈렸던 개념들을 포함해서 코드를 이해해보기 위해
처음부터 천천히 알아가보려고 한다.
우선 기본적인 Package Dependency, Firebase 설정은 모두 해두었다.

1. AuthenticationView를 만들고 SignInWithEmail 버튼을 만든다.
struct AuthenticationView: View {
var body: some View {
VStack {
NavigationLink {
Text("Hello")
} label: {
Text("Sign In With Email")
.font(.headline)
.foregroundStyle(.white)
.frame(height: 55)
.frame(maxWidth: .infinity)
.background(Color.blue)
.cornerRadius(10)
}
Spacer()
}
.padding()
.navigationTitle("Sign In")
}
}
#Preview {
NavigationStack {
AuthenticationView()
}
}
2. SignInWithEmail를 누르면 이동하는 SignInEmailView를 만든다.
final class SignInEmailViewModel: ObservableObject {
@Published var email = ""
@Published var password = ""
}
struct SignInEmailView: View {
@StateObject private var viewModel = SignInEmailViewModel()
var body: some View {
Text("Hello, World!")
}
}
#Preview {
SignInEmailView()
}
1) signInEmailViewModel을 final class로 만든 이유?
final 키워드를 쓰는 이유는 클래스를 상속할 수 없도록 만들기 위해서이다.
또 final class로 선언하면 컴파일러가 해당 클래스의 구조를 최적화할 수 있다.
추가로 메모리 관리 측면에서도 관리가 좀 더 간편해진다는 이점이 있다.
final class로 선언하면 상속문제나 RC 등을 고려하지 않아도 된다.
2) @State가 아닌 @StateObject를 사용한 이유?
SwiftUI에서는 @State, @StateObject 같은 Property Wrapper로 뷰 내부와 뷰 사이에 데이터 공유를 한다.
그동안 두 프로퍼티 래퍼의 차이점을 잘 모르고 사용해왔어서 찾아보니 두 프로퍼티 래퍼의 큰 차이점은
@State는 Struct형태에서만, @StateObject는 Class형태에서만 변수로 사용 가능하다는 것이다.
또 Class에서 해당 프로퍼티 래퍼를 사용하기 위해서는
위와같이 @StateObject와 @Published를 함께 사용해야하고 Observable 프로토콜을 사용해야 한다.
@Published는 Property Observer로서 프로퍼티의 변화를 관찰하는 것으로 새 값이 설정되면 호출된다.