Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

동기화 메모장 [STEP2] 호박, 아리 #84

Merged
merged 28 commits into from
Feb 16, 2022

Conversation

hoBahk
Copy link

@hoBahk hoBahk commented Feb 14, 2022

안녕하세요. 웨더! @SungPyo

호박 @hoBahk 아리 @leeari95 입니다!
STEP2 요구사항 모두 구현하여 PR 보내드립니다.

혹시 부족한 점이나 놓친 부분이 있다면 번거롭더라도 한번 더 짚어주시면 감사하겠습니다. 🙇🏻‍♀️

고민했던 점

1. 코어데이터를 관리하는 매니저 타입 구현

  • 메모의 CRUD를 구현 및 View에 보여줄 데이터를 관리할 수 있는 PersistentManager 구현
  • fetch를 할 때 Predicate, Sort 등을 유연하게 할 수 있도록 파라미터 별도 구현

2. 사용자 친화적인 UI를 구현

  • 최근에 작성, 수정하였던 메모가 상단으로 올라올 수 있도록 메모 리스트의 정렬을 날짜를 기준으로 내림차순으로 정렬
  • 어떤 메모를 선택해서 작성하고 있는지 한눈에 보기 편하도록 작성하고 있는 Cell을 계속 Select 되도록 구현
  • 작성하는 도중 날짜가 업데이트 되면, 상단으로 이동하면서 Select도 상단으로 이동.
  • 메모를 추가했을 때 추가한 새로운 메모를 Select 되도록 구현
  • 메모를 삭제했을 때, 삭제한 부분 이후 메모를 자동으로 Select 되도록 구현
  • 스와이프 및 더보기 버튼 터치시 보여지는 액션버튼이 단순 텍스트가 아닌 아이콘이 표기되도록 구현
  • Share를 터치하여 UIActivityViewController가 present 되었을 때 화면 회전 시에도 컨트롤러가 중앙에 계속 위치할 수 있도록 구현

3. 제목과 본문의 폰트를 다르게 하여 구분하는 기능 구현

  • AttributtedString을 사용하여 TextView의 제목과 본문의 폰트를 다르게 하여 사용자가 보기에 편하도록 구현
  • textView의 delegate 메서드(shouldChangeTextIn)와 textView의 typingAttributes 프로퍼티를 사용하여 입력중에도 제목과 본문에 맞는 폰트가 적용되도록 구현

궁금했던 것 / 조언이 필요한 점

1. 본문에 title에서 줄바꿈하면 커서가 커지는 현상

  • 본문 맨 마지막 부분에서 편집할 때는 이상이 없는데, 제목 부분에서 줄바꿈을 하여 부분 편집을 할 경우 Text의 커서가 커지는 버그를 발견했습니다.
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    let currentText = textView.text as NSString
    let titleRange = currentText.range(of: Constant.lineBreak.description)
    if titleRange.location < range.location {
        textView.typingAttributes = Constant.bodyAttributes
    } else {
        textView.typingAttributes = Constant.headerAttributes
    }
    return true
}
  • 엔터를 눌러 줄바꿈을 했을 경우를 디버깅 해본 결과, titleRange와 파라미터로 전달받는 shouldChangeTextIn range의 location이 같을 경우 else문을 타고 textView의 typingAttributes을 headerAttributes로 할당하는 부분 때문에 해당 문제가 발생하는 것 같습니다.
  • 저기에 어떤 조건을 추가해야 해당 방법을 해결할 수 있을지 잘 떠오르지 않기도 하고, 줄바꿈 이후 텍스트를 작성한 이후에는 정상적으로 body 스타일로 잘 작성되는 상황이라... 둘이서 의논한 결과 '큰 문제는 아니다' 라는 판단을 내렸는데요.
  • 이에 대한 웨더의 의견이 궁금합니다.

2. UIContextualAction의 handler의 completeHandeler는 어떤 역할을 하는 것일까요?

  • Swipe액션을 구현하기 위해 UIContextualAction를 사용하던 도중 UIContextualAction.Handler에서 complitionHandler(true)를 사용하는 예제를 많이 접했습니다.
  • 여기서 complitionHandler를 사용하는 이유가 무엇인지 알기 위해 문서를 찾아 보았습니다.
  • 문서에서는 작업을 수행했는지 여부를 나타내는 Bool값이라고 되어 있습니다.
  • 작업을 수행했으면 true, 어떤 이유로 작업을 수행하지 못했다면 false를 반환한다고 합니다.
  • 하지만 false로 지정하고 실행해 보아도 실행이 문제 없이 되는 것을 확인했습니다.
  • 구글링을 해보았지만 true와 false의 차이점을 찾을 수 없었습니다. 단순히 작업의 수행 결과를 전달해주는 역할을 하는걸까요? 이에 대한 웨더의 조언이 필요합니다!
let shareAction = UIContextualAction(style: .normal, title: nil) { _, _, completeHandeler in
    self.showActivityView(at: indexPath.row)
    completeHandeler(true)
}

3. Name Space 관리

  • 이번 프로젝트에서는 상수 관리를 별도의 타입을 빼서 모아두기 보다는, ViewController 내부에 private한 Nested Types을 두어 관리하도록 해보았는데요.
  • 상수 관리는 정말 다양한 방법이 있는것 같은데, 웨더는 어떤식으로 관리 하시는지 여쭤보고 싶습니다.

4. PersistentManager에 대하여

  • 코어데이터를 관리하는 타입입니다. 여기 내부에 notes라는 배열을 두어 ViewController 3개가 접근할 수 있도록 관리 메소드를 구현하여 구성해두었는데요. 이 부분이 적절한 것인지.. 웨더의 의견을 듣고 싶습니다.

5. NSFetchRequest - returnsObjectsAsFaults 속성은 어떤 역할을 하는 것일까요?

  • 코어데이터를 설계하다가 이런 프로퍼티를 접하게 되었는데요. 어떤 역할을 하는지 찾아보니 내용이 꽤 어렵더라구요.

  • 위 사진은 Faulting 예시입니다. 그리고 공식문서를 보면 true일 경우 fetch를 해서 받아온 객체가 결함이 있는 경우라고 하는 것 같아요. 그럼 false인 경우에는 fetch를 사용한 결과로 생성된 객체가 결함이 없는 경우인 걸까요?
  • 일단 저희끼리 의논해본 결과 false로 하게 된다면 성능적 이점이 있다고 표기가 되어있어서 false로 하였습니다. 그리고 위 예시처럼 관계형 구조 또한 아니기 때문에 false로 해도 상관 없겠다는 판단이 들었어요.
  • 근데.. 이 결함이 있다는 부분이... 잘 이해가 가지 않는데, 조언이 필요합니다!

이번 피드백도 잘 부탁드리겠습니다~ 😁🙏🏻

hoBahk and others added 24 commits February 10, 2022 16:23
- CoreData의 NSManagedObject의 내부 convenience init 제거
- MemoDetailVC 내부 createMemoData 메소드 내부를 CoreData에 맞춰 리팩토링
- MemoListVC memoListInfo 프로퍼티에 didSet 추가
- Constant 타입을 추가하여 하드코딩된 부분 리팩토링
- Navigation Bar 오른쪽 버튼에 action 추가
- SplitVC 내부 memoList 프로퍼티에 didSet 추가
- updateData 메소드 추가
- updateMemoList 파라미터 중 data를 옵셔널하게 수정
- MemoDataManager 내부 update 할때마다 fetch하도록 수정
- MemoDataManager createMemo 메소드 추가
- 코어데이터 관련 Memo 타입 id 프로퍼티 추가
- MemoDataManager의 inserMemoList, setUpMemoList 메서드 추가
- MemoDataManager의 임시방편으로 deleteAll 메서드 추가
- MemoDataManager의 createMemo메서드 updateMemo로 변경
- MemoListCell의 configure 메서드 변경된 타입에 맞춰 리팩터링
- 모든 ViewController를 변경된 타입에 맞춰 전반적인 리팩터링
- fetch시 날짜를 내림차순으로 정렬
- add 버튼을 터치했을 때 데이터와 테이블뷰셀을 추가하지 않던 부분 개선
- detailVC에서 더이상 사용하지 않는 네임스페이스 프로퍼티 제거
- detailVC의 updateMemoData에서 body데이터를 trimming으로 다듬던 부분 제거
- UITableView Delegate 메소드를 추가하여 스와이프 후 Delete 버튼 터치시 코어데이터, memoList를 삭제하도록 구현
- 삭제 이후 MemoDetailViewController 내부 UTextView의 text를 지울 수 있도록 SplitViewController에 기능 추가
- MemoDataManager 내부 memoList의 요소를 삭제할 수 있는 기능 추가
- MemoListCell 내부 configure 메소드 파라미터 타입을 변경하고 메소드 내부 리팩토링
- MemoListViewController 내부 하드코딩 되어있는 문자열을 Constant 상수로 리팩토링
- popoverController를 사용하여 ipad에서도 ActivityViewController가 정상적으로 작동하도록 구현
- 기존 delete 기능을 공유기능과 함께 UIContextualAction을 사용하도록 변경
- UIViewController extension을 통해 showMemoActionSheet, showAlert 메서드 구현
- MemoDetailViewController의 setUpNavigationItem 메서드에 action 추가
- action 메서드 moreViewbuttonTapped 구현
- Array를 extension하여 배열의 요소를 새 인덱스로 이동시켜주는 move 기능을 추가
- MemoDetailViewController 내부 textViewDidChange 메소드에 currentIndex가 0이 아니라면 셀과 데이터를 맨앞으로 이동하도록 로직 추가
- SplitViewController, MemoListViewController 내부에 TableView의 셀을 이동하는 메소드 추가
- MemoDataManager 내부에도 memoList의 요소를 새 인덱스로 이동해주는 기능 추가
- UIFont extension을 통해 커스텀폰트를 다이나믹타입을 지원할 수 있도록 하는 기능 추가
- textView Delegate 메서드(shouldChangeTextIn)를 통해 설정한 폰트 적용
- 메모 데이터를 보여줄 때 UITextView의 폰트를 설정해주는 configureTextStyle 메소드 구현
- text, font, color를 전달받아 NSMutableAttributedString를 생성해주는 attributedText 메소드 추가
- insertCell 메서드에 selectRow 메서드 추가
- moveCell, updateData 메서드에 selectRow 메서드 추가
- deleteCell 메서드에 selectRow 메서드 추가, 삭제된 후 반영되도록 비동기 처리
- select 여부에 따른 셀 label의 textColor 변경
- selectedBackgroundView 추가
- SplitViewController의 tintColor 추가
- UITableView Cell을 스와이프 했을 때 단순 텍스트가 아니라 이미지가 나오도록 UIImage를 추가
- showMemoActionSheet의 shareAction, deleteAction에 titleTextAlignment 설정과 image 설정 추가
- present메서드 호출 시 0으로 하드코딩 된 매직넘버를 zero로 변경
- Array+Extension 필요없는 주석 삭제
- 하드코딩된 문자열을 상수로 선언하여 리팩토링
- 관련 메소드들을 extension과 주석을 활용하여 분리
- 접근제어 추가
- UIContextualAction 클로저 내부에 있는 로직을 별도 메소드로 분리
- 매직넘버를 상수로 리팩토링
- 하드코딩된 문자열을 상수로 리팩토링
- Constant를 private하도록 접근제어 추가
- currentIndex 매직넘버를 상수로 변경
- 메소드 순서 수정 및 MARK 주석 추가
- 메소드 호출부분 줄바꿈 컨벤션 수정
- showActivityViewController 메서드 파라미터 삭제
- 줄바꿈 및 컨벤션 수정
- SplitViewController Mark 주석 추가 및 수정
- MemoDataManager, Memo의 이름을 Notes, Note...로 리네이밍
- moveCell의 selectRow 메서드 animated를 false로 변경
- SplitViewController에서 popoverContoller 프로퍼티 추가 후 viewWillTransition 메서드 override하여 popoverContoller의 위치를 설정하는 로직 구현
- UIVIewController extension의 showActivityViewController 메서드 내부에서 SplitViewController의 popoverController 프로퍼티에 할당하는 코드 추가
Comment on lines 61 to 79
@objc func moreViewbuttonTapped(_ sender: UIBarButtonItem) {
guard let splitVC = self.splitViewController as? SplitViewController else {
return
}
self.showNoteActionSheet(
shareHandler: { _ in
self.showActivityViewController(data: PersistentManager.shared.notes[self.currentIndex].body ?? "")
}, deleteHandler: {_ in
self.showAlert(
message: Constant.deleteWarningMessage,
actionTitle: Constant.deleteAlertActionTitle
) { _ in
splitVC.deleteTableViewCell(
indexPath: IndexPath(row: self.currentIndex, section: .zero)
)
}
}, barButtonItem: sender)
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

함수로 정리되는지 한번 해보시고 [weak self]를 언제 사용하는지 리마인드 한번 더!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

덕분에 weak self에 대해서 다시 복기해보게 되었어요. 감사합니다 😊

Comment on lines +108 to +118
@objc private func keyboardWillShow(_ notification: Notification) {
guard let userInfo = notification.userInfo as NSDictionary?,
var keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
return
}
keyboardFrame = view.convert(keyboardFrame, from: nil)
var contentInset = noteDetailTextView.contentInset
contentInset.bottom = keyboardFrame.size.height
noteDetailTextView.contentInset = contentInset
noteDetailTextView.scrollIndicatorInsets = noteDetailTextView.contentInset
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고차함수로 변경할 수 있나요? (숙제 아님)
온라인 리뷰때 말씀드린대로 고차함수 사용을 익숙하게 하는지 or 익숙하게 사용할 수 있다면 복습하는 형태로 한번 해보세요!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고차함수가 정말 좋네요... 온라인 리뷰때 감사했습니다!!!! 🤩

private func attributedText(_ text: String, font: UIFont, color: UIColor) -> NSMutableAttributedString {
let string = text as NSString
let attributedText = NSMutableAttributedString(string: text)
let range: NSRange = string.range(of: text)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NSRange 말고 그냥 Range 사용해서도 가능할까요?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

음... 구지 155라인에서 변수 생성을 하지 않고
(test as string).range(of: text) 이렇게 해도 되네요!?

Comment on lines 183 to 188
guard currentIndex != .zero else {
return
}
PersistentManager.shared.moveNotes(from: currentIndex, to: .zero)
splitVC.moveTableViewCell(at: currentIndex)
currentIndex = .zero
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

guard와 if문에 대해서 얘기했죠!
꼭 해당 위치에 가드문이 들어가야 한다면 함수로 내용 분리를 하는게 좋을 것 같아요!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네! 이부분 분리하여 개선하였습니다. 덕분에 가독성이 훨씬 좋아진 것 같아요. 감사합니다 🙏🏻

Comment on lines 126 to 144
func deleteCell(indexPath: IndexPath) {
guard let splitVC = self.splitViewController as? SplitViewController else {
return
}
let item = PersistentManager.shared.removeNote(at: indexPath.row)
PersistentManager.shared.delete(item)
splitVC.clearNoteTextView()
tableView.deleteRows(at: [indexPath], with: .fade)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
let index = indexPath.row == .zero ? .zero : indexPath.row - 1
let newindexPath = IndexPath(row: index, section: .zero)
splitVC.present(at: index)
guard self.tableView.numberOfRows(inSection: .zero) != .zero else {
return
}
self.tableView.selectRow(at: newindexPath, animated: true, scrollPosition: .middle)
}
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

performBatchUpdates 한번 써보실래요?!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분은 setEditing 메소드를 오버라이드 해주면서 제거되었습니다.
알려주신 메소드는 궁금해서 찾아보았는데 왜 추천해주셨는지 알것 같네요.
조언 감사드립니다~! 😁

leeari95 and others added 3 commits February 16, 2022 15:20
- moreViewbuttonTapped 내부에 shareHandler, deleteHandler 파라미터 부분을 개행하지 않고 메소드로 분리
- textViewDidChange 내부에 guard문 부터 분리
- selectedIndex 프로퍼티 추가하여 선택된 셀 관리
- setEditing 메서드 override 하여 셀의 편집을 시작하고 종료할 때마다 셀을 선택하도록 구현
- 셀이 추가될 때마다 selectedIndex에 새로운 인덱스 업데이트 하도록 구현
- 셀을 삭제할 때마다 selectedIndex를 변경하도록 기능 추가
- selectedIndex에 didSet을 추가하여 값이 변동될 때 마다 selectRow 메소드 호출
- insertCell 내부 selectRow 메소드 호출하는 부분 제거
- SwiftLint에 제외할 룰 추가 및 불필요한 룰 제거
@SungPyo
Copy link

SungPyo commented Feb 16, 2022

안녕하세요. 웨더! @SungPyo

호박 @hoBahk 아리 @leeari95 입니다! STEP2 요구사항 모두 구현하여 PR 보내드립니다.

혹시 부족한 점이나 놓친 부분이 있다면 번거롭더라도 한번 더 짚어주시면 감사하겠습니다. 🙇🏻‍♀️

안녕하세요 아리 호박~

궁금한 부분이나 문제가 될 법한 부분들 온라인으로 리뷰 완료했고, 코드별 코멘트 달아두었습니다.

확인해주세요!

다음 리뷰때 봬요 :)

고민했던 점

1. 코어데이터를 관리하는 매니저 타입 구현

  • 메모의 CRUD를 구현 및 View에 보여줄 데이터를 관리할 수 있는 PersistentManager 구현
  • fetch를 할 때 Predicate, Sort 등을 유연하게 할 수 있도록 파라미터 별도 구현

2. 사용자 친화적인 UI를 구현

  • 최근에 작성, 수정하였던 메모가 상단으로 올라올 수 있도록 메모 리스트의 정렬을 날짜를 기준으로 내림차순으로 정렬
  • 어떤 메모를 선택해서 작성하고 있는지 한눈에 보기 편하도록 작성하고 있는 Cell을 계속 Select 되도록 구현
  • 작성하는 도중 날짜가 업데이트 되면, 상단으로 이동하면서 Select도 상단으로 이동.
  • 메모를 추가했을 때 추가한 새로운 메모를 Select 되도록 구현
  • 메모를 삭제했을 때, 삭제한 부분 이후 메모를 자동으로 Select 되도록 구현
  • 스와이프 및 더보기 버튼 터치시 보여지는 액션버튼이 단순 텍스트가 아닌 아이콘이 표기되도록 구현
  • Share를 터치하여 UIActivityViewController가 present 되었을 때 화면 회전 시에도 컨트롤러가 중앙에 계속 위치할 수 있도록 구현

3. 제목과 본문의 폰트를 다르게 하여 구분하는 기능 구현

  • AttributtedString을 사용하여 TextView의 제목과 본문의 폰트를 다르게 하여 사용자가 보기에 편하도록 구현
  • textView의 delegate 메서드(shouldChangeTextIn)와 textView의 typingAttributes 프로퍼티를 사용하여 입력중에도 제목과 본문에 맞는 폰트가 적용되도록 구현

궁금했던 것 / 조언이 필요한 점

1. 본문에 title에서 줄바꿈하면 커서가 커지는 현상

  • 본문 맨 마지막 부분에서 편집할 때는 이상이 없는데, 제목 부분에서 줄바꿈을 하여 부분 편집을 할 경우 Text의 커서가 커지는 버그를 발견했습니다.
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    let currentText = textView.text as NSString
    let titleRange = currentText.range(of: Constant.lineBreak.description)
    if titleRange.location < range.location {
        textView.typingAttributes = Constant.bodyAttributes
    } else {
        textView.typingAttributes = Constant.headerAttributes
    }
    return true
}
  • 엔터를 눌러 줄바꿈을 했을 경우를 디버깅 해본 결과, titleRange와 파라미터로 전달받는 shouldChangeTextIn range의 location이 같을 경우 else문을 타고 textView의 typingAttributes을 headerAttributes로 할당하는 부분 때문에 해당 문제가 발생하는 것 같습니다.
  • 저기에 어떤 조건을 추가해야 해당 방법을 해결할 수 있을지 잘 떠오르지 않기도 하고, 줄바꿈 이후 텍스트를 작성한 이후에는 정상적으로 body 스타일로 잘 작성되는 상황이라... 둘이서 의논한 결과 '큰 문제는 아니다' 라는 판단을 내렸는데요.
  • 이에 대한 웨더의 의견이 궁금합니다.

textDidChanged를 한번 확인해 보세요!

2. UIContextualAction의 handler의 completeHandeler는 어떤 역할을 하는 것일까요?

  • Swipe액션을 구현하기 위해 UIContextualAction를 사용하던 도중 UIContextualAction.Handler에서 complitionHandler(true)를 사용하는 예제를 많이 접했습니다.
  • 여기서 complitionHandler를 사용하는 이유가 무엇인지 알기 위해 문서를 찾아 보았습니다.
  • 문서에서는 작업을 수행했는지 여부를 나타내는 Bool값이라고 되어 있습니다.
  • 작업을 수행했으면 true, 어떤 이유로 작업을 수행하지 못했다면 false를 반환한다고 합니다.
  • 하지만 false로 지정하고 실행해 보아도 실행이 문제 없이 되는 것을 확인했습니다.
  • 구글링을 해보았지만 true와 false의 차이점을 찾을 수 없었습니다. 단순히 작업의 수행 결과를 전달해주는 역할을 하는걸까요? 이에 대한 웨더의 조언이 필요합니다!

iOS 내부에서 사용하는 context의 상태를 reset하기 위해서 사용한다고 합니다.

let shareAction = UIContextualAction(style: .normal, title: nil) { _, _, completeHandeler in
    self.showActivityView(at: indexPath.row)
    completeHandeler(true)
}

3. Name Space 관리

  • 이번 프로젝트에서는 상수 관리를 별도의 타입을 빼서 모아두기 보다는, ViewController 내부에 private한 Nested Types을 두어 관리하도록 해보았는데요.
  • 상수 관리는 정말 다양한 방법이 있는것 같은데, 웨더는 어떤식으로 관리 하시는지 여쭤보고 싶습니다.

정답은 없지만 전역변수로 사용하거나 하신것 처럼 Enum이나 Struct에 따로 관리하셔도 무관합니다.

4. PersistentManager에 대하여

  • 코어데이터를 관리하는 타입입니다. 여기 내부에 notes라는 배열을 두어 ViewController 3개가 접근할 수 있도록 관리 메소드를 구현하여 구성해두었는데요. 이 부분이 적절한 것인지.. 웨더의 의견을 듣고 싶습니다.

현재 상태에서는 큰 문제가 된다고 생각하진 않아요.

5. NSFetchRequest - returnsObjectsAsFaults 속성은 어떤 역할을 하는 것일까요?

  • 코어데이터를 설계하다가 이런 프로퍼티를 접하게 되었는데요. 어떤 역할을 하는지 찾아보니 내용이 꽤 어렵더라구요.

객체의 상태에 문제가 있는지 체크하는 프로퍼티로 나와있는데 정확한 역할은 저도 잘... ^^:

  • 위 사진은 Faulting 예시입니다. 그리고 공식문서를 보면 true일 경우 fetch를 해서 받아온 객체가 결함이 있는 경우라고 하는 것 같아요. 그럼 false인 경우에는 fetch를 사용한 결과로 생성된 객체가 결함이 없는 경우인 걸까요?
  • 일단 저희끼리 의논해본 결과 false로 하게 된다면 성능적 이점이 있다고 표기가 되어있어서 false로 하였습니다. 그리고 위 예시처럼 관계형 구조 또한 아니기 때문에 false로 해도 상관 없겠다는 판단이 들었어요.
  • 근데.. 이 결함이 있다는 부분이... 잘 이해가 가지 않는데, 조언이 필요합니다!

이번 피드백도 잘 부탁드리겠습니다~ 😁🙏🏻

@SungPyo SungPyo merged commit 8adf210 into yagom-academy:4_leeari95 Feb 16, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants