redirect : 사용자가 주소를 전달받아 서버에 다시 요청한다 ( 즉, get 방식으로 요청된다, 파라미터 값이 전달되지 않음 )
forward : 사용자가 요청하는 것이 아니라 서버에서 돌려주는 것이라 요청방식이 유지되며 파라미터 값, Attribute 값이 그대로 전달된다 >> forward 를 사용하는 경우 웹 출력 화면이 변해도 ( 실제 출력되는 jsp 파일이 변해도 ) url 은 첫 요청 페이지에서 변하지 않는다.
- 차이점 리뷰 -
로그인 성공 시 forward 로 success.jsp 로 넘기며( 서버에서 처리 ), 로그인 실패 시 redirect 로 다시 login 페이지로 이동 >>
1. 콘솔창에 뜨는 method 와 파라미터, Attribute 값이 redirect 에서는 소멸, forward 에서는 그대로 남아 이동되는 것 확인
2. forward 로 이동 시 url 이 처음 접근한 url 이고 ( 서버에서만 처리하여 보여주는 것이기 때문 > 그렇다고 서버에서 Controller 를 거쳐 출력되는 것이 아니라 그냥 jsp 파일만 출력할 뿐 > 고로, 연산은 따로 진행되지 않음 ) redirect 로 이동 시 url 이 처음 접근한 url 이 아니라 변경 요청된 url 임을 확인 ( 서버가 주소를 클라이언트에게 전달하여 클라이언트가 다시 서버로 요청 )
어노테이션이 붙으면 서버 실행 시 빈으로 등록되어 생성자가 실행된다 >> Controller 의 생성자만 실행되는 모습
어노테이션은 종류에 따라 기능적 차이는 없고 빈 객체로 등록만 시킬 뿐이다...
예를 들어 Service 클래스에 @Controller 어노테이션을 붙여도 문제가 생기지 않는다
( 즉, 이름만 구분지어 놨을 뿐 기능 상 차이는 없다 )
만들어진 빈 객체를 꺼내오는 방법
>>> 에러가 발생, Autowired 는 자료형을 기준으로 먼저 찾고 자료형이 같은 객체가 2개가 존재하면 이름으로 찾는데 현재 빈 객체에 MemberService 자료형이 두개 존재하므로 이름으로 찾기를 시도하지만 Controller 에서 설정한 변수 이름인 ms 와 동일한 이름을 가진 빈 객체를 찾지 못해 주입하지 못하고 오류가 발생된다.
GET, POST 전송 방식 처리하기
이번에는 POST 방식을 처리해볼 것임
@RequestParam 을 사용해서 input 태그에서 넘어오는 이름을 가지고 변수로 저장해서 사용.....
DTO 를 활용하여 파라미터 값을 받는 방법
DTO 를 활용해서 받으면 넘어오는 파라미터의 이름과 DTO 의 변수 이름이 같으면 자동으로 값을 주입해준다
@Controller 어노테이션 : 경로를 지정하는 클래스라는 걸 선언 @RequestMapping 어노테이션 : 경로를 설정 ( 따로 선언하지 않으면 GET 방식과 POST 방식을 모두 받을 수 있음 ) return 값에는 출력될 jsp 의 경로가 들어간다
@GetMapping 어노테이션 : GET 방식의 요청을 처리
실습 예제
예제 풀이
절대 경로로 설정하려면 /ex01/index 와 같이 설정 혹은 만약 경로가 변경될 일이 있을 수 있기 때문에 <%= request.getContextPath() %>/index 와 같이 표기하는 것이 가장 좋다 <%= request.getContextPath() %>/login <%= request.getContextPath() %>/logout