redirect : 사용자가 주소를 전달받아 서버에 다시 요청한다 ( 즉, get 방식으로 요청된다, 파라미터 값이 전달되지 않음 )
forward : 사용자가 요청하는 것이 아니라 서버에서 돌려주는 것이라 요청방식이 유지되며 파라미터 값, Attribute 값이 그대로 전달된다 >> forward 를 사용하는 경우 웹 출력 화면이 변해도 ( 실제 출력되는 jsp 파일이 변해도 ) url 은 첫 요청 페이지에서 변하지 않는다.
로그인 정보 일치 시 forward 를 사용하여 파라미터 값과 Attribute 값을 success.jsp 에 전달하여 사용
코드 실행 영상
- 차이점 리뷰 -
로그인 성공 시 forward 로 success.jsp 로 넘기며( 서버에서 처리 ), 로그인 실패 시 redirect 로 다시 login 페이지로 이동 >>
1. 콘솔창에 뜨는 method 와 파라미터, Attribute 값이 redirect 에서는 소멸, forward 에서는 그대로 남아 이동되는 것 확인
2. forward 로 이동 시 url 이 처음 접근한 url 이고 ( 서버에서만 처리하여 보여주는 것이기 때문 > 그렇다고 서버에서 Controller 를 거쳐 출력되는 것이 아니라 그냥 jsp 파일만 출력할 뿐 > 고로, 연산은 따로 진행되지 않음 ) redirect 로 이동 시 url 이 처음 접근한 url 이 아니라 변경 요청된 url 임을 확인 ( 서버가 주소를 클라이언트에게 전달하여 클라이언트가 다시 서버로 요청 )
Controller, DAO, Service 에 각각 기본 생성자 생성 후 콘솔에 출력되게끔 하고 Controller 에만 어노테이션을 적용하여 실행
어노테이션이 붙으면 서버 실행 시 빈으로 등록되어 생성자가 실행된다 >> Controller 의 생성자만 실행되는 모습
DAO 와 Service 에 @Component 어노테이션을 붙여서 실행 >> 콘솔 창 출력
이번에는 DAO 에는 @Repository, Service 에는 @Service 어노테이션을 붙인 뒤 실행 >> 콘솔 창 확인
어노테이션은 종류에 따라 기능적 차이는 없고 빈 객체로 등록만 시킬 뿐이다...
예를 들어 Service 클래스에 @Controller 어노테이션을 붙여도 문제가 생기지 않는다
( 즉, 이름만 구분지어 놨을 뿐 기능 상 차이는 없다 )
만들어진 빈 객체를 꺼내오는 방법
만들어진 빈 객체를 꺼내오는 방법
Controller 에 코드 작성 후 서버 실행 ( MemberService 변수 생성, RequestMapping 을 사용하여 ex02/index 경로로 오는 내용을 처리 )
@Autowired 어노테이션을 사용하여 서버를 재시작 후 페이지에 접속하니 이미 등록된 service 객체를 불러오니 객체 값이 출력된다
Controller 에서 Service 쪽에 getData 메소드에 model 전달
Service 에 getData 메소드 생성 후 저장 > 웹 재접속 시 콘솔창에 출력되는 내용 확인
Service 에서 DAO 로 접근해야 하므로 Autowired 이용하여 DAO 객체를 불러와서 사용 >> DAO 의 메소드를 사용할 코드 작성
DAO 에서 값을 리턴 >> Service 에서는 해당 내용을 msg 변수로 받아 model 에 msg 라는 키로 저장
jsp 에서 전달받은 model 의 저장값 출력되는 것 확인
root-context.xml 파일에서 MemberService 를 abc 라는 빈 객체를 생성 >> MemberSerivce 에서 어노테이션에 빈 객체의 이름을 명시하여 저장
>>> 에러가 발생, Autowired 는 자료형을 기준으로 먼저 찾고 자료형이 같은 객체가 2개가 존재하면 이름으로 찾는데 현재 빈 객체에 MemberService 자료형이 두개 존재하므로 이름으로 찾기를 시도하지만 Controller 에서 설정한 변수 이름인 ms 와 동일한 이름을 가진 빈 객체를 찾지 못해 주입하지 못하고 오류가 발생된다.
빈 객체의 이름과 Autowired 로 호출하는 변수의 이름을 일치시키면 정상적으로 작동한다.
root-context.xml 에 DAO 빈 객체 등록 ( 아까 어노테이션으로 DAO 객체를 설정해놨으므로 Service 쪽 DAO 변수에 설정한 Autowired 에서 문제 발생 ) >> Service 에서 @Inject, @Qualifier 어노테이션을 사용해서 빈 객체의 이름을 지정하여 주입해서 사용할 수 있다.
GET, POST 전송 방식 처리하기
index.jsp 에 get 방식 전송과 post 방식 전송 코드 작성
웹에서 전송을 클릭하면 Controller 로 넘어올테니 Controller 에 코드 작성 및 result 페이지 작성
@RequestMapping 을 사용하면 get 방식과 post 방식을 모두 받을 수 있음
Controller 에서 RequestMapping 어노테이션에 GET 방식만 받게끔 설정 후 POST 방식으로 전송하여 확인 >> 405 에러 출력 ( GET 방식만 받도록 설정했기 때문 )
Controller 에서 전달받은 파라미터 값을 model 에 담아서 jsp 로 전달 >> jsp 파일에서 출력
입력 전송 > 확인 ( 파라미터 값이 model 객체를 사용하여 잘 넘어가는 것 확인 )
이번에는 POST 방식을 처리해볼 것임
PostMapping 으로 동일한 경로로 post 로 넘어오는 값을 처리 ( 어노테이션을 사용해서 넘어오는 값을 변수로 저장 ) > 웹에서 확인
@RequestParam 을 사용해서 input 태그에서 넘어오는 이름을 가지고 변수로 저장해서 사용.....
Controller 에서 최상단에 ex02 경로를 RequestMapping 으로 설정해주면서 하위에 동일 경로인 ex02 경로를 모두 생략할 수 있게 해준다
DTO 를 활용하여 파라미터 값을 받는 방법
DTO 생성 및 작성 ( getter / setter )
jsp 파일에 DTO 활용해서 넘길 폼 작성
Controller 에 DTO 를 활용하여 값을 받게끔 설정 >> jsp 파일 작성
전송 >> 확인
DTO 를 활용해서 받으면 넘어오는 파라미터의 이름과 DTO 의 변수 이름이 같으면 자동으로 값을 주입해준다
실습 예제
실습 예제
예제 풀이
프로젝트 생성 및 파일 세팅
버전 세팅
버전세팅 이후 프로젝트 업데이트 진행 ( 변경된 버전으로 사용하기 위해서 )
인코딩 오류 해결
Controller 에 index 페이지를 작성
register 에 대한 경로를 get 방식과 post 방식으로 분류하여 post 방식으로 들어오는 경우 회원가입 로직을 처리한 뒤 index 페이지로 반환
정상적으로 post 와 get 방식으로 들어오는 경우 경로를 나눠 출력하는 모습
입력 정보를 그대로 받아올 DTO 작성
Controller 에서 회원가입에 대한 정보를 DTO 객체로 받아온 뒤 Service 로 넘겨준다 >> Service 에서는 DAO 로 dto 객체를 저장하기 위해 넘겨준다 >> DAO 에서는 list 에 dto 객체를 저장한다
회원 목록보기 구현
Controller 에 경로 작성 후 list.jsp 에 넘겨줄 model 객체 만들어서 Service 에 전달 >> Service 에서는 DAO 에서 getList 메소드를 사용한 값을 model 에 list 라는 이름으로 저장한다 >> DAO 에서는 list 의 값을 리턴해준다
list.jsp 에 list 에 내용이 없을 시 출력될 내용과 내용이 있을 시 출력될 내용 작성
src > main > webapp > WEB-INF 폴더 내의 web.xml 파일에 해당 코드 붙여넣기 ( 인코딩 관련 코드 )
열려있던 웹 창 종료 후 프로젝트 클릭 > Ctrl + F11 클릭하여 재시작 시 한글이 깨지지 않고 정상적으로 출력됨
포트 충돌 에러가 발생하는 경우
서버 더블클릭 후 포트 정보를 변경
경로 충돌 에러가 발생하는 경우
여러 실습을 진행하면서 ex01 이라는 경로를 다른 파일에서 실행하더라도 경로가 겹쳐서 저장되게 된다, 그러므로 server.xml 에서 등록된 Context 를 주석처리해준 뒤 실행해준다
웹 브라우저 출력되는 부분을 보기 편하도록 Chrome 으로 변경 > 서버 실행 시 크롬으로 출력되는 것 확인
General - Workspace - Other : UTF-8 설정
CSS, HTML, JSP 파일 모두 인코딩 방식 UTF-8 로 설정 후 저장 종료
Controller 를 변경하여 default 경로를 /member 로 변경 후 접속 테스트 > 정상적으로 /member 경로로 접근할 때만 접속됨
테스트용으로 설정해둔 것이기 때문에 다시 돌려놓음
연습을 위해 MyController.java 와 jsp 파일 세개 를 폴더에 세팅
index.jsp 간단하게 작성
MyController.java 에 경로를 추가 후 서버 재실행하여 index 경로로 접속 >> 정상적으로 컨트롤러를 거쳐 웹 출력
@Controller 어노테이션 : 경로를 지정하는 클래스라는 걸 선언 @RequestMapping 어노테이션 : 경로를 설정 ( 따로 선언하지 않으면 GET 방식과 POST 방식을 모두 받을 수 있음 ) return 값에는 출력될 jsp 의 경로가 들어간다
@GetMapping 을 사용하여 접속
@GetMapping 어노테이션 : GET 방식의 요청을 처리
model 에 키와 값을 저장하여 전달 >> jsp 파일에서 키로 값을 꺼내서 사용 >> 출력
ModelAndView 를 사용하여 jsp 파일로 넘길 모델과 출력될 jsp 를 모두 설정 후 리턴으로 모델을 반환하여 출력
실습 예제
실습 예제
예제 풀이
예제 풀이
절대 경로로 설정하려면 /ex01/index 와 같이 설정 혹은 만약 경로가 변경될 일이 있을 수 있기 때문에 <%= request.getContextPath() %>/index 와 같이 표기하는 것이 가장 좋다 <%= request.getContextPath() %>/login <%= request.getContextPath() %>/logout
위에서 압축을 해제한 plugins 폴더 내의 설정 파일을 복사하여 workspace 폴더 내의\spring\workspace\.metadata\.plugins\org.springsource.ide.eclipse.commons.content.core 위치에 붙여넣기
Spring Legacy Project 생성
처음 프로젝트를 시작하면 오류 발생
다시 STS 종료 후 아래 과정 진행
위에서 압축을 해제한 sts템플릿 폴더 내의 설정 파일을 복사하여 workspce폴더 하위의 \spring\workspace\.metadata\.sts\content\org.springframework.templates.mvc-3.2.2 경로 내에 3가지 파일을 붙여넣기