@RequiredArgsConstructor
Lombok의 애노테이션으로 final 이 붙은 멤버 변수만 사용해서 생성자를 자동으로 만들어준다
public BasicItemController(ItemRepository itemRepository) {
this.itemRepository = itemRepository;
}
이렇게 생성자가 딱 1개만 있으면 스프링이 해당 생성자에 @Autowired 로 의존관계를 주입해준다.
final 키워드를 빼면 ItemRepository 의존관계 주입이 안되므로 꼭 붙여야한다.
@PostConstruct
해당 빈의 의존관계가 모두 주입되고 나면 초기화 용도로 호출된다.
@Data
Lombok의 @Data 는 @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor
를 자동으로 적용해준다.
따라서 DTO 에는 써도 크게 상관은 없지만 @Setter 가 포함 되어 있어
엔티티에 사용할 경우 사이드 이펙트가 있을 수 있으므로 주의하여 사용한다.
PRG Post/Redirect/Get
아래와 같은 구조로의 컨트롤러는 심각한 문제를 야기할 수 있다.
브라우저의 새로 고침은 마지막에 서버에 전송한 데이터를 다시 전송한다.
상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 POST /add + 상품 데이터를 서버로 전송한다.
이 상태에서 새로 고침하면 마지막에 전송한 POST /add + 상품 데이터를 서버로 다시 전송하게 된다.
그래서 내용은 같고, ID만 다른 상품 데이터가 계속 쌓이게 된다.
이 문제를 어떻게 해결할 수 있을까? 다음 그림을 보자.
위 그림과 같이 상품 저장 후에 뷰 템플릿으로 이동하는 것이 아니라,
상품 상세 화면으로 리다이렉트를 호출해주면 된다.
웹 브라우저는 리다이렉트의 영향으로 상품 저장 후에 실제 상품 상세 화면으로 다시 이동한다.
따라서 마지막에 호출한 내용이 상품 상세 화면인 GET /items/{id} 가 되는 것이다.
이후 새로고침을 해도 상품 상세 화면으로 이동하게 되므로 새로 고침 문제를 해결할 수 있다
Post -> Redirect -> Get 의 과정을 거치게 되므로 PRG 라고 부르기도 한다
'백엔드 > 강의' 카테고리의 다른 글
[MVC 2편] 섹션 4. 검증1 - Validation (1) | 2023.08.15 |
---|---|
[MVC 2편] 섹션 3. 메시지, 국제화 (0) | 2023.08.15 |
[MVC 1편] 섹션 6. 스프링 MVC - 기본 기능 (0) | 2023.08.01 |
[MVC 1편] 섹션 5. 스프링 MVC - 구조 이해 (0) | 2023.08.01 |
[MVC 1편] 섹션 4. MVC 프레임워크 만들기 (0) | 2023.08.01 |