- Spring Boot, DB, JPA, Redis 학습을 위한 토이 프로젝트
- 소장 도서에서의 학습 사항들을 적용시키면서 진행합니다.
- 스프링 부트 핵심 가이드 - 장정우
- 자바 ORM 표준 JPA 프로그래밍 - 김영한
- Real MySQL 8.0 - 백은빈, 이성욱
- 스프링 시큐리티 인 액션 - 로렌티우 스필카
- 가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 알렉스 쉬
- 23년 3월 백엔드 학습을 시작하며 CS, JAVA, DB 공부를 시작했습니다.
- 첫번째 Spring Project이기에 부족한점이 많지만 실무 이전에 경험할 수 있는 최대한의 경험을 먼저 하고자 합니다.
- 개발 요구 사항, 트러블 슈팅 등의 사항은 WIKI에 기록합니다.
- -> 깃헙 WIKI 바로가기
- 간단한 기능들 구현
- 게시판 CRUD
- 사진 업로드
- 댓글
- 게시글 조회수
- Local Redis 찍먹
- 구현하며 읽은 책
- <스프링 부트와 AWS로 혼자 구현하는 웹 서비스> - 완독
- <자바 ORM 표준 JPA 프로그래밍> - “5장 연관관계 매핑 기초” 까지
- <스프링 부트 핵심 가이드> - “8장 Spring Data JPA 활용” 읽는 중
- JPA - 객체 연관관계 매핑
- 데이터 중심 설계와 (기존 RDB 테이블 방식) 객체 중심 설계(JPA) 에서의 연관관계가 많이 다르다. SQL로는 간단하게 가능하던 조인문을 JPA로 어떻게 하는건지 이해가 안되어서 진입장벽이 좀 있다고 느꼈다.
- 책을 읽으며 기능 구현을 시도해보니 결국 객체 그래프로 찾아 간다는 점을 이해하고, 연관 관계 매핑 방법을 익혔다.
- JPA - 영속성 컨텍스트
- 이메일 인증 테이블에 10만건 Insert를 채워보려다가 배운점이 있다.
- 10만건을 넣는데 몇십분이 걸리더라. 근데 재밌는건 @Transactional 넣으면 10만건도 금방 뚝딱이더라.
- 처음엔 DB 커넥션의 문제인가? 아니면 원래 INSERT가 이렇게 느린 작업인가 신기했는데 시간이 흐를수록 느려지는 점, 서버를 내렸다 올리면 다시 빨라지는 점 등을 알게 되었고, Heap Dump 도 찍어보고 (덕분에 영속성 컨텍스트 메모리 차오르는걸 눈으로 볼 수 있었다.) 검색도 해보면서 책에서 봤던 flush() 시점을 명확히 인지할수 있게 되었다.
- 트랜잭션이 커밋되는 순간 flush()가 일어난다는 책의 이야기를 그냥 눈으로, 머리로 아 그렇구나 하고 넘어간것과 실제로 10만건 인서트 하며 느려지는걸 실시간으로 보고 → 10만건을 트랜잭션 단위로 묶고 영속성 컨텍스트의 flush()시점을 한번으로 줄여 몇초안에 동작이 끝나는걸 체감하는건 말로만 그랜드캐년 진짜 멋있다고 하는것과 실제로 보는것 정도의 차이였던 것 같다. 재밌는 경험이었다.
- JPA - 영속성 컨텍스트 2
- <…AWS로 혼자 구현하는…> 책을 읽으면서 배운점인데 update 로직을 짤 때 save없이 영속성 컨텍스트의 값 변경만 하고 넘어가는 부분이 있더라.
- 그리고 트랜잭션이 끝날 때 영속성 컨텍스트의 더티 체킹으로 직접 save하지 않아도 수정쿼리가 만들어 지는걸 눈으로 볼 수 있었다.
- 사람이 진짜 간사한게 머리로 아는것과 체감하는건 확연히 다르더라. 알고 있다고 생각한 내용인데 save로직 없이도 수정쿼리가 날아가는걸 보고 깨달음을 얻었다는 생각이 들었다. 좋은 책이다.
- 배울게 많다는 점
- 이번 과정을 통해 “무엇을 모르는지 어렴풋이 알게 된 것 같다.”
- CS 기초 공부는 한바퀴 돌렸다고 생각했는데 생각보다 모르는 점이 많았다. 특히 DB 관련해서 Connection Pool이 무엇인지, 설정은 어떻게 해야하는지 이런 것들에 대해 잘 모르고 있었다. 이 또한 운영하면서 겪은건 아니라 100% 안다고 말할 수 있을까?
- 내가 DB Lock, Row Lock, Optimistic Lock 등에 대해 제대로 설명할 수 있나?
- 테스트 코드를 100% 커버리지로 짤 만큼 익숙한 실력인가?
- 밸리데이션과 에러 처리는 할 줄 아는게 맞는가?
- <가상 면접 사례로 배우는 대규모 시스템 설계 기초> 를 읽으며 눈과 머리로 지식을 쌓고 있지만 경험적으로 알고 있는가? 실제로 상황을 겪어봤는가? 직접 손으로 구현해봤나?
- 읽을 책, 배울 것들이 아주 많이 남아 있다는 점을 알게 되었다. 거기다 손으로 따라 해보고 직접 만들어 볼게 많다는 걸 감안하면 아주 아주 공부할게 많다는 걸 알게 되었다.
- 테스트 코드
- 가장 시급한게 테스트 코드인것 같다.
- 테스트 코드가 없으면 개발 자체가 점점 느려지고, 확신도 안생기는 것 같다. 그리고 테스트 코드를 통해 이 기능이 정확히 어떤 기능인지 생각하게 되는것 같다.
- 익숙해지도록 도전해봐야겠다.
- 구조
- 향로님 책을 통해 어렴풋이 깨달았고, 덕분에 다른 사람 프로젝트를 몇개 뒤져보니 도메인별로 패키징을 한 케이스가 많더라.
- 또한 JSP로 간단하게 화면 구현해서 당연히 모델에 데이터 넣고 JSP로 넘겨주는 형태가 맞다고 생각했는데, View 컨트롤러와 API 컨트롤러를 별도로 만들고 API로 데이터 내려줘도 상관없더라.
- 공부할게 많지만 일단 위 2가지가 시급한 것 같다.