2-11 MVC패턴 - 원리(1)

서현우·2022년 5월 12일
0

스프링의정석

목록 보기
11/85

pom.xml

자바 버전 변경.
pom.xml파일 변경 후 Maven - Update Project 클릭 해야 함.

	<properties>
		//자바 버전 변경 첫번째(11버전으로)
		<java-version>11</java-version>
		<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	
			<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    //자바 버전 변경 두번째(EL로 변경)
                    //첫번째 것만 바꾸면 EL은 자동 변경됨.
					<source>${java-version}</source>
                    <target>${java-version}</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>

MethodInfo.java

메서드 정보를 얻어서 출력하는 예제
매개변수 이름은 (Reflection API, Class file)로 얻을 수 있음.

Class 객체를 만들어서 메서드 정보를 배열에 저장.
매개변수 목록을 배열에 저장해서
이름과 타입을 스트링조이너로 출력.

package com.fastcampus.ch2;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.StringJoiner;

//매개변수 이름을 얻어오기
//1. Reflection API : (간단함)jdk1.8부터 -parameters옵션으로 가능
//2. Class file : (복잡함)Reflection API로 매개변수 이름을 얻어오지 못하면 Class file로 시도
public class MethodInfo {
	public static void main(String[] args) throws Exception{

		//1. YoilTeller클래스의 객체를 생성
		//(메서드 정보를 보고싶은 클래스명을 입력)
		Class clazz = Class.forName("com.fastcampus.ch2.YoilTellerMVC");
		Object obj = clazz.newInstance();
		
		//2. 모든 메서드 정보를 가져와서 배열에 저장
		Method[] methodArr = clazz.getDeclaredMethods();
		
		for(Method m : methodArr) {
			String name = m.getName(); //메서드 이름
			Parameter[] paramArr = m.getParameters(); //매개변수 목록
//			Class[] paramTypeArr = m.getParameterTypes();
			Class returnType = m.getReturnType(); //반환타입
			
			StringJoiner paramList = new StringJoiner(", ", "(", ")");
			
			for(Parameter param : paramArr) {
				String paramName = param.getName();
				Class  paramType = param.getType();
				
				paramList.add(paramType.getName() + " " + paramName);
			}
			
			System.out.printf("%s %s%s%n", returnType.getName(), name, paramList);
		}
	} // main
}

MethodCall.java

컨트롤러 동작을 작성한 예제

해쉬맵을 만듬.
해쉬맵을 컨트롤러에 전달.
컨트롤러에서 해쉬맵을 작업 후 뷰 이름을 반환.

render메서드는 해쉬맵과 뷰이름을 매개변수로 받아서
뷰이름.txt 파일을 한줄씩 읽고 내려가는 것을 반복하면서
String result에 하나의 문자열로 저장.
map에 담긴 key를 하나씩 읽어서 ${key}를 value로 변경.

package com.fastcampus.ch2;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

class ModelController {
	public String main(HashMap map) {
		//작업 결과를 map에 저장
		map.put("id", "asdf");
		map.put("pwd", "1111");
		
		return "txtView1"; //뷰 이름을 반환
	}
}

public class MethodCall {
	public static void main(String[] args) throws Exception{
		HashMap map = new HashMap();
		System.out.println("before:"+map);

		ModelController mc = new ModelController();
		String viewName = mc.main(map);
		
		System.out.println("after :"+map);
		
		render(map, viewName);
	}
	
	static void render(HashMap map, String viewName) throws IOException {
		String result = "";
		
		// 1. 뷰의 내용을 한줄씩 읽어서 하나의 문자열로 만든다.
		Scanner sc = new Scanner(new File(viewName+".txt"));
		
		while(sc.hasNextLine())
			result += sc.nextLine()+ System.lineSeparator();
		
		// 2. map에 담긴 key를 하나씩 읽어서 template의 ${key}를 value바꾼다.
		Iterator it = map.keySet().iterator();
		
		while(it.hasNext()) {
			String key = (String)it.next();

			// 3. replace()로 key를 value 치환한다.
			result = result.replace("${"+key+"}", (String)map.get(key));
		}
		
		// 4.렌더링 결과를 출력한다.
		System.out.println(result);
	}
}
profile
안녕하세요!!

0개의 댓글