inflearn logo
Khóa học

Khóa học

Chia sẻ kiến thức

Bài viết của kundol

kundol kundol

@kundol

Học viên
10,427
Đánh giá khóa học
742
Đánh giá khóa học
4.8

Bài viết 3497

Hỏi & Đáp

디자인패턴 질문

안녕하세요 지훈님 ㅎㅎ MVC "요청 받는 것, 데이터 처리 및 CRUD, 화면에 표시하는 것을 구분" -> 이건 Spring MVC(Model 2) 설명입니다. 사실 MVC는 세 갈래인데요 — Smalltalk MVC(V가 M을 구독) / Model 2(Spring·Rails, 구독 없음) / Cocoa MVC(Controller가 M·V 중재). 이 셋이 이름만 같고 다른 물건입니다. Spring MVC엔 "Model이 변하면 View가 갱신된다"가 아예 없습니다. 상태 변화에 반응할 화면 자체가 없으니까요. "M과 V가 서로 직접 참조할 수 있는 구조" -> 맞습니다 단, Smalltalk MVC 한정입니다. Cocoa MVC는 V가 M을 직접 참조 안 합니다. class TodoView { constructor(model) { this.model = model; // ← View가 Model을 안다 model.subscribe(() => this.render()); } render() { const left = this.model.items.filter(i => !i.done).length; // 도메인 규칙이 뷰로 샘 } } "단위 테스트도 어려워짐" 정확합니다. 저 filter 한 줄 때문에 뷰를 띄워야만 테스트 가능해집니다. "컨트롤러 안에서 다 다루니 점점 커짐" 문제 자체는 실재합니다. 다만 이건 Cocoa MVC에서 터지는 현상이고, iOS에서는 Massive View Controller 라고 부릅니다. MVP "M과 V가 서로 직접 참조할 수 없게 만듦" -> 맞습니다. View를 인터페이스로 추상화해서 진행한다고 보면 됩니다. interface TodoView { fun showTodos(items: List ) fun showLoading(); fun hideLoading(); fun showError(msg: String) } class TodoPresenter(private val view: TodoView, private val repo: TodoRepo) { fun onSubmit(text: String) { view.showLoading() repo.add(text) view.showTodos(repo.all()) // 갱신 view.hideLoading() } } 백엔드 예시로는 헥사고날의 Port/Adapter 그 자체라고 보시면 됩니다. Activity가 Adapter, 테스트할 땐 FakeView 주입 = Mock Repository 주입. "MVP에서도 비대해지는 문제는 해결 어려움" 정확히는 MVP의 비대화는 "다 떠안아서"가 아니라 갱신을 일일이 명령해야 해서입니다. "화면 상태" 하나 늘 때마다 view.xxx() 메서드가 늘어납니다. MVVM "그래서 등장한 것이 MVVM" -> 아닙니다. MVVM은 MVP를 고치려고 나온 게 아닙니다. 2005년 MS의 John Gossman이 만들었고, 이유는 WPF에 이미 강력한 선언형 바인딩 엔진이 있었기 때문입니다. 기술이 먼저 있었고 패턴이 따라온 것이지, 순차 진화가 아닙니다. "데이터 바인딩으로 뷰가 자동 업데이트, 코드가 줄어듦" -> 정확합니다. class TodoViewModel(private val repo: TodoRepository) : ViewModel() { private val _uiState = MutableStateFlow(TodoUiState()) val uiState = _uiState.asStateFlow() // ← View 타입이 등장조차 안 함 fun add(text: String) = viewModelScope.launch { _uiState.update { it.copy(isLoading = true) } runCatching { repo.add(text) } .onSuccess { _uiState.update { s -> s.copy(items = repo.all(), isLoading = false) } } .onFailure { e -> _uiState.update { s -> s.copy(error = e.message, isLoading = false) } } } } @Composable fun TodoScreen(vm: TodoViewModel) { val state by vm.uiState.collectAsStateWithLifecycle() if (state.isLoading) CircularProgressIndicator() Text("남은 일: ${state.items.count { !it.done }}") } MVP는 Presenter가 View를 알았지만, MVVM은 ViewModel이 View를 아예 모릅니다. 상태만 노출하고 뷰가 알아서 구독합니다. "'컨트롤러 비대화'와 '직접 참조' 두 가지를 모두 잡음" -> 절반만 맞습니다. 직접 참조 → 맞습니다. 비대화 → 안 잡힙니다. MVVM 써도 ViewModel은 똑같이 뚱뚱해집니다. 비대화의 근본 해법은 패턴 교체가 아니라 계층 분리(Service·UseCase)입니다. "단점으로는.. 그냥 구조가 복잡해졌다?" -> 구체적으로 얘기하는 게 중요한데요. 바인딩이 암묵적 의존이라 추적이 안 됩니다. 값이 왜 안 바뀌는지 콜스택을 못 따라가고, 불필요한 리컴포지션/리렌더 성능 이슈가 생기는 단점이 있습니다. 반면 MVP는 view.showLoading() 이 코드에 박혀 있어 눈으로 따라갈 수 있다고 보면 됩니다. 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.

Lượt thích
0
Số bình luận
2
Lượt xem
27

Hỏi & Đáp

팩토리 패턴

안녕하세요 지훈님 ㅎㅎ 팩토리는 그냥 다양한 클래스의 객체를 생성하기 쉬운 추상화된 형태의 클래스 정도 -> 네 맞습니다. +팩토리 패턴에서 팩토리가 생성하는 객체들이 반드시 상속 관계일 필요는 없습니다. 핵심은 상속 관계가 아니라 객체 생성 책임을 분리하고, 생성 과정을 사용하는 쪽에서 감추는 것 이라고 보시면 됩니다. 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.

Lượt thích
0
Số bình luận
2
Lượt xem
45

Hỏi & Đáp

5-S 테스트 케이스 질문

안녕하세요 ㅎㅎ 해당 부분 확인하고 수정작업 진행하도록 하겠습니다. ㅎㅎ 항상 피드백 주셔서 감사합니다. :)

Lượt thích
0
Số bình luận
2
Lượt xem
36

Hỏi & Đáp

싱글톤 패턴 구현방법

안녕하세요 지훈님 ㅎㅎ 런타임이 아니라 클래스 로딩시점에 미리 생성해 두는게 자원낭비 -> 보통 싱글턴은 앱 실행시 반드시 사용되는 객체의 경우 싱글턴을 걸기 때문에 자원낭비라 볼 수 없습니다. 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.

Lượt thích
0
Số bình luận
2
Lượt xem
51

Hỏi & Đáp

라이브러리 프레임워크 차이 질문

안녕하세요 지훈님 ㅎㅎ 정해진게 아니라 관점에 따라서 대답이 달라질 수 있는 -> 아닙니다. 이 경우 공식문서 기반으로 답변하면 됩니다. 제가 느끼기엔 nestjs, spring같이 정해진 틀 안에서 사용을 하게되는 프레임워크의 성격 -> 리액트의 경우 리엑트쿼리나 상태관리 등이 해당 라이브러리 안에 넣어져있지 않습니다. 리액트 생태계 기반으로 import 해서 쓰는 형태기 때문에 라이브러리가 더 맞습니다. 그 기준이 모호하긴하지만요 ㅎㅎ 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.

Lượt thích
0
Số bình luận
1
Lượt xem
51

Hỏi & Đáp

2 - T 오큰수 문제가 있는 것 같습니다.

안녕하세요 효재님 ㅎㅎ 저는 맞았다고 뜨는데요 ㅎㅎ 혹시 새로고침 + 채점서버 git pull 해서 최신 서버로 실행해보시겠어요?

Lượt thích
0
Số bình luận
1
Lượt xem
43

Hỏi & Đáp

코살 문제풀이 환경

안녕하세요 현섭님 ㅎㅎ 실제 회사에서 코테 칠때랑 동일하게 (예를들면 프로그래머스 환경) 조성해 주실 수 있을까요? -> 코살의 환경은 여러 회사에서 코테 칠때랑 동일합니다. 코딩테스트 섹션을 통해 보다 더 코테 칠 때와 동일하게 연습할 수 있습니다. 프로그래머스 환경과 동일하게는 불가능합니다. 참고로 저번 현섭님이 요구하신 문제수 추가는 완료되었습니다 350여개의 문제를 추가했습니다. 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.

Lượt thích
0
Số bình luận
2
Lượt xem
49

Hỏi & Đáp

추천 추가문제들

안녕하세요 현섭님 ㅎㅎ 지금부터 코살 사이트에 추천 추가문제들 -> 현섭님이 요청하신대로 이부분은 아마 8월중에 마무리 될 거 같습니다. 지금부터 대비해서 내년 상반기에 600솔은 한 상태로 가고자 합니다. => 코살에 있는 것을 다 푸셨다면 프로그래머스나 리트코드, 코드포스를 추천드립니다. 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.

Lượt thích
0
Số bình luận
2
Lượt xem
43