회원 도메인 개발
엔티티매니저
- createQuery 엔티티 객체를 대상으로 jpql 쿼리.
트랜잭션
- 기본적으로 데이터 변경은 트랜잭션 안에서 일어나야한다. - 서비스에서 메소드 트랜잭셔널을 붙이자
- @Transactional
- javax와 spring중 spring을 import 하자, 기능이 더 많음
- @Transactional(readOnly - true)
- 조회 기능에서 리드온니를 넣어주면 성능 증가.
- 기본적으로 서비스 클래스를 리드온리로 하고, 수정이 필요한 것에 @Transactional을 따로 붙임
- 기본적인 @Transactional은 readOnly = false
- 의존성 주입
- @Autowired보단 생성자를 이용하는 방식
- 생성자만 있어도 스프링이 긱본적으로 @Autowired를 붙여줌
- @RequiredArgsConstructor
- private final 클래스 인스턴스명
- @Autowired보단 생성자를 이용하는 방식
테스트
- 커멘드 shift T : 테스트 클래스 만들기
- 테스트 회원가입에서 insert 쿼리가 안보이는 이유?
- transactional 에서 롤백하기 때문
- Rollback(false) 하면 쿼리 볼 수 있긴함
- 또는 when에서 em.flush(); 를 넣으주면 롤백해도 볼 수 있음
- 예외 처리 테스트
- try catch 문으로 죽지않게 냅두고, catch 밖을 나가면 fail
- @Test(expected = IllegalStateException.class) 로 위를 대체가능
- 테스트할 땐 외부 디비를 사용 X -> 메모리 디비를 사용하자
- test 의 resource와 applicatiohn.yml을 생성
- 없을 경우엔 main의 resource를 사용하지만 따로 생성하면 그걸 사용함
- test의 yml에서 h2 url을 jdbc:h2:mem:test 로 변경
- 또는 h2는 별다른 설정이 없을 경우 인메모리 디비로 돌아기 때문에 설정을 지워두 가능
- test 의 resource와 applicatiohn.yml을 생성
주문 도메인 개발
- casecade
- order를 persist하면 orderItem, delivery 자동으로 persist 됨
- 언제 사용하면 좋을까?
- order가 orderItem을 관리하고, delivery 관리.
- 그리고 그 두개를 order만 참조함.
- 이런 상황에서 사용할만 하다.
- 클래스 생성 방법 제한
- static 메소드로 createOrder를 만들고
- protected로 기본생성자를 만듬
- 롬복으로 간단하게
- @NoArgsConstructor(access = AccessLevel.PROTECTED)
- 결과) createOrder로만 생성하도록 제한
- 도메인 모델 패턴
- 엔티티에 핵심 비즈니스 로직을 몰아넣는 방법
- 트랜잭션 스크립트 패턴
- 엔티티가아닌 서비스에서 비즈니스 로직을 몰아넣는 방법
- JPA에서 동적쿼리를 어떻게 처리하나? (ex 검색 기능)
- 파라미터가 있으면 조건을 추가하고 없으면 그냥 쿼리 실행
- QueryDSL을 사용
웹 계층 개발
- 서버 재시작 안하고 화면 바뀐거 알수 있게 해주는 의존성
- spring boot dev tools
- 타임리프의 th:field="*{name}"
- 같은 의미 : id="name" name="name"
- @Validation
- 클래스에 옵션을 주고
- 해당 클래스에 validation이 있다면
- @Valid MemberForm 으로 사용
- BindingResult result
- Validate 다음에 있으면 오류가 result에 담긴채로 실행됨
- result.hasError()로 예외 처리 가능.
- 이전 페이지로 가면 왜 에러인지 화면에서 알려줌
- 화면에 th:if="${#filds.hasErrors('name')}" 에러 표시해줌.
- ex) 회원 이름은 필수 입니다.
- 화면 개발에서 클래스를 되도록 수정하지 않을 것
- 엔티티는 핵심 비즈니스 로직만 갖고있어야한다.
- 화면에 대한 로직은 X
- dto를 사용하자
- Member를 바로 받지 않고 dto인 memberForm을 이용해서 데이터를 가져오는 것.
- 상품 수정 - JPA에선 어떻게 수정할까?
- 병합이아닌 변경감지를 이용하도록 하자.
'개발 > Spring' 카테고리의 다른 글
[스프링] 스프링 핵심원리 - 스프링 컨테이너와 빈 (0) | 2021.12.05 |
---|---|
[JPA] 변경감지(dirty checking)와 병합(merge) (0) | 2021.09.06 |
[JPA] 도메인 분석 설계 및 아키텍처 (0) | 2021.09.06 |
[JPA] SpringBoot JPA 프로젝트 설정 (0) | 2021.09.06 |
[IntelliJ] tdd 라이브 템플릿 (0) | 2021.08.24 |
댓글