👀 역할과 책임을 잘 분리해야한다.
현업에서는 빈번하게 잘 지켜지지 않는다고 합니다.
( 일단 결과만 원하는 대로 나오면 된다고 생각하기 때문 )
- HTML의
form태그에method방식을 작성해주어야 한다.
( 개발자들 사이의 관례상 )
(Get 방식은"get"작성)
@GetMapping("url"), @PostMapping("url") 로 작성
한 가지 더 차이점은
- Get 방식으로 했을경우 사용자가 입력한 값이 노출되는것을 볼수있습니다.
- Post 방식의 경우는 사용자가 입력한 값이 노출되지 않습니다.
(보안상의 데이터는 Post 방식 사용)
Model 객체는 대표적으로 @Service, @Repository 를 구현
(컨트롤러에서 뷰로 데이터 전달)
@Controller
public class Controller {
private int hits = 0;
@RequestMapping("/hits")
public String hits(Model model) {
hits++;
model.addAttribute("hits", hits);
return "hits";
}
}
문제점
@RequestMapping() 을 사용해 method 방식을 작성해줘도 되지만,
최근에는 @GetMapping() @PostMapping() 을 사용해 구체적으로 명시한다고 합니다.
View는 분리가 되었지만, Controller에서 데이터 값을 조작을 하고 있습니다. (비즈니스 로직 처리, View 반환, 역할이 많다)
✔ 비즈니스 로직 (Model)
@Service
public class HitsService {
private int hits = 0;
public int increaseHits() {
return ++hits;
}
}
✔ 컨트롤러
@Controller
public class Controller {
// final로 선언해줘야 좋다. (불변성)
private final HitsService hitsService;
// 생성자 주입
public Controller(HitsService hitsService) {
this.hitsService = hitsService;
}
@GetMapping("/hits")
public String hits(Model model) {
int hits = hitsService.increaseHits();
model.addAttribute("hits", hits);
return "hits";
}
}
Post - Redirect - Get 패턴의 약자 이며,
- 페이지에서 새로고침을 하면 이런 화면을 한번쯤 보신분들도 있을것이다.
이런 화면이 뜨는 대표적인 이유는 마지막의 메소드 요청 방식이
Post였기 때문입니다.
- 이 화면에서 계속 버튼을 누르게 되면, DB에 똑같은 값만 바인딩 됩니다.
❗❗ 초기 이커머스 회사에서 많이 발생했다고 합니다.
ex : 결제가 2번됨, 똑같은 주문이 4번 발생함
View의 반환으로@PostMapping()의 url을 반환하여서 위의 사진과 같은 화면이 발생합니다.
redirect : 주소명을 반환하여Post메소드 방식이였던것을Get으로 돌립니다.
( PRG 패턴 )
DTO : Data Transfer Object 로 데이터가 이동을 한다는 객체
( 뒤에서 자세히 다룰 예정 )
DAO : Data Access Object 로 DAO는 앞에서 자세히 다루었습니다.
( 데이터를 접근하는 객체 )