-
210422 - TILTIL/2021 2021. 4. 23. 03:19
CollectionView의 item이 하나만 선택되도록 하기
이전에 collectionView에서 발생한 문제를 해결하기 위해서 가장 필요한 부분이 collectionView(_:didSelectItemAt:) 에서 선택한 item 말고 나머지 item의 상태를 바꿀 수 있어야 했다.
그래서 해결을 한 방법은
이렇게 selectedItemIndex를 생성하고 for 반복문을 돌면서 index와 비교해서 같은 것은 선택된 것이고 아닌 것은 선택되지 않은 것으로 해서 상태를 바꿔주면 됐다.
이렇게 하니 collectionView(_:didDeselectItemAt:)를 사용할 필요가 없어졌다.
기억해야 할 점은 이 코드를 collectionView(_:cellForItemAt:)에도 추가시켜야 화면에 보이지 않는 item이 나타날 때 상황에 맞는 화면이 나오게 된다.
잘 해결했지만 한 가지 문제가 발생했다.
바로 선택이 해제될 때 애니메이션의 적용이었는데 왜 그런지 알 수는 없지만 애니메이션을 적용하면 2번째 또는 3번째 셀부터 애니메이션 적용이 안됐다.
안될 거면 다 안되던가 해야 하는데.... item들이 따로 만들어진 것도 아닌데 왜 이런 상황이 발생한지는 모르지만
일단 아쉬운 대로 선택이 해제가 될 때의 애니메이션은 적용하지 않기로 했다.
서버에서 데이터 가져오기
DB에서 원하는 정보를 가져오려고 하는데 되도록 한 화면에서 한 번의 네트워크 요청만을 보내고 싶었다
하지만 가져와야 하는 정보가 많았고 nickname이라는 정보를 가져오기 위해서 아래와 같이 타고 타고 한참을 들어가야 했다.
Pet -> History -> FamilyMember -> User.Nickname
그래도 뭐 그냥 하면 되겠지 하고 ApplicationDbcontext를 parameter로 보내면서 데이터를 연결했는데...
반가워ㅜㅜ
DataReader에 대해서 이해하고 이를 해결하고 넘어가고 싶어서 검색해보며 공부를 해보았지만...
C#을 필요한 문법만을 배운 탓에 이해가 가지도 않고 어느 부분이 문제인지도 알 수 없었다.
그래서 지금은 프로젝트를 마무리하는 게 중요했기 때문에 많은 시간을 할애하지는 못하고 다른 방식으로 접근해야 했다.
바로 한 번의 네트워크 요청이 아닌 두 번을 보내는 것 ㅠㅠ
그래서 Pet -> History 이렇게 얻어오고 History에 있는 FamilyMemberId를 파라미터로 보내
FamilyMemberId -> User.Nickname을 얻어오도록 만들었다.
프로젝트를 마무리하면 한 번에 하거나 더 효율적인 방식을 공부해 봐야겠다.
그리고 꼭 dataReader도 공부하자!!
Git
git 공부는 이제 오늘로 끝!!
대부분의 기능들에 이해는 끝냈다. 프로젝트를 진행하며 꾸준히 배운 개념들을 사용해봐야겠다.
분명 이 많은 기능 중에 사용하지 않는 기능도 있을 테고 그러면 까먹겠지만...
그 기능을 쓸 일이 있다면 다시 돌아와서 공부하고 가지 뭐..
Git으로 협업해보기
- Github에 remote repo를 만들고 Setting -> Manage access -> 아이디 입력
- 그러면 초대 메일이 가고 승인해주면 된다.
- pull을 하지 않고 같은 부분을 수정하면 error가 발생한다.
- 그럼 pull을 하면?? merge conflict가 난다. 그럼 고치면 된다!
- 이렇게 합친 commit을 merge commit이라고 한다.
Fetch란??
- master
- local 저장소의 master branch
- origin/master
- remote의 master branch
- 원격에서 마지막으로 가져온 master
- 원격 저장소에 있는 데이터를 가져오지만 지역 저장소에는 merge 되지 않았다.
- origin/master애 merge를 하면 master가 따라가게 된다.
- pull은 fetch + merge라고 생각하면 된다!
- fetch의 활용법은 fetch를 하고 test brach를 딴 다음 merge 해보고 그 이후 master를 merge 하는 방식으로 활용 가능하다.
Pull request
- git이 제공하는 기능이 아니라 git hosting service( ex] git hub)가 제공하는 기능이다.
- 오픈소스는 pull은 누구나 가능하지만 push는 아무나 못한다.
- 당연! 아무나 막 하면 엉망진창
- 오픈소스에서 내가 개발한 코드를 pull 해가라고 요청하는 것
- 내가 이러한 기능을 추가했는데 이거 pull해가요~~
- 다른 오픈소스를 clone 하는 게 아니라 fork 한다.
- Fork??
- 내가 만들지 않은 다른 저장소를 내 거인 것처럼 가져오겠다.
- Fork하면 내이름/저장소이름 으로 저장소가 생긴다.
- 그럼 이 저장소를 clone해서 가져온다.
- 그리고 이것의 코드를 수정하고 push하면 fork한 저장소에 올라가게 된다.
- Pull request와 Compare 버튼이 있다
- compare는 말 그대로 original과 fork를 비교해준다.
- pull request를 보내면 원작자에게 뜨게 된다.
- Merge pull request를 해주면 original에 추가된다.
Reset vs Revert
- HEAD의 개념
- Working dir를 그 버전의 상태로 바꾸겠다.
- Working dir는 그 버전을 기반으로 수정되고 있다.
- CheckOut
- Head를 바꾼다.
- Head -> master -> version3 ==> Head -> version2
- master는 바뀌지 않았다.
- head가 branch를 가리키지 않는 것을 Detatched Head라고 한다.
- version을 가리킨다던지 그런 상황
- 꼭 마지막에 branch로 돌아오도록 하자
- Reset
- Head가 brach를 가리키고 있을 때 그 branch가 가리키는 version을 바꾼다.
- Head -> master -> version3 ==> Head -> master -> version2
- version3는 삭제된 게 아니다 가리키고 있는 게 하나도 없으므로 안 보이는 것뿐
- reset된 version의 CommitId를 알고 있다면 다시 살릴 수도 있다.
- git은 웬만하면 version을 지우지 않는다.
- Reset의 Hard, Soft, Mixed
- working dir -> stage area -> repository
- 일단 3개 모두 다 brach가 가리키는 version은 바뀌게 된다.
- Soft
- working dir, stage area는 그대로 남아있다.
- repo만 바뀌게 된다.
- version2, version3를 모두 추가했는데 version2,3의 내용을 합한 새로운 version4를 만들고 싶다면!!
- soft version1로 돌아가고 version4로 commit push하면 된다.
- Mixed
- working dir만 그대로 남아있고
- stage area, repo이 바뀌게 된다.
- version3까지 했는데 커밋을 새로 하고 싶다면
- mixed version2로 돌아가고 새로 commit 해주면 된다.
- Hard
- working dir, stage area, repo 모두 다 바뀐다.
- 주로 예전으로 다 돌리고 싶을 때 사용한다.
- Revert
- 실수를 해서 돌아가려고 하는데 그 실수마저 기록한 새 버전을 하고 싶다!
- 일단 version1으로 reset하고 싶다면 version1으로 reset
- version1으로 revert하고 싶다면 version2를 revert!!
- 이 차이는 중요하다.
- 그리고 revert의 주의점은 또 있다.
- 취소할 내용을 수정해버리고 revert로 그 부분을 revert 하려고 하면 충돌이 난다.
- 취소할 건데 수정해서 뭘 취소해야 할지 몰라 너가 직접 수정해줘 conflict
- 3WayMerge
Cherry-Pick
- 특정한 commit만 pick 해서 다른 version에 붙여 새로운 version을 만드는 것!
- working copy의 전체를 가져오는 게 아니라 해당 변화만을 가져오는 것이다.
- 가져오고 싶은 working copy에서 진행해야 한다.
- 3 way merge를 통해 진행되게 된다.
- 3개를 놓고 비교하며 진행돼서 특정 변화만을 가져와서 변하게 되는 것이다.
- Conflict가 발생한다면 지금까지 발생한 conflict들과 똑같다. 우리가 정해주기만 하면 된다.
Rebase
- master version1의 base를 other Branch로 바꿔서 두 가지를 하나의 가지로 나타내고 싶다.
- 즉 우리의 나눠진 log를 하나의 log로 바꾸고 싶다.
- base
- 두 branch의 공통조상인 base를 알아야 한다.
- 이동시킬 branch에서 작업해야 한다.
- HEAD는 base가 될 branch를 가리키게 된다.
- Rebase 하면 하나하나 한 단계씩 vsrsion을 하나씩 생성해가며 올려나간다.
- 한 번에 몽땅 옮기지 않는다.
- Merge를 하게 되면 두 개의 가지가 나뉘어있다가 하나의 가지로 합치는 모습이지만 rebase는 하나의 가지로만 쭉 가는 모습이 된다.
- 이러면 log를 보는 입장에서 보기 좋게 된다.
- fetch를 활용해서 할 수 있다.
- 기억해야 하는 것!!
- 이동할 버전을 remote에 push하기 전에 rebase를 해야 한다. push를 하고 난 후라면 하지 말자.
- merge를 한것과 rebase를 한것의 결과는 같아야 한다.
공부해볼 것
- Code review
- Gerrit - google에서 만든 도구
- 투표 같은 느낌
728x90'TIL > 2021' 카테고리의 다른 글
210426 - TIL (0) 2021.04.28 210425 - TIL (0) 2021.04.26 210421 - TIL (0) 2021.04.22 210419 - TIL (0) 2021.04.20 210416 - TIL (0) 2021.04.16