- 기본적으로 JPA에서 데이터에 손을 대는 것들은 @Transactional이 있어야한다.
- class레벨에 @Transactional를 쓰면 Public 메서드에는 기본적으로 @Transactional아 걸려들어간다.
- @Transactional이 @Test와 함께 작용하면 롤백해서 commit이 안 나간다.
옵션
readOnly = true는 데이터 조회만 하겠다는 뜻으로 조금 더 조회에 맞게 최적화 시켜준다.
스프링부트를 띄운 상태로 테스트를 하겠다.
JUNIT실행할 때 스프링이랑 같이 실행하겠다.
의존성 주입 중 생성자 주입을 아무런 코드없이 할 수 있게 해준다.(@Autowired의 대체재라고 할 수 있다.)
final이 붙은 필드니 @NonNull이 붙은 필드들을 parameter로 하는 생성자를 만들어준다. ㄴlombok** 라이브러리에서 가져온 어노테이션
테스트 메서드임을 나타냄
옵션
- @Test( expected = Exception.class)
이 테스트를 돌리면 Exception이 발생해야 정상적으로 테스트가 실행되고 Exceptiond이 발생하지 않으면 에러남
예시
@RequestMapping(value = "/hello", method = RequestMethod.GET)
/hello 경로로 들어온 get요청을 아래의 메서드로 처리하겠다.
Http 요청 파라미터의 이름으로 바인딩하여 그 값을 변수에 저장.
@PostMapping("/order")
public String order(@RequestParam("memberId") Long memberId, @RequestParam("itemId") Long itemId, @RequestParam("count") int count){
orderService.Order(memberId,itemId,count);
return "redirect:/orders";
}
<form role="form" action="/order" method="post">
<div class="form-group">
<label for="member">주문회원</label>
<select name="memberId" id="member" class="form-control">
<option value="">회원선택</option> <option th:each="member : ${members}"
th:value="${member.id}"
th:text="${member.name}" />
</select>
</div>
<div class="form-group">
<label for="item">상품명</label>
<select name="itemId" id="item" class="form-control">
<option value="">상품선택</option> <option th:each="item : ${items}"
th:value="${item.id}"
th:text="${item.name}" />
</select>
</div>
<div class="form-group">
<label for="count">주문수량</label>
<input type="number" name="count" class="form-control" id="count"
placeholder="주문 수량을 입력하세요"> </div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
에서 name속성이 memberId,itemId,count인 태그에서 선택된 값을 넘겨준다.
model객체: 모델 객체는 컨트롤러에서 생성된 데이터를 담아 view로 전달할 때 쓰이는 객체다. addAttribute("key", "value") 메서드를 통해 많이 전달한다.
@ModelAttribute("test") Test test가 메서드의 파라미터로 사용되면
1. Test객체를 자동으로 생성한다.(이 때, Test는 getter,setter가 있는 bean 객체여야한다.)
2. http로 넘어온 값들을 이름에 따라 자동으로 바인딩한다.
biz/test?testId=1&testName=2&testPwd=4 이런 식으로 http요청이 왔다고 하면 test객체에 testId,testName,testPwd라는 이름의 필드가 있다면 거기에 1,2,4를 각각 바인딩한다.
3. test객체는 자동으로 Model객체에 추가되고 View단으로 전달된다.ㄴ
참고: https://dev-coco.tistory.com/100
테스트에 @Rollback(false)를 붙여서 테스트가 끝나도 롤백하지 않아서DB에 테스트의 결과가 남도록 한다.
자바 객체를 json 기반의 Http 객체로 반환, @ResponseBody를 사용하고 객체를 반환하면 객체가 JSON으로 반환됨
@Controller
@ResponseBody
public class HelloController{
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
}
참고: accounts.google.com/b/0/AddMailService
@AfterEach
이 어노테이션이 붙은 메서드를 각 테스트가 실행되고 난 뒤 실행한다(보통 DB를 초기화해주는 역할로 많이 쓴다.)
@AfterEach public void afterEach() { memberRepository.clearStore(); }
@BeforeEach
이 어노테이션이 붙은 메서드를 각 테스트가 실행되기 전 실행한다.