본문 바로가기

Spring boot

[spring boot] 실전!

1. entityManager를 이용하려면 @Transactional이 필수이다.

  • 기본 (쓰기용) : @Transactional (readOnly = false)
  • 단순 조회용   : @Transactional(readOnly = true)    = 읽기 전용이니 DB야 너무 큰 부하를 잡아먹지마
  1. Service위에 쓰기가 많으면 @Transactional, 단순 조회가 많으면 @Transactional(readOnly = true)
  2. 아래 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에 채워준다.