본문 바로가기
레거시

2022.03.15의 기록

by GroovyArea 2022. 3. 15.

 오늘 계획

=>  공부 관련

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. 제어의 역전

 

⇒ 생성자로서 의존 주입, 테스트 코드를 통해 보는 IOC의 역할 의존성을 주입한다.
테스트 코드를 통해 보는 IOC의 역할 의존성을 주입한다.

 

 

2. 스프링 IoC 컨테이너

 

⇒ 녹색 콩이 컨테이너에 Bean으로 등록되었다는 의미다.

 

IOC 가 타입을 찾아서 bean을 주입한다.

⇒ 의존성 주입은 bean끼리만 가능하다. 등록된 놈들만 가능함!

 

applicationContext로 직접 가져온 bean객체와 컨테이너가 주입해준 객체의 비교는 값이 같다. 직접 가져오나 주입해준거나 결국 같은 놈임.

 

⇒ 두 인스턴스의 해시코드 값이 같음.

 

3. 스프링 빈(Bean)

 

⇒ 어노테이션이 없어도 빈 등록이 되는 경우 / JPA의 기능으로 특정한 인터페이스를 상속받고 있는 경우 그것을 구현한 클래스를 찾아서 구현체를 내부적으로 만들어서 빈 등록이 일어남.
⇒ 직접 Bean을 등록하는 방법 메서드가 반환하는 객체가 bean 등록이 됨!

 

⇒ 굳이 생성자를 통해 주입을 하지 않아도 AutoWired로 같은 타입 자동 주입

 

4. 의존성 주입 (Dependency Injection)

 

⇒ Spring Framework Reference에서 권장하는 방법은 생성자 주입!

⇒ 생성자 주입의 문제 : 순환 참조( a→ b →c 참조....) → 이 경우는 Setter or 필드 인젝션

5. 스프링 AOP

 

⇒ stopWatch 반복되는 코드들.

 

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 파일경로를 반환받아 포워드 이동하여 응답 처리
  1. 요청 처리 메서드의 반환형을 void 자료형으로 작성하면 메서드명을 ViewName으로 제공
  2. 요청 처리 메서드의 반환형을 String 클래스로 작성하면 반환값(문자열)을 ViewName으로 제공 → 보편적으로 많이 사용
  3. 요청 처리 메서드의 반환형을 ModelAndView 클래스로 작성하면 반환되는 ModelAndView 객체로 ViewName을 저장하여 제공

요청 처리 메서드의 처리 결과를 뷰페이지(JSP)에게 제공하는 방법

  1. ModelAndView 객체에 처리 결과를 속성값으로 저장하여 제공
    • ⇒ 뷰페이지(JSP)에서 사용할 수 있도록 처리결과를 속성값으로 저장하는 메서드 - RequestScope
  2. ModelAndView.addObject(String attributeName, @Nullable Object attributeValue)
  3. HttpServletRequest 객체에 처리결과를 속성값으로 저장하여 제공
    • => 뷰페이지(JSP)에서 처리결과를 사용할 수 있도록 HttpServletRequest 객체에 속성값을 저장하는 메소드
  4. HttpServletRequest.setAttribute(String attributeName, Object attributeValue)
  5. Model 객체에 처리결과를 속성값으로 저장하여 제공
    • Model.addAttribute(String attributeName, Object attributeValue)
    • => 뷰페이지(JSP)에서 처리결과를 사용할 수 있도록 Model 객체에 속성값을 저장하는 메소드
  6. 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