▶ 오늘 계획
=> 공부 관련
1) 수업 내용 복습
2) MVC 객체지향 리팩토링
3) 스프링 강의 수강 목표 8,9강
▶ 문제 정리
● MVC 리팩토링 ●
1. enum도 view에 의존하면 안된다.
public class Controller {
// 게임 결과를 가지고 있는 필드
private Result result;
// play 메서드
public void playRsp(Rsp playerRsp) throws RspException {
// 사용자 객체 생성
final Player player = new Player(playerRsp);
// 게임결과 반환값을 필드에 저장
this.result = player.play();
// 가위바위보 상태 값 출력
ViewOutput.whatYouInput(player.getRsp(), player.getComputer().getComRsp());
gameCount();
resultChange();
}
// 승리 무승부 카운트 변환 메서드
public void gameCount() {
Result.gameCount(result);
}
// viewOutput 결과 바꿔주고 출력하는 메서드
public void resultChange() {
if (result == Result.WIN)
ViewOutput.singleGameResult(PrintGameResult.of(result));
if (result == Result.DRAW)
ViewOutput.singleGameResult(PrintGameResult.of(result));
if (result == Result.LOSE)
ViewOutput.singleGameResult(PrintGameResult.of(result));
}
// 게임 결과 반환 메서드
public Result gameResult() {
return result;
}
}
=> 컨트롤러에 로직을 이관 후 view로 해결
public static PrintGameResult of(Result result) {
switch (result) {
case WIN:
return WIN_RESULT;
case DRAW:
return DRAW_RESULT;
default:
return LOSE_RESULT;
}
}
=> 로직 대신 상수 반환 of 메서드로 해결
2. 모델끼리의 의존을 하지말고 외부에서 주입시켜라 (의존 관계 ㄴㄴㄴ)
// setter 대신 생성자로 대입시켜서 해결
// 컴퓨터 인스턴스를 생성 시 자동 숫자(가위바위보) 저장
public Computer(final int comRsp) {
this.comRsp = comRsp;
}
=> 외부에서 컴퓨터 인스턴스 생성 시 자동숫자 가위바위보를 매개변수로 자동 인젝션
// 게임 실행!
controller.playRsp(ViewInput.inputPlayerRsp(), new Computer(new ComputerNumber().getComputerNumber()));
=> 요게 컴터 인스턴스 생성인데 매개변수에 객체 넣음
public class Controller {
// 게임 결과를 가지고 있는 필드
private Result result;
// play 메서드
public void playRsp(Rsp playerRsp, Computer computer) throws RspException {
// 사용자 객체 생성
final Player player = new Player(playerRsp);
// 게임결과 반환값을 필드에 저장
this.result = gameOf(player, computer);
// 가위바위보 상태 값 출력
ViewOutput.whatYouInput(player.getRsp(), computer.getComRsp());
gameCount();
resultChange();
}
// 승리 무승부 카운트 변환 메서드
public void gameCount() {
Result.gameCount(result);
}
// viewOutput 결과 바꿔주고 출력하는 메서드
public void resultChange() {
if (result == Result.WIN)
ViewOutput.singleGameResult(PrintGameResult.of(result));
if (result == Result.DRAW)
ViewOutput.singleGameResult(PrintGameResult.of(result));
if (result == Result.LOSE)
ViewOutput.singleGameResult(PrintGameResult.of(result));
}
// 결과 얻어오는 메서드
public Result gameOf(Player player, Computer computer) throws RspException {
return Result.getGameResult(player.getRsp(), computer.getComRsp());
}
// 게임 결과 반환 메서드
public Result gameResult() {
return result;
}
=> 컨트롤러 수정본
▶ 개인 공부
● 기선님 강의 정리 ●
1. 제어의 역전
2. 스프링 IoC 컨테이너
IOC 가 타입을 찾아서 bean을 주입한다.
⇒ 의존성 주입은 bean끼리만 가능하다. 등록된 놈들만 가능함!
3. 스프링 빈(Bean)
4. 의존성 주입 (Dependency Injection)
⇒ Spring Framework Reference에서 권장하는 방법은 생성자 주입!
⇒ 생성자 주입의 문제 : 순환 참조( a→ b →c 참조....) → 이 경우는 Setter or 필드 인젝션
5. 스프링 AOP
6. 프록시 패턴
스프링은 빈 등록 여부와 상관없이 자동으로 프록시 패턴이 적용된다.
딥한 매커니즘은 토비의 스프링3 추천!
▶ 수업 내용
Spring MVC
ServletContext.xml
component-scan
- Spring Annotation을 사용한 클래스가 작성된 패키지를 설정하기 위한 엘리먼트
- ⇒ 패키지에 작성된 클래스의 어노테이션을 Spring Container가 처리
- base-package 속성 : 패키지 경로를 속성값으로 설정
Annotation
@Controller
- 클라이언트의 요청을 처리하는 Controller 클래스를 Spring Bean으로 등록하기 위한 어노테이션
- ⇒ 클래스명이 beanName으로 등록되며 value 속성을 이용하여 beanName 변경 가능
- ⇒ Controller 인터페이스를 상속받지 않아도 Controller 클래스로 작성 가능
- ⇒ 클라이언트의 요청을 처리하는 다수의 요청 처리 메서드 작성 가능 - @RequestMappint 어노테이션 사용
@RequestMapping
- 클라이언트의 요청에 대한 처리 메서드를 설정하기 위한 어노테이션
- ⇒ @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 등의 어노테이션 사용 가능
- value 속성 : 클라이언트의 요청정보(URL)을 속성값으로 설정
- ⇒ 클라이언트 요청 정보에 의해 Front Controller(Dispatcher Servlet)가 Controller 클래스의 요청
- ⇒ 다른 속성이 없는 경우 속성값만 설정 가능
- ⇒ 다른 요청 처리 메서드에 같은 이름의 요청 정보가 설정된 경우 WAS 실행 시 에러 발생 - 중복 금지
- method 속성 : 요청 처리 메서드를 호출하기 위한 클라이언트 요청방식을 속성값으로 설정
- ⇒ RequestMethod 자료형 (Enum)의 상수를 속성값으로 설정
- 요청 방식에 따라 @GetMapping, @PostMapping 어노테이션 사용하여 요청 처리 메서드 설정 가능
@RequestMapping 어노테이션의 요청 URL 주소가 같은 경우 클라이언트의 요청 방식으로 구분하여 요청 처리 메서드 호출 가능 (get, post...)
- 요청 url을 같게 하면 에러 처리 할 때 편함
- 요청 방식 유효성 검사도 필요 없음
컨트롤러를 수정하면 서버 리스타트 후 에러 유무 확인
@ModelAttribute
- @ModelAttribute 어노테이션을 메서드에 선언한 경우 메서드 반환값(객체)을 현재 Controller 클래스에 선언된 모든 요청 처리 메서드의 뷰페이지에게 사용되도록 속성값을 제공하는 어노테이션
- value(name) 속성 : 뷰페이지에서 반환값을 사용하기 위한 속성명을 속성값으로 설정
- ⇒ 다른 속성이 없는 경우 속성값만 설정 가능
@RequestParam
- 전달값을 매개변수에 저장하기 위한 어노테이션
- ⇒ 매개변수의 이름과 같은 이름의 전달값이 없는 경우 400 에러 발생
- ⇒ 매개변수에 반드시 전달값이 저장되도록 설정하기 위해 사용하는 어노테이션
- value 속성 : 전달값의 이름을 지정하여 매개변수에 전달값 저장 가능
- ⇒ 다른 속성이 없는 경우 속성값만 설정 가능
- required 속성 : false 또는 true 중 하나를 속성값으로 설정
- ⇒ false : 전달값 미필수, true : 전달값 필수 - 기본
- defaultValue 속성 : 전달값의 이름이 다르거나 전달값이 없는 경우 매개변수에 저장되는 기본 값을 속성값으로 설정 - 페이징 처리 시 기본 페이지 값!
@RequestMapping(value = "/param", method = RequestMethod.POST)
public String form(@RequestParam(value = "username", defaultValue = "임꺽정") String name, Model model) {
model.addAttribute("name", name);
return "param_display";
}
Controller
요청 처리 메서드에서 Front Controller(DispatcherServlet)에게 ViewName을 제공하는 방법
- ⇒ Front Controller는 제공받은 ViewName을 ViewResolver 객체에게 전달하여 JSP 파일경로를 반환받아 포워드 이동하여 응답 처리
- 요청 처리 메서드의 반환형을 void 자료형으로 작성하면 메서드명을 ViewName으로 제공
- 요청 처리 메서드의 반환형을 String 클래스로 작성하면 반환값(문자열)을 ViewName으로 제공 → 보편적으로 많이 사용
- 요청 처리 메서드의 반환형을 ModelAndView 클래스로 작성하면 반환되는 ModelAndView 객체로 ViewName을 저장하여 제공
요청 처리 메서드의 처리 결과를 뷰페이지(JSP)에게 제공하는 방법
- ModelAndView 객체에 처리 결과를 속성값으로 저장하여 제공
- ⇒ 뷰페이지(JSP)에서 사용할 수 있도록 처리결과를 속성값으로 저장하는 메서드 - RequestScope
- ModelAndView.addObject(String attributeName, @Nullable Object attributeValue)
- HttpServletRequest 객체에 처리결과를 속성값으로 저장하여 제공
- => 뷰페이지(JSP)에서 처리결과를 사용할 수 있도록 HttpServletRequest 객체에 속성값을 저장하는 메소드
- HttpServletRequest.setAttribute(String attributeName, Object attributeValue)
- Model 객체에 처리결과를 속성값으로 저장하여 제공
- Model.addAttribute(String attributeName, Object attributeValue)
- => 뷰페이지(JSP)에서 처리결과를 사용할 수 있도록 Model 객체에 속성값을 저장하는 메소드
- Model : 처리결과를 속성값으러 저장하기 위한 객체
요청 처리 메서드에 매개변수를 작성하면 Spring Container로부터 필요한 Spring Bean 객체를 제공받아 매개변수에 자동 저장하여 제공
Redirect Controller
포워드 이동
- 서버 측에서 다른 웹프로그램(JSP)으로 스레드를 이동하여 응답 처리
- ⇒ 클라이언트의 요청 URL 주소 미변경, Request Scope로 제공되는 객체 사용 가능
반환되는 ViewName 앞에 redirect 접두사(nameSpace)를 사용하면 리다이렉트 이동
⇒ ViewName에 의해 뷰페이지(JSP)로 응답하는 대신 클라이언트에게 URL 주소 전달
리다이렉트 이동
- 클라이언트에게 URL 주소를 변경, Request Scope로 제공되는 객체 사용 불가능
RedirectAttributes
- 리다이렉트 이동에 의해 호출되는 요청 처리 메서드의 뷰페이지에게 속성값을 저장하여 제공하기 위한 객체
- ⇒ 다이렉트 이동에 의해 호출되는 요청 처리 메서드의 뷰페이지에게 속성값을 저장하며 제공하는 메서드
- RedirectAttributes.addFlashAttribute(String attributeName, Object attributeValue)
Method Controller
HttpServletRequest.setCharacterEncoding(String encoding)
- POST 방식으로 요청하여 전달된 값에 대한 캐릭터셋을 변경하는 메서드 - UnSupportedException 발생 : 예외 처리
Param Controller
@RequestMapping(value = "/param", method = RequestMethod.POST)
public String form(String name, Model model) {
model.addAttribute("name", name);
return "param_display";
}
전달값의 이름과 같은 이름의 String 자료형의 매개변수를 선언하면 Front Controller에 의해 전달값이 자동으로 매개변수에 저장되어 제공
⇒ web.xml 파일에서 EncodingFilter를 사용하여 전달값에 대한 캐릭터셋 설정 가능
- 전달값의 이름과 매개변수의 이름이 다른 경우 매개변수에는 NULL 저장
- 전달값에 대한 캐릭터셋을 미리 변경하기 위해 web.xml 파일에서 CharacterEncodingFilter 클래스를 필터로 등록해야만 정상적인 전달 값이 매개변수에 저장
web.xml
filter
- 필터 클래스를 필터로 등록하기 위한 엘리먼트
Filter 클래스
- Filter 인터페이스를 상속받아 작성된 자식클래스
- ⇒ 웹프로그램 실행 전 또는 후에 동작될 명령을 제공하는 클래스
CharacterEncodingFilter
- Spring Framework에서 제공하는 필터 클래스로 요청 처리 전 리퀘스트 메시지의 바디(Body)에 저장되어 전달되는 값의 캐릭터셋을 변경하는 기능 제공
- ⇒ encoding 이름으로 캐릭터셋의 인코딩 값을 반드시 전달
filter-mapping
- 필터가 적용되기 위한 클라이언트 요청 URL 주소의 패턴을 설정하는 엘리먼트
반응형
'레거시' 카테고리의 다른 글
2022.03.17의 기록 (2) | 2022.03.17 |
---|---|
2022.03.16의 기록 (0) | 2022.03.16 |
2022.03.14의 기록 (0) | 2022.03.14 |
2022.03.11~03.13의 기록 (2) | 2022.03.12 |
2022.03.08~03.10 의 기록 (0) | 2022.03.09 |