우리가 원하는 질문 목록은 다음 주소에 접속할 때 동작해야 한다. 로컬 서버를 실행하고 웹 브라우저에서 http://localhost:8080/question/list에 접속해 보자. 아마 다음과 같은 404 오류페이지가 나타날 것이다. 404 오류 해결하기 404 오류를 해결하려면 /question/list URL에 대한 매핑이 있는 컨트롤러가 필요하다. QuestionController.java 파일을 다음과 같이 신규 작성하자. [파일명:/sbb/src/main/java/com/mysite/sbb/question/QuestionController.java] package com.mysite.sbb.question; import org.springframework.stereotype.Controlle..
이제 본격적으로 SBB를 만들어 보자. 다음으로 만들 기능은 질문 목록이다. 하지만 그에 앞서 패키지 정리가 필요해 보인다. 지금까지 우리가 작성한 파일은 다음처럼 com.mysite.sbb 패키지 안에 모두 모여 있다. 이렇게 하나의 패키지 안에 모든 자바파일을 넣고 관리하는 것은 바람직하지 않다. SBB는 도메인별로 패키지를 나누어 자바파일을 관리해 보자. 도메인은 "질문", "답변" "사용자" 처럼 굵직한 요구사항 또는 문제 영역을 대표하는 말이다. 따라서 SBB 프로젝트의 도메인은 다음과 같이 구성할수 있다. question - 질문 (com.mysite.sbb.question) answer - 답변 (com.mysite.sbb.answer) user - 사용자 (com.mysite.sbb.use..
이제 SBB가 사용할 엔티티(Entity)을 만들어 보자. 엔티티는 데이터베이스 테이블과 매핑되는 자바 클래스를 말한다. SBB는 질문과 답변을 할 수 있는 게시판 서비스이다. 따라서 SBB에는 질문과 답변에 해당하는 엔티티가 있어야 한다. 엔티티는 모델 또는 도메인 모델이라고 부르기도 한다. 이것들을 구분하지 않고 테이블과 매핑되는 클래스를 엔티티라 지칭하겠다. 엔티티의 속성 구상하기 그렇다면 질문과 답변 엔티티에는 어떤 속성들이 필요한지 먼저 생각해 보자. 질문(Question) 엔티티에는 최소한 다음과 같은 속성이 필요하다. 속성명설명 id 질문의 고유 번호 subject 질문의 제목 content 질문의 내용 create_date 질문을 작성한 일시 마찬가지로 답변(Answer) 엔티티에는 최소한..
컨트롤러 URL 매핑을 추가하기 위해 MainController.java 파일을 다음과 같이 작성하자. [파일명:/sbb/src/main/java/com/mysite/sbb/MainController.java] package com.mysite.sbb; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class MainController { @RequestMapping("/sbb") public void index() { System.out.println("index"); } } MainController 클래스에 @C..
스프링부트 프로젝트 생성하기 F1키를 눌러서 spring initializer를 통해 프로젝트를 생성하겠습니다. Gradle을 사용하여 프로젝트를 진행할 것입니다. 이전 포스팅에서 말씀 드린 것처럼 세팅하시면 됩니다. 이거부터 보신다면 잘 따라와주시기 바랍니다. 마지막으로 dependencies 부분은 위처럼 생성할 때 추가하셔도 되고 개발 진행중에도 추가하실 수 있으므로 지금 안하셔도 됩니다. HelloController http://localhost:8080/hello 와 같은 브라우저의 요청을 처리하기 위해서는 컨트롤러(Controller)가 필요하다. 컨트롤러는 서버에 전달된 클라이언트의 요청(URL과 전달된 파라미터 등)을 처리하는 자바 클래스이다. 위처럼 HelloController.java ..
장바구니 상품 삭제 1. CartService 장바구니 상품 번호를 파라미터로 받아서 삭제하는 로직 추가 2. CartController 장바구니 상품 삭제 요청을 처리하는 Controller 삭제 요청이므로 DeleteMapping 어노테이션 지정 상품 삭제 요청을 하는 유저와 해당 장바구니 상품의 유저가 일치하는지 검증 3. 장바구니 상품 삭제 요청 장바구니 페이지에서 상품의 X 버튼을 클릭하면 삭제 요청 장바구니 상품 주문 1. CartOrderDto 장바구니 페이지에서 주문할 상품의 데이터를 위한 Dto 자기 자신을 List로 가짐 2. OrderService 장바구니 페이지에서 전달 받은 구매 상품으로 주문을 생성하는 로직 추가 Order.createOrder() 메소드 호출 3. CartSer..
장바구니 조회 1. CartDetailDto 장바구니 조회 페이지에 전달할 Dto 클래스 CartItem 객체와 비슷함. 따라서 List 에 담겨서 전달됨 2. CartItemRepository 장바구니 페이지에 전달할 CartDetailDto 리스트를 쿼리 하나로 조회하는 JPQL 문 지연 로딩이기 때문에 최적화를 위해서 아래 코드와 같이 DTO의 생성자를 이용하여 조회 결과를 DTO 객체로 변환 후 반환할 수 있음 // select 부분에 new 키워드와 해당 DTO의 패키지, 클래스명을 지정 new com.shop.dto.CartDetailDto(ci.id, i.itemNm, i.price, ci.count, im.imgUrl) // 최적화를 위해 한 번에 반환하도록 List 타입 지정 List f..
상품 주문 1. 상품 재고 부족 Exception 상품 주문 수량보다 현재 재고의 수가 적을 때 발생시킬 Exception 정의 에러 메시지를 지정할 수 있는 RuntimeException 클래스 구현 2. 상품 재고 변경 (기존 재고 - 주문 수량 재고) 로 stockNumber 수정 만약 0 보다 작다면 재고가 부족한 것이므로 Exception 발생 3. OrderItem 객체 주문 상품과 주문 수량 정보를 가지고 있는 OrderItem Entity 에 객체 생성 메소드 추가 4. Order 객체 OrderItem 객체를 연결하고 OrderItem 객체에 자신을 연결하는 메소드 추가 OrderItem 객체를 이용하여 주문 객체를 만드는 메소드 추가 각 주문 상품의 TotalPrice 를 구한뒤 모두 ..