1. entityManager를 이용하려면 @Transactional이 필수이다.
- 기본 (쓰기용) : @Transactional (readOnly = false)
- 단순 조회용 : @Transactional(readOnly = true) = 읽기 전용이니 DB야 너무 큰 부하를 잡아먹지마
- Service위에 쓰기가 많으면 @Transactional, 단순 조회가 많으면 @Transactional(readOnly = true)
- 아래 method 중 반대되는건 따로 개별적으로 @Transactional적어주기
2. lombok
- @AllArgsConstructor : 필드 모두 생성자 만들기
- @RequiredArgsConstructor : final(수정x) 필드만 생성자 만들기
3. roll back (test)
roll back 설정
- @Transactional : 기본 (roll back)
- jpa는 영속성 컨텍스트의 데이터를 flush, commit할 필요가 없기 때문에 insert쿼리가 날라가지 않음.
- ↳ em.flush()로 강제 flush 시키면 insert 쿼리 날라감.
- findOne할 때, select 쿼리가 날라가는데 이미 영속성컨텍스트에 들어있는 데이터를 가져오는것.
roll back 취소
- @Transactional(false) : rollback을 하지 않음.
- jpa는 영속성 컨텍스트의 데이터를 flush, commit해야 하기 때문에 insert쿼리가 날라감.
4. 예외 발생 (test)
try-catch 대용으로 @Test(expected = ~.Excpetion.class) + throw Exception + fail이 있음.
@Test(expected = ~~~~Exception.class)
public void ~~~_~~~() throw Exception{
//given
//when
//then
fail("이렇게 출력해~");
}
5. 데이터 미리 채우기 (controller)
<form>태그에서 post로 action보낸 postMapping은 ~(Member)Form을 따로 만들어서 채워준 후 ~(Member)객체로 만들기
@GetMapping(value = "/members/new")
public String createForm(Model model) {
model.addAttribute("memberForm", new MemberForm());
return "members/createMemberForm";
}
@PostMapping(value = "/members/new")
public String create(@Valid MemberForm form, BindingResult result) {
if (result.hasErrors()) {
return "members/createMemberForm";
}
Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode());
Member member = new Member();
member.setName(form.getName());
member.setAddress(address);
memberService.join(member);
return "redirect:/";
}
1. GetMapping
- /members/new라는 주소로 들어오면 MemberForm 빈 폼을 새로 만들어 memberFrom이라는 이름으로 members/createMemberForm html에 보낸다.
2. PostMapping
- 빈 폼이 채워지면 form이라는 이름의 post형식으로 /members/new에 들어온다.
- error가 있는지 확인해주는 result에 error가 있다면 다시 members/createMemberForm html에 보낸다.
- form을 나눠 Member 빈 객체를 만들어 Member에 채워준다.
'Spring boot' 카테고리의 다른 글
[spring boot] 변경감지(dirty checking)와 병합(merge) (0) | 2022.01.20 |
---|---|
[spring boot] 영속성 전이 (cascade)와 orphanRemoval 차이 (0) | 2022.01.20 |
[spring boot] 각 join 특징 (+ on, where 차이) (0) | 2021.12.27 |
[spring boot] OSIV와 영속성 컨텍스트 (0) | 2021.12.08 |
[spring boot] API 성능 최적화 (+ DTO 장점) (0) | 2021.12.03 |