스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 섹션7. 스프링 MVC - 웹 페이지 만들기
CS/김영한 스프링 강의

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 섹션7. 스프링 MVC - 웹 페이지 만들기

만들거

 

일단 핵심 객체 만들고 테스트 만든다.

lombok의 @Data를 사용할 경우 Getter, Setter뿐만 아니라 ToString 같은것들도 의도하지 않게 같이 정의되기 때문에 그냥 Getter, Setter로 따로 쓰면서 하는게 좋다.

 

@Repository면 @Component라서 스프링 빈에 등록되는거

 

 

css용 bootstrap이랑 예제에서 준 html를 넣자.

 

thymeleaf를 쓰면 html형태 그대로 해서 값을 넣어줄 수 있다. thymeleaf가 서버로 인해 실행중이면 그냥 html은 th를 못 읽으니 무시되서 그냥 있는 기본값이 실행되고, 실행중이면 th로 치환된다. 이렇게 html를 기본으로 사용할 수 있는걸 네츄럴 템플릿이라고 함.

 

헷갈릴 수 있는데, 클래스의 기본 링크가 /basic/items이니 아이템 상세에 /{itemId}를 붙였으므로 /basic/items/{itemId}가 된다. 뷰로 basic/item에 있는 html를 모델에 데이터를 넣어서 반환하면 thymeleaf가 알아서 해석해서 값을 넣어줘서 해준다.

 

modelAttribute에서 지정한 객체를 꺼내서 html에 넣어준다.

 

 

다음은 추가

action은 현재와 같은 url이라면 생략 가능.

input의 name이 key로 반환된다.

Post 응답을 받는 방법이 여러가지가 있는데 결론은 둘다 form에서 name으로 되어있는 객체를 HTTP POST에 쿼리 방식으로 보내는 걸 해석하는 것이다. 생략되면 단순 Int, String -> ModelAtrribute순으로 받는다고 한게 여기서 나옴.

단순히 정보만 받는게 GET, 요청을 보내는게 POST라 주소가 같아도 잘 구분한 게 트릭임.

 

repository에 등록하고 목록 페이지를 보면 등록은 잘 된다.

 

 

다음은 수정

redirect를 썼기 때문에 301을 반환하면 브라우저가 알아듣고 해당 url로 반환한다. html의 form은 put, patch를 지원하지 않기 때문에 post를 사용한 것이다.

 

근데 위에선 POST로 해도 응답을 그냥 String으로 해서 뷰 템플릿을 전달했는데, 여기선 왜 redirect를 사용하였는가?

사실 원래 redirect로 했었어야 했다. 그냥 뷰 템플릿을 지원하면 url은 그대로 있고, 새로고침하면 브라우저는 마지막에 실행한 행동을 재실행하기 때문에 POST가 중복으로 계속 보내지는 문제가 발생한다.

 

해결 방법은 브라우저의 url을 변경하는 것이다. 즉, 몇 번을 보내도 무결성을 보장해주는 안전한 url을 브라우저에 넣어줘서 새로고침 해도 안전하게 하는 것.

그래서 url 변경을 위해 redirect를 해준다.

이렇게 redirect 해주면 되지만, 저렇게 + 형식으로 url을 전달하는 대신 다른 기능을 추가한 @RedirectAttributes를 사용할거다.

 

 

redirect attribute로 모델에 추가하듯 데이터를 추가할 수 있고, 남는건 쿼리로 가서 html thymeleaf에 추가할 수 있다.