본문 바로가기
IT 도서/스프링 부트 실전 활용 마스터

2. 스프링 부트를 활용한 데이터 액세스

by 이민우 2021. 7. 31.
728x90
반응형

출처 : https://book.naver.com/bookdb/book_detail.nhn?bid=20551523

 

스프링 부트 실전 활용 마스터

대규모 트래픽을 적은 비용으로 처리할 수 있는 고성능 서버의 비밀은 무엇일까? 스프링 부트 개발, 테스트, 문서화, 보안, 도커화, 운영까지 모두를 한 권에 마스터하는 것을 목표로, 익숙하고

book.naver.com

*해당 글은 학습을 목적으로 위의 도서 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.

 상세한 내용 및 전체 내용 확인을 원하신다면 도서 구매를 추천드립니다.

 

 

 

리액티브 데이터 스토어 요건

 

리액티브 프로그래밍에서는 모든 과정이 리액티브여야 한다.

 

만약 서비스와 컨트롤러를 모두 리액티브로 만들었는데, 데이터베이스 호출은 블로킹 방식이라면 이는 리액티브 프로그래밍이 아니게 된다.

블로킹 방식으로 연결되면 DB에 연결이 될 때까지 스레드는 다른 작업을 하지 못하기 때문이다.

 

따라서 리액티브가 제대로 동작하기 위해서는 DB도 리액티브여야 한다. 이러한 리액티브 패러다임을 지원하는 DB는 몽고디비, 레디스, 아파치 카산드라 등이 있다.

 

100% 리액티브 어플리케이션의 제작을 위해서는 DB와의 연결을 비동기, 논블로킹 개념으로 진행할 수 있는 데이터베이스 드라이버가 필요하다.

 

그리고 해당 도서에서는 리액티브 프로그래밍을 위해 NoSQL중 하나인 몽고 디비를 사용한다.

 

1장 프로젝트에 해당 dependency 추가

 

 

이커머스 쇼핑몰 만들기

 

엔티티 클래스는 id, name, price 정도만 만든다.

편의상 lombok으로 제작. 원책에는 하드코딩 되어있음.

몽고디비는 ObjectId를 _id 필드로 사용한다. 스프링 데이터 커먼즈 (Spring Data Commons)에서 제공하는 @Id 에너테이션 사용시 해당 필드를 ObjectId로 인식하게 된다.

 

다음에는 장바구니 클래스를 만들자.

일단 구매할 상품을 장바구니에 추가하는 작업을 리모델링하기 위해

아이템과 수량을 포함하는 구매 상품 데이터를 먼저 만들고,

CartItem을 담는 Cart 클래스를 만들자.

 

 

이제 판매 상품을 장바구니에 넣는 기능을 만들자.

여기서 리포지토리(Repository)의 개념이 등장한다.

 

처음에 실무에서 리포지토리를 봤을 때는 음... 이게 뭐하는 거지 했었는데

아무리 생각해도 정말 중요하고 편리한 기술인 것 같다.

 

스프링에는 여러 DB에 대한 맞춤형 템플릿이 있다. 예를 들어 몽고디비는 MongoTemplate과 ReactiveMongoTemplate이 제공된다.

 

하지만 몽고디비 뿐 아니라 다양한 DB를 사용해야 하거나, 혹은 훗날 DB가 변경될 사능성이 있다면? 이미 템플릿을 사용했다는 것은 해당 DB에 맞춰진 쿼리문을 작성해놓았다는 것인데, 이를 전부 수정해야만 한다.

 

이를 방지하여 스프링 데이터 모듈에는 리포지토리 계층이 존재한다. CRUD같은 기초적인 연산을 알아서 하도록 지원해주기에, WHERE에 특수한 조건이 있는 쿼리문을 제외하고는 굳이 쿼리를 작성하지 않아도 되게 도와준다.

 

이렇게만 만들어줘도 기본적인 save, saveAll, count, deleteById, findById 등 여러 쿼리문을 지원해준다.

만약 오버라이딩을 하고 싶다면 다음과 같이 하자.

 

어쨌든, 위의 방식대로 CartRepository도 작성하자.

 

*그런데 임베디드 버전의 몽고디비라 처음 실행 시에도 Reactive로 실행하면 에러가 날 수 있다.

*그러니 여기서는 CrudRepository 같은 블로킹 코드를 사용해 초기 데이터를 넣어주자.

*보다 자세한 내용은 책 참고

+) 계속 안되길래 왜 안되나 했더니 repository 위에 @Repository를 추가해주니 돌아갔다.

 

 

다음은 컨트롤러 클래스이다.

view를 리턴할 때는 그냥 Mono<String>을 사용했지만, 애트리뷰트도 리턴할 때는 렌더링을 사용한다.

 

마지막으로 HTML을 만들어서 돌려주면 끝.

+) Repository 사용 시 몽고디비의 경우에는 @Query("{'name' : ?0, 'age' : ?1 }") 와 같이 작성

 

728x90
반응형