인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 강좌를 완강한지는 약 3달정도 됐다. (2021.04. ~ 2021.08. 초반)
그럼에도 후기를 지금 쓰는 이유는 1회독할 때의 느낌과 2회독할 때의 느낌이 다르기도 했고,
1회독했을 때는 완전 초보자였었기 때문에 좀 더 공부한 후에 보다 객관적으로 후기를 남기고 싶었기 때문이다.
(사실 지금도 초보자이지만 ㅎㅎ)
https://www.inflearn.com/course/ORM-JPA-Basic#
현재 나는 자바 ORM 표준 JPA 프로그래밍 - 기본편강의 (이하 JPA 기본편)를 1회독하고 2회독을 진행 중이며,
추가적인 공부와 더불어 개인프로젝트를 진행하고 있다.
JPA 기본편을 1회독할 때는 JPA 활용편 1편을 병행하면서 들었으며,
이후 개인프로젝트를 진행하면서 기본편 2회독을 진행하고 있다.
강의를 시작하기 전에 나의 상태
스프링 입문 강의로 김영한님을 처음 접했었던 나는,
김영한님께서 java를 이용한 스프링 프레임워크를 이용하여 db와 소통하는 jpa 기술을 가르치신다는 걸 알게 된 후, JPA 기본편을 수강신청하였다.
그 때 당시 내 실력은 스프링 입문편, 스프링 기본편으로 익힌 스프링에 대한 초보적인 이해,
그리고 SQL과 JAVA에 대한 기본기 정도였다.
단, 프로그래밍/알고리즘에 대한 이해도는 컴퓨터공학부 전공에, 백준 문제들을 꽤 많이 푼 상태였어서 어느정도 있는 상태였다.
자바 8에는 익숙하지 않은 상황이었다.
다행히 김영한님께서 자바8(스트림, 람다 등)을 쓰실 때, 사용법을 어느 정도 알려주시면서 강의를 하셨고, 또 스스로 구글링하면서 공부했기 때문에 큰 문제는 없었던 듯하다.
DB 지식은 JOIN문, PK(기본키), FK(외래키) 지식을 알고 강의를 들으면 좋다.
모르면 강의 내용 흡수에 힘들 수 있다.
다만, 나는 모르는 상태로 강의를 수강하였는데, 그렇기 때문에 추가적으로 구글링하고 책을 읽는 등의 노력을 했어야 했고, 그로 인해 진도가 빠르게 나아가지 않았다.
(4달 정도 소요됨. 그래도 꼭꼭 씹어먹을 수 있도록 노력하여 오래 걸린 것이기 때문에 후회는 없다~)
수강 전, DB에 대한 지식은 다다익선인 듯.
1회독을 하면서
나는 개인적으로 JPA를 배우면 내가 어떻게 될 수 있는지, 그리고 어떻게 활용할 수 있는지 궁금했기 때문에, 그리고 무엇보다도, 활용을 하는 게 재밌어보였기 때문에(ㅎㅎㅎㅎ...) 활용편을 수강하면서 모르는 내용이 나오면 JPA 기본편을 공부하는 야생형 방식으로 공부를 시작했다.
활용편에서 JPA를 이용할 때, SQL 쿼리문을 사용하지 않고 em.persist로 repository에 save하는 모습에 인상깊어 잠시 기본편으로 가서 영속성 컨텍스트를 공부했다.
활용편에서 연관관계가 단방향, 양방향일 때 PK, FK, 그리고 연관관계의 주인 내용을 얘기할 때, 무슨 소리인지 몰라 기본편으로 가서 엔티티 매핑, 연관관계 기초 파트를 공부했다.
FK가 있는 곳을 연관관계 주인으로 해주면 된다는 사실을 깨닫고 열심히 코딩도 해본 기억이 난다.
그 외에 cascade, orphanremoval, 페이징 등의 내용도 학습하였다.
JPQL 부분은 활용편 1편에 많이 나오지는 않아서 이 부분은 기본편으로만 공부했는데, 김영한님의 전달력이 좋으셔서 쑥쑥 이해하고 넘어갔다.
1회독을 마치고 든 생각은,
확실히 활용편과 기본편을 병행하면서 수강하는 것이 시너지효과가 좋다는 것이다.
김영한님의 전달력이 워낙 좋으셔서 개념 이해 자체에 문제되진 않을 것이며,
강의를 들으면서 코딩을 하기 때문에 개념을 어떻게 적용하는지도 기본편에서 익힐 수 있었다.
적용방법을 활용편 강의에서 응용하기 때문에 복습효과가 시너지를 내는 효과를 받을 수 있었다.
다만, 활용편에 많이 나오지 않은 부분인 JPQL 후반부 부분은, 아무래도 기본적인 내용만 코딩으로 익히고, 실전에서 어떻게 쓰이는지 응용하지 않았기 때문에 크게 감이 오진 않았다.
개인프로젝트 && 2회독을 하면서
이후 8월 중순부터 개인프로젝트를 진행하기 시작했다.
학교 알고리즘 그룹스터디원들의 공간을 만들고 싶어 회원+게시판+이것저것 기능을 만들어보기 위해 프로젝트를 진행하고 있다.
https://github.com/kth990303/BOJStudyList
강의를 들으면서 코딩할 때와,
내가 직접 야생에 던져진 상태에서 코딩할 때의 느낌은 꽤나 달랐다.
강의를 들을 땐, 비록 야생형이긴 하지만 김영한님께서 보조해주시면서 야생에서 사냥을 도와주신 후 고기를 썰어주시는 느낌이라면, 개인프로젝트는 아예 야생에서 내가 스스로 시작해보는 느낌이었다.
다행히 김영한님께서 사냥 스킬들을 여러개 알려주셔서 사냥에 대한 두려움은 없어진, 그런 느낌이었다.
이렇게 진행하면 될 것 같다. 이렇게 하면 어떻게 되지? 와 같이, 내 프로젝트를 진행하는 것이다보니 내 스스로 고민하는 시간이 많아지면서, 기본기의 중요성을 깨닫게 되는 순간인 것 같다.
+) 무엇보다 개인프로젝트를 하면서 실력이 팍팍 느는 것 같다. 모두 개인프로젝트 하세요!!
이러한 생각이 들자, 기본 개념도 다잡을 겸, 가볍게 기본편 복습을 해보자는 결론을 내리게 됐다.
2회독을 하면서 느낀 점은, 예상과는 다르게 1회독 때 배웠던 내용임에도 불구하고 꽤나 배울 점이 많다는 것이었다.
2회독 + 개인프로젝트 장점은 요약하자면 아래와 같다.
- 개념을 전체적으로 알고 있는 상태이므로, 개념-개념 연결을 1회독 때보다 훨씬 잘 연결지을 수 있음.
- 프로젝트를 하면서 어디 파트가 중요한지 아닌지 파악하면서 더 꼼꼼하게 들을 수 있음.
- 프로젝트를 하면서 겪은 기억들이 강의와 연결되면서 더 많이 깨닫게 됨.
영속성컨텍스트와 1차캐시 관련 내용은 실전에서 어노테이션들을 많이 쓰다보니 좀 까먹은 상태였다.
persist, merge가 어떤 원리로 이루어지는지 두루뭉실한 상태로 jpa를 쓰고 있었다는 점.
flush가 언제 일어나는지 다시 한 번 상기하면서, 2회독이다보니 JPA의 즉시로딩과 지연로딩에도 영속성컨텍스트가 한몫한다는 사실을 연관지을 수 있었다. 1회독 때에는 즉시로딩, 지연로딩 개념을 몰랐기 때문에 보이지 않았던 것이 2회독 때에는 보인 것이다. 아는 만큼 보인다!
그리고 현재 연관관계 매핑 쪽을 2회독 중인데,
개인프로젝트와 병행하면서, 그리고 개념을 1회독한 상태에서 강의를 다시 들으니, 김영한님께서 말씀해주시는 내용에 공감가는 부분도 많아졌다.
public void updateMember(final Post post){
posts.add(post);
}
개인프로젝트에서 Member(회원) - Post(게시글) 연관관계를 단방향에서 양방향으로 바꿔주었을 때, Post가 연관관계 주인임에도 불구하고 주인이 아닌 Member에 위처럼 코드를 짰었는데, DB에 값이 안들어가서 Post에도 update(this)를 해주었던 적이 있다.
이후에 강의를 들으면서 김영한님께서 "이 쪽 개념을 까먹으면 연관관계 주인이 아닌 곳에 add해놓고 어? DB에 값이 안들어가요!! 라고 할 수도 있어요" 라고 하신 부분에 저 때의 기억이 나서 크게 공감갔고, 덕분에 이 쪽 개념이 기억에 콱 박히게 됐다.
만약 개인프로젝트를 하지 않았거나, 1회독 상태였다면 "어 그냥 중요한가보다~ 알아둬야지~" 하고 넘어가서 막상 실전엔 꽤나 당황할 수도 있었는데, 어느정도 개념이 쌓인 뒤에 보니까 강의내용을 더 많이 흡수할 수 있었다.
비록 기본중의 기본인 JPA 기본편 강의이지만, 배우는 양이 꽤나 방대하다.
그런 만큼, 1회독 때에는 이해했다고 생각하지만, 회독하면 할수록 내가 어떤 부분이 부족했는지, 그리고 JPA는 정말 양이 방대하고 배울 점이 많다는 것을 매번 느끼게 된다.
앞으로도 꾸준히 공부하면서 JPA와 Database에 대한 지식을 쌓아가며 개인프로젝트에 그 개념을 녹여낼 수 있도록 꾸준히 노력할 예정이다 ㅎㅎ
'JAVA > JPA 학습기록' 카테고리의 다른 글
[JPA] 양방향 연관관계에서 JPA 내부 작동 원리_영속성 컨텍스트의 이해 (0) | 2022.06.23 |
---|---|
[H2] 맥에서 H2 database 실행하기 (feat. zsh: permission denied: ./h2.sh) (4) | 2022.06.15 |
[JPA] JPQL 조건식_ Case When, COALESCE (0) | 2021.07.07 |
[JPA] JPA에서 SQL 쿼리를 작성하는 방법_ JPQL (0) | 2021.06.09 |
[JPA] 값 타입 컬렉션, 임베디드 타입 (0) | 2021.05.26 |