스프링데이터 + JPA 112

11. 애플리케이션 아키텍처

계층형 아키텍처 사용할 거임 controller, web : 웹계층 service : 핵심 비즈니스 로직, 트랜잭션 처리 repository : JPA를 직접사용하는 계층, 엔티티 매니저 사용 domain : 엔티티가 모여 있는 계층. 모든 계층에서 사용. 근데 여기서 컨트롤러가 직접 repository를 사용하기도 하도록 만든다고 한다. 아키텍쳐 딱딱하게 설계해서 간단한 조회같은 건데 무조건 service타게하는 것도 좀 그렇다고.. 패키지 구조 exception은 예외 공통처리를 모아놓은 곳 개발순서 서비스, 리포지토리, 도메인 먼저 계발. 도메인인 이미 우리가 설계를 많이 하긴 함. 근데 추가적인 비즈니스 메소드가 도메인에 들어감(엔티티의 장점) 웹 환경을 제외한 핵심 비즈니스 계층을 먼저 개발하고..

10. 구현 요구사항

지금까지 도메인 설계 다 했고, 이제 본격적으로 걔네들 사이의 비즈니스 로직 설계 회원 기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 상품 주문 주문 내역 조회 주문 취소 예제 단순화를 위해 다음 기능은 구현 안함 로그인과 권한관리 파라미터 검증과 예외처리 단순화 상품은 도서만 사용 카테고리, 배송정보는 사용 X 아쉽다 솔직히. 나는 로그인 -> 로그인 세션 유지 게시판 글 남기기 글에 들어가 사용자 클릭하면 사용자 정보 가져오기 정도는 할 수 있을 줄 알았다.

9. 엔티티 개발 주의점

가급적 setter 사용 금지 아니면 private 해서 비즈니스 메소드를 따로 만들어서 하셈 모든 연관관계는 지연로딩으로 이게 JPA가 자동으로 쿼리 만들어서 나가는 거기 때문에 어떤 쿼리들이 나갈 지 연관관계는 예측이 잘 안될수도 있음. 근데 즉시로딩으로 하면 다 끌고 오기 때문에 성능적 손해가.. 그냥 다 지연로딩으로 하셈. @XToOne은 다 즉시로딩이 기본이라 직접 지연로딩으로 설정 해야 함 (ctrl + shift + F가 모든 파일에서 단어찾기) 한방에 같이 가져오고 싶으면 fetch join을 사용하셈. 컬렉션은 new ArrayList()로 초기화 해놔라. null 에러에서 안전함. 거기다 하이버네이트에서 영속화 할때 컬렉션은 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변강 함. 그래..

8. 엔티티 개발 2

다대다 실무에서 안쓴다. @Entity @Getter @Setter public class Category { @Id @GeneratedValue @Column(name = "category_id") private Long id; private String name; @ManyToMany @JoinTable(name = "category_item", joinColumns = @JoinColumn(name = "category_id"), inverseJoinColumns = @JoinColumn(name = "item_id")) private List items = new ArrayList(); } 다대다는 위와같은 테이블 형태밖에 할 수 없다. 다대다에 테이블 설정을 해준다. 얘 입장에서 관여할 colu..

7. 엔티티 개발

@Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List orders = new ArrayList(); } @Getter는 좋은데, @Setter는 생각하면서 넣으셈. @Setter 필요한 곳만 넣는게 좋음. 애노테이션 안쓰고. 차라리 별도의 비즈니스 메소드를 넣는 게 좋음. private로 만들고 비즈니스 메소드에서 사용하든.. Address는 임베디드타입 @Embeddable publ..

6. 도메인 모델과 테이블 설계

내가 한 이것과 카테고리 빼면 거의 비슷하다. 아 근데 저거 다대다 관계인데.. 또 현실로 보면 한 상품이 여러 카테고리에 포함되어 있을 수 있고, 한 카테고리가 여러 상품을 품을 수 있어서.. 멤버 아 그렇지 멤버 주소도 있어야 하지.. 근데 주소 여러 개 일수도 있으니까 저것도 테이블을 고려 해 봐야 할 듯. 주문 Member_id 있어야 하고, 주문상품도 있어야 하는데, 일대다 관계니 외래키는 다 쪽에 맡기니 여긴 없고, 주문 상태. 주문날짜 배송정보 그렇지. 주문과 1:1 주소정보도 있어야 하지. member의 주소와 다를 수 있으니 주문아이템 있어야지. 수량, 가격이 다를 수 있지. 할인같은 거 어떤 상품인지도 알아야 겠지. 상품 상품이름 가격 양 카테고리 카테고리 난 이 쪽이 사실 잘 모르겠음..

5. 요구사항 분석

요구사항 분석 기능 목록 회원기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 상품 주문 주문 내역 조회 주문 취소 기타 요구사항 상품은 재고 관리가 필요하다. 상품의 종류는 도서, 음반, 영화가 있다. 상품을 카테고리로 구분할 수 있다. 상품 주문 시 배송 정보를 입력할 수 있다. 우선 먼저 무슨 테이블이 필요할 지 생각해 보자. 아직은 기본적인 전체 회원, 전체 주문, 전체 상품 등 정도만 있는 것 같다. 기본 테이블은 회원, 상품, 주문이며, 세세하게 보자. 일단은 그냥 회원은 id, username만 두자. 회원 id username 상품 id name DTYPE amount price 주문 id date delivery order_product id order_id..

4. DB(H2) 설치 및 설정

이거 버전 맞춰서 설치 해야 함. https://qwefdg3.tistory.com/698 여기 참조. 그리고 이제 설정인데.. application.properties 쓰다가 application.yml로 쓰신다고 하신다. 뭐 종속성 많아지면 그게 더 편하다고.. 하긴 뭐랄까 뭐에 대한 설정인지 들여쓰기로 나눠져 있어서 보기 편하긴 하다. spring: datasource: url: jdbc:h2:tcp://localhost/./jpashop username: sa password: 1234 driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: t..

3. 뷰 환경설정

스프링은 주로 타임리프를 밀음 타임리프 장점 중 하나는 이런 게 그냥 웹브라우저로 열어도 열림. 다른 건 어떤 프로그램에 의해 랜더링을 한번 거쳐야 열리는 데, 이건 그냥 열림. 우선 그냥 보기 위해 기본적인 컨트롤러 하나만 만들어 봄 @Controller public class HelloController { @GetMapping("hello") public String hello(Model model){ model.addAttribute("data","hello!!!"); return "hello"; } } 컨트롤러 만들고, GetMapping 시켜서 get 메소드로 hello라는 url로 날아오는 요청은 저 메소드를 실행함. Model은 argumentResolver에 의해 넣어짐. Model 자체..