본 프로젝트 자료는 김영한님의 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발을 참고 제작됐음을 알립니다.
Item - 상품 엔티티 코드 추가
NotEnoughStockException 클래스를 생성해서 예외를 추가해줘야 한다.
NotEnoughStockException - 예외 추가 클래스 생성
ItemRepository - 상품 리포지토리 생성
save 에 대한 부연 설명
ItemService - 상품 서비스 코드 생성
상품 서비스는 상품 리포지토리에 단순히 위임만 하는 클래스 다.
Order - 주문 엔티티 코드 추가
OrderItem, cancle, getTotalPrice 비어 있는 메서드를 생성해주자.
OrderItem - 메서드 추가
주문 리포지토리에는 주문 엔티티를 저장하고 검색하는 기능을 넣었다.
OrderService - 주문 서비스 코드 생성
주문 서비스는 주문 엔티티와 주문 상품 엔티티의 비즈니스 로직을 활용해서 주문, 주문 취소, 주문 내역 검 색 기능을 제공한다.
JPA에서 동적 쿼리를 어떻게 해결해야 하는가?
OrderSearch - 주문 검색창 생성
OrderRepository - 접근 권한 생성
findAll(OrderSearch orderSearch) 메서드는 검색 조건에 동적으로 쿼리를 생성해서 주문 엔티티를 조회한다.
JPQL 쿼리를 문자로 생성하기는 번거롭고, 실수로 인한 버그가 충분히 발생할 수 있다.
HomeController - 홈 뷰 생성
home - 뷰 생성
이대로 생성해봐야 아무것도 안뜬다. fragments 로 추가 HTMl 을 제작해줘야 한다.
fragments/header - 뷰 생성
fragments/bodyHeader - 뷰 생성
fragments/footer - 뷰 생성
이렇게만 일단 등록해주고 실행시켜본다.
결과 화면
여기서 끝내기엔 화면이 너무 조잡해 보인다. 그렇다고 직접 꾸미기엔 시간이 많이 걸려 (https://getbootstrap.com/) 를 사용해 복붙으로 꾸며보자.
(https://getbootstrap.com/) 링크를 타고 들어가면 중앙 하단에 다운로드를 확인할 수 있을 것이다. 클릭하자.
지금 현재 원하는 버전은 현재 기준 5.3이 아닌 4.3이 필요한 상황이니, 4.3으로 변경하고 엔터쳐주자.
아래와 같은 화면이 보일텐데 다운로드 눌러주면 원하는 자료를 받을 수 있을 것이다.
다운을 받고 압축을 풀게 된다면 css 와 js 파일을 확인할 수 있을 것이다.
현재 넣고자 하는 혹은 진행 중인 프로젝트에 넣어주면 된다.
그리고 프로젝트에 다시 돌아와,
resources/static 에 넣었던 파일이 존재한다면 오른쪽 클릭 후 동기화 진행을 해주면 다운받은 파일을 적용시킬 수 있다.
그리고 css 폴더에 jumbotron-narrow.css 파일을 추가만 해주면 끝난다.
jumbotron-narrow - css 추가
이제 실행시켜서 화면이 제대로 호출되었는지 확인해보자.
결과 화면
아까와 비교해서 깔끔해진걸 확인 할 수 있다.
폼 객체를 사용해서 화면 계층과 서비스 계층을 명확하게 분리해야 한다.
MemberForm - 회원 등록 폼 객체 생성
MemberController - 회원 등록 컨트롤러 생성
createMemberForm - 회원 등록 폼 뷰 생성
실행 결과
값을 정확하게 입력했을 경우,
값을 만약 null 로 했을 경우.
정상적으로 실행되는 것을 확인 할 수 있다.
MemberController - 회원 목록 컨트롤러 추가
MemberController 컨트롤러 클래스 하단에 내용 추가.
memberList - 멤비 리스트 뷰 생성
실무에서 엔티티보다 폼 객체 사용을 추천하는 이유는, 요구사항이 복잡해지기 시작하면 엔티티에 화면을 처리하기 위한 기능이 많아진다. 결국 코드가 지저분해지는 원인이 되고, 점점 화면에 종속적으로 변해 유지보수하기 힘들어진다.
엔티티는 핵심 비즈니스 로직만 유지하고 화면을 위한 로직은 없애야 한다. 화면이나 API 에 맞는 폼 객체나 DTO 사용을 추천한다.
실행 결과
회원가입을 진행하고 회원 목록을 조회해봤다.
다음과 같이 입력한 회원 리스트가 출력된다면 성공적으로 실행됐다.
BookForm - 상품 등록 폼 생성
ItemController - 상품 등록 컨트롤러 생성
createItemForm - 상품 등록 뷰 생성
ItemController - 상품 목록 컨트롤러 추가
ItemController 컨트롤러 클래스에 내용을 추가.
itemList - 상품 리스트 뷰 생성
model 에 담아둔 상품 목록인 items 를 꺼내서 상품 정보를 출력했다.
출력 결과
리스트에 입력한 정보가 출력되는지 확인.
성공적으로 출력되는 것을 확인 할 수 있다.
ItemController - 상품 수정과 관련된 컨트롤러 코드 추가
ItemController 컨트롤러 클래스에 수정과 관련 컨트롤러 추가.
상품 수정 폼 HTML에는 상품의 id(hidden), 상품명, 가격, 수량 정보 있음
updateItemForm - 수정 뷰 생성
실행 결과
상품 등록 후 수정 입력.
원하는 변경 값으로 변경 후 입력.
제대로 변경된 것을 확인 할 수 있다.
OrderController - 상품 주문 컨트롤러
orderForm - 상품 주문 뷰 생성
실행 결과
OrderController - 주문 목록 검색 컨트롤러 추가
Get 방식으로 주문 목록 검색 조회, Post 방식으로 주문 목록 취소 로직을 넣었다.
orderList - 주문 목록 조회 뷰 생성
실행 결과
로직대로 동작하는지 상품 목록에 있는 상품을 주문해보려고 한다.
test 상품 100개가 정상적으로 동작하는걸 확인했고, 상품 목록 수량이 줄었는지 확인해보자.
정상적으로 줄었다면 성공적으로 출력한걸 확인 할 수 있다.
MemberController - 회원 목록 컨트롤러 추가
MemberController 컨트롤러 클래스 하단에 내용 추가.
memberList - 멤비 리스트 뷰 생성
실무에서 엔티티보다 폼 객체 사용을 추천하는 이유는, 요구사항이 복잡해지기 시작하면 엔티티에 화면을 처리하기 위한 기능이 많아진다. 결국 코드가 지저분해지는 원인이 되고, 점점 화면에 종속적으로 변해 유지보수하기 힘들어진다.
엔티티는 핵심 비즈니스 로직만 유지하고 화면을 위한 로직은 없애야 한다. 화면이나 API 에 맞는 폼 객체나 DTO 사용을 추천한다.
실행 결과
회원가입을 진행하고 회원 목록을 조회해봤다.
다음과 같이 입력한 회원 리스트가 출력된다면 성공적으로 실행됐다.
BookForm - 상품 등록 폼 생성
ItemController - 상품 등록 컨트롤러 생성
createItemForm - 상품 등록 뷰 생성
ItemController - 상품 목록 컨트롤러 추가
ItemController 컨트롤러 클래스에 내용을 추가.
itemList - 상품 리스트 뷰 생성
model 에 담아둔 상품 목록인 items 를 꺼내서 상품 정보를 출력했다.
출력 결과
리스트에 입력한 정보가 출력되는지 확인.
성공적으로 출력되는 것을 확인 할 수 있다.
ItemController - 상품 수정과 관련된 컨트롤러 코드 추가
ItemController 컨트롤러 클래스에 수정과 관련 컨트롤러 추가.
상품 수정 폼 HTML에는 상품의 id(hidden), 상품명, 가격, 수량 정보 있음
updateItemForm - 수정 뷰 생성
실행 결과
상품 등록 후 수정 입력.
원하는 변경 값으로 변경 후 입력.
제대로 변경된 것을 확인 할 수 있다.
OrderController - 상품 주문 컨트롤러
orderForm - 상품 주문 뷰 생성
실행 결과
OrderController - 주문 목록 검색 컨트롤러 추가
Get 방식으로 주문 목록 검색 조회, Post 방식으로 주문 목록 취소 로직을 넣었다.
orderList - 주문 목록 조회 뷰 생성
실행 결과
로직대로 동작하는지 상품 목록에 있는 상품을 주문해보려고 한다.
test 상품 100개가 정상적으로 동작하는걸 확인했고, 상품 목록 수량이 줄었는지 확인해보자.
정상적으로 줄었다면 성공적으로 출력한걸 확인 할 수 있다.