@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 라고 부르기도 한다

 

+ Recent posts