Spring

국비코딩 Mar02 | 값이 아니라 주소가 뜰 때, mvc 패턴 흐름 정리

onnnzeoz 2023. 3. 2. 17:43

벌써 삼월

standardModel이라는 데이터 타입

다형성은 필드(변수)뿐만 아니라 매개변수에도 사용할 수 있음(이 둘은 비교할 필요없음 똑같아, 다만 쓰임새만 다를뿐)

같은 이름으로 다른 변수들을 담았음 ->오버로드를 사용함

 

kr.co.web.model.Car@2ec43c7d

console에 이렇게 뜰때, 문자열로 안뜰 때

그건 아마 Car car = new Car(); 이렇게 가져와서 일것임

이게 아니라 getParameter("car");를 통해서 가져와야함

만약 이렇게 가져올거라면 이런식으로 해줘야 함

String name = ""; //클래스안에 있는 변수 = 필드
	public VingsuMachine(String name) { //여기있는 String name은 매개변수
		this.name = name;
		//문자열로 가져오기 위해 위의 3줄이 붙여짐

mvc 패턴 흐름 정리

가장먼저 index값을 본다. 데이터를 전송하기 위한 form태그가 있고 보낼 주소를 뜻하는 action 속성에는 drive가 들어가 있다. 그리고 사용자가 차를 선택하기 위한 select 태그를 만들어줍니다.이 태그 안에는 여러 값들이 들어가 있다. 전송된 값을 담아서 출력하기 위해 el태그 msg를 만들었다.

이후 controller로 이동해보면, @WebServlet(urlPatterns = "/drive") 을 통해 요청한 drive를 받아준다. form 태그에서 method를 언급하지 않았으므로 기본방식인 get방식을 통해 가져온다. doGet 오버라이드를 해준다. 그리고 car 파라메터 값을 가져오기 위해 request 객체의 getParameter 메소드를 사용한다. 변수 car에 담아주고 system.out.println을 통해 잘 가져왔는지 확인한다. result값을 담기 위해 비어있는 변수를 선언하고, racer 클래스의 메서드를 사용하기 위해 racer을 객체화한 뒤 데이터 타입이 racer이 racer 변수에 담아줍니다. 

만약 가져온 car의 값이 audi와 같다면, racer 클래서의 drive 메서드를 실행하는데 인자값으로는 audi를 객체화하여 넣어줍니다

racer 클래스를 가보면, 인자값으로 Car car를 가지고 있는데, 여기서 클래스인 Car자리에 Audi클래스가 들어오게 된다

그래서 Audi클래스의 run메서드를 실행하게 된다. 

audi 클래스를 가보면 run()의 리턴값으로 this.getClass().getSimpleName()+ super.run(); 가 있는데 this는 이 클래스, getClass는 클래스의 정보를 가져오고 그 중에서도 getSimpleName을 통해 simplename인 클래스의 이름을 가져오게 됩니다. 그 뒤에는 super class인 Car클래스의 run()메서드가 실행이되며 최종 return값으로는 "아우디 자동차를 운전한다." 값이 들어옵니다. 

이후 다시 controller로 이동해서 값을 뷰페이지로 보내기 위해 request객체의 setAttribute 메서드를 사용해줍니다. msg라는 이름으로 result값을 request에 담아줍니다. 그리고 이 request 값을 함께 전송하기 위해  requestDispatcher 객체를 사용했는데요 이 객체를 생성하기 위해 getRequestDispatcher 메서드를 실행해줍니다

dis에 req객체와 resp객체를 forward를 통해 전송한다

 

사용하지 않으면

타입을 Car로 통일하는게 아니라 새로운 객체가 생성될때마다 새로운 메서드를 많이 생성해줘야한다

그리고 Car클래스를 상속받던지 구현받던지 해야함