[MultiIt Backend] |
서론
오늘은 팀프로젝트 위주가 아닌 강의를 듣는 형식이 진행되었다. 아침마다 각 팀의 진행정도에 대해 보고, 생각보다 빠른 진행 사항을 가진 팀 그렇지 못한 팀을 보고 우리 팀정도면 어느정도 괜찮은 속도로 진행이 되는것 같다고 느껴졌다. 전체적으로 오랜만에 수업을 들으니 좀 더 집중을 할 수 있었고, 내가 아는 부분에 대해 설명을 듣거나, 의도치않게 실습 설명중 에러가 날때는 우리 프로젝트를 위한 기초설정을 하는 듯 시간을 분배할려고 많이 노력했다. 금요일이다보니, 전체적으로 하루동안 무언갈 많이 했다는 느낌보다는 좀 쉬면서 넘어간거 같다.. 실제로도 밥먹고 정처기 공부좀 할려고 했는데 한시간만 잔다는게 자고 일어나니까.. 다음날이였던건 안비밀 ㅎㅎ(그래서 원래 어제는 바로 자기전에 TIL을 작성할려는걸 못했음 ㅠㅠ) 그렇게 자고 일어나니까 피곤했나보구나.. 싶기도 하면서 좀 더 체력을 길러야겠다는 생각도 좀 들었다. 내가 가고자하는 진로가 장시간동안 컴퓨터 앞에 앉아 머리를 쓰며, 요구사항에 맞게 웹 시스템을 만들어내는 것이다 보니 그만큼 앉아서 집중할 수 있는 능력과 체력이 필요하다고 생각이 들었고, 이를 위해 1시간씩이라도 하루에 가볍게 운동을 해 체력을 좀 길러야겠다는 생각이 들었다. 지금은 너무 체력이 없어서 ㅠㅠ 금방 지쳐 남는시간에 더 무언갈 하지 못하는 것 같다.
오늘 하루 진행 내용
전체적으로 강의를 들으며 댓글기능을 Restful API를 통해 구현하는 것을 배웠다. 그 후 팀원 중 우리의 db 관계?를 통한 jpa 구현 부분 대해 헷갈려하는 팀원이 있어 erd를 보며 db 연결관계(예를 들어, 회원 클래스에선 피드가 외래키로 연관되어있을 필요없고<회원은 피드를 작성하는 거지, 회원을 생성할때 피드에 대한 정보 필요없음..> 피드에서 회원의 PK를 필요 하다.. 이런것?)를 한번씩 설명하며 이야기하던 중 그룹에 가입한 회원을 저장할 테이블을 설정안 한것을 확인하고 그룹 가입 회원 테이블을 ERD에 추가 했다. 그 후 개발환경 세팅과 협업을 위한 툴을 Git으로 정해 organizations을 생성해 팀원들을 초대 후 모두에게 owner 권한을 부여하고 (어처피 다같이 모듈을 나눠 개발할 것이니 이게 편하다 생각함)
gitIgnore 및 gradle 설정과 기본 디렉터리 구조를 생성해 생성된 organizations에 따로 프로젝트용 repository를 생성 후 push해놔 기본적인 프로젝트 개발 환경을 세팅했다. 그 후 남는 시간동안 jpa를 어떤식으로 해야할지 어려워하는 팀원을 위해 기본 베이스를 쌓을 수 있도록 화면공유 후 함께 erd를 보며 group 테이블을 클래스로 만드는 과정을 진행했다.
<진행 사항>
댓글 기능 구현 학습, erd 테이블 추가 및 정리, 1. Git & 개발 & 프로젝트 세팅 2. jpa 연습
느낀점
전반적으로 db 설계 시 정확히 관계 차수나 속성, 외래키, 정규화 등을 정확히 이야기하고 정하는 것이 중요하다고 느껴졌다. 실제로 우리 팀은 정해진 기능을 기반으로 db에 대해 깊게 이야기하기 보다 기능을 보며 생각하며 따로 db 정의서 같은걸 작성하지 않고 바로 erd를 작성하였다. 그러다보니 데이터베이스에서 실제 구현을 위해 어떤식으로 해야할지, 즉 관계를 어떻게 맺어야할 지 헷갈려하는 팀원이 있고 또한 실제로도 우리가 생각한 기능을 구현하기 위한 테이블이 빠지기도 했던 것을 보고 처음에 설계 시 데이터베이스를 꼼꼼히 설계해야 되겠다고 느꼈다. 또한 아무래도 프로젝트 기간이 짧고, 교육과정 자체가 길지 않으니, 이를 어렵게 느끼는 팀원들과 다른 팀들을 보고 조금 더 경험이 있는 내가 더 찾아보고 더 공부해 팀원들이 실제 개발과정에서 막히는 부분이 있다면 이를 배우고, 알던 지식을 통해 진행이 원할하게 할 수 있도록 노력해야겠다고 느껴졌다. 마지막으로 혼자서 프로젝트를 위한 깃을 생성하거나, 다른 사람이 organizations 생성해 거기에 초대만 해봤지 내가 협업을 위한 깃을 주도적으로 만들고 프로젝트 초기 세팅을 하다보니, 깃을 어떻게 해야 잘 관리 할 수 있을지 생각이 들었다. 브랜치 전략을 좀 공부해 최대한 효율적이고, 전반적으로 깃 사용법을 정리 후 팀원들에게 공유해 깃이라는 협업툴을 잘 활용해 실제 구현 기간동안 모듈별로 잘 개발될 수 있도록 이끌어야겠다고 생각이 들었다.
배운점
db 설계의 중요성과 명세화의 필요성에 대해 배울 수 있었다. 또한 git의 기본 디렉터리&패키지 구조를 생성하며 빈 폴더는 올라갈 수 없어, 특정 깃 명령어를 이용하거나 파일을 생성한채 올려야한다는 정보를 얻을 수 있었고 gitignore 설정시 편리하게 정할 수 있는 사이트에 대해 알 수 있었다. 또한 외래키 관계를 jpa를 통해 구현할 때 joincolum 시 fetch 설정에 대해 까먹었었는데 한번 더 보며 정리할 수 있었다.
+ 개념 & 용어
git 빈 디렉터리 add 하는 법 (내용이 없는 디렉터리는 git add 할 수 없음)
-> 팀 프로젝트 패키지 & 폴더 구조로 만든 폴더를 Intellj에서 Commit, Push을 해도
Git Repository에 보이지 않아 이를 찾아봄.
= Git은 파일 단위로 관리하고 디렉터리 정보는 해당 파일에 연관된 정보로 해석된다.
즉 폴더 안에 파일이 없을 경우 Commit이 불가능하다는 것을 알 수 있었다.
<해결 방법>
1. 내용없는 파일을 추가
추가하고자 하는 빈 폴더에 .keep 또는 .gitkeep 파일 생성 (= 임시 숨김 파일)
touch .keep
touch .gitkeep
2. .gitignore에서 .keep 파일 제외
.gitignore에서 .keep 파일이 있다면, git에서 .keep 파일을 무시하고 add해줘 즉 push되지 않는다.
이를 방지하기 위해 .gitignore 파일에서 설정을 추가 해줘야 한다. -> !는 아니다니, 무시되지 않음
![삽입할 빈 디렉터리 명]/.keep
3. Commit & push
이 후 commit -> push 해주면 git repository에 .keep 파일과 함께 폴더가 생성된 것을 확인할 수 있다.
-> 내가 실제 우리 프로젝트에 채택한 방법
: 나는 이 방법도 repository에 우리 프로젝트와 숨김 파일이여도 관련없는 파일이 들어가는 것이 싫어 그냥 각 폴더에 추후에 만들어야하는 파일들을 빈상태로 만들어 push해 주었다. (ex. UserService...이런 것)
결론 : 실제 빈 폴더를 Git Repository에 저장할 수 없다. 그래서 빈 폴더 삽입을 위해서는 파일 단위로 처리하는 Git 구조 아래 내용이 없는 파일 추가해 해결할 수 있다.
즉시 로딩 (FetchType.EAGER) -> 조인을 통해 쿼리가 한번에 나가 함께 조회함
: 연관된 엔티티를 즉시 조회, 하이버네이트는 가능하면 SQL 조인을 사용해 한번에 조회한다.
즉 대부분의 비지니스 로직에서 해당 테이블을 조회 시 참조 테이블(외래키로 연결된..)을 같이 불러오는게 이득일때 사용하면 좋음
= 연관 관계에 있는 Entity 늘 가져온다.
ex) 댓글을 보기위해선 무저건 게시글 내용이 같이 있어야 할 경우 (피드와 같이 왼쪽은 내용, 오른쪽은 댓글)
<Class Comment>
@ManyToOne(fetch = FetchType.EAGER)
private Post post; //-> (댓글이 게시글을 가져와야할 때..)
//현재- 댓글 Many / 필요 - 게시판 One -> 댓글은 무저건 하나의 게시글에 포함되 작성됨
지연 로딩 (FetchType.LAZY) -> 요청할 떄 사용되니, 실제 부를땐 SELECT 쿼리가 따로따로 2번 나감
= 네트워크를 2번타서 조회가 이루어져야해서 손해
: 연관된 엔티티를 프록시로 조회, 프록시를 실제 사용할때 초기화하면서 데이터 베이스를 조회한다.
즉 참조 테이블이 필요할때만 조회하는 것이 이득일 때 사용하면 좋음
= 연관 관계에 있는 Entity 늘 가져오지 않고, getter로 접근할 때 가져온다.
ex) 게시글에서 댓글은 댓글보기를 클릭해야만 볼 수 있을 경우 (비지니스 로직에 거의 포함 안됨)
<Class Post>
@OneToMany(fetch = FetchType.LAZY)
private Comment comment; //-> (댓글이 게시글을 가져와야할 때..)
//현재-게시판 One / 필요-댓글 Many -> 게시판에서 댓글보기를 누를 경우에만 댓글 리스트 반환할 때
+ ManyToOne의 기본 FetchType은 EAGER
+ OneToMany의 기본 FetchType은 LAZY
'기록 > TIL' 카테고리의 다른 글
2023/04/18 TIL (0) | 2023.04.19 |
---|---|
2023/04/17 TIL (3) | 2023.04.18 |
2023/04/13 TIL (0) | 2023.04.14 |
2023/04/12 TIL (2) | 2023.04.13 |
2023/04/11 TIL (0) | 2023.04.12 |