Web/Spring국비지원 수업 정리

<Spring 국비지원 수업> parameter수신방식2, model과 view의 지정
깝몬 2023. 8. 8. 17:49

※ JAVA 버전 BuildPath에서 확인 후 수정하기

 

자신이 현재 가진 자바의 버전과 일치하지 않는다면 unbound나 빨간엑스가 생길 수 있다. 그때 꼭 이 설정을 잘 확인하자.

 

 

 

 

 

 

 

 

 

 

 

 

 

※조금 더 상세한 console 창 확인을 위해 log4.xml 설정 변경

log4j의 위치

 

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<logger name="com.mycom.app">
		<level value="info" />
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.beans">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="info" />
	</logger>

	<logger name="org.springframework.web">
		<level value="info" />
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="debug" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

 

이곳은 각 로그들에 대하여 콘솔창에 출력 되는 정보의 레벨 기준을 정하는 파일이다.

 

여기에서 root logger의 레벨이 원래는 warn 이었지만 더 상세한 정보들을 보기위해 debug단계로 내려 주었다.

 

 


parameter 수신하기 - 추가내용

@RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo

parameter를 받을때 이 것에 대한 정보의 필수성, 그리고 만약 값이 없을때의 기본값을 설정한다.

 

이것에 대해 실행시 잘 작동하는데

 

 

 

 

 

혹시 작동이 안 될 경우에 

pom.xml에

 

이 부분을 수정해주자. 버전이 낮아 작동하지 않는 경우도 있다.

 

 

 

 


Spring에서 다양한방식으로 model을 지정하기

@RequestMapping("/modelTest1")
public String modelTest1(HttpServletRequest request, 
                        HttpSession session,
                        Model model,
                        @ModelAttribute("PARMOD1") TestDTO t
        ) {
    t.setSearchKey("파라미터에 있는 서치타입");
    logger.info("modelTest1() 호출!");
    String testMsg = "-객체를 이용하고 있어욧!";
    request.setAttribute("REQMOD1", "request"+testMsg);
    session.setAttribute("SESMOD1", "session"+testMsg);
    model.addAttribute("MODMOD1", "model"+testMsg);
    List<String> hobbies = new LinkedList<String>();
    hobbies.add("춤추기");
    hobbies.add("신나게놀기");
    hobbies.add("클라이밍");
    TestDTO testDTO = new TestDTO("이름", hobbies, 2, "내용", "태풍") ;
    model.addAttribute("MODMOD2", testDTO);

    //속성명은 model값의 타입으로 사용되는 bean과 동일할 때에는 생략할 수 있다.
    model.addAttribute(testDTO);

    return "Test/model01";
}

 

다양한 방식을 종합적으로 모아놓았다. 하나씩 살펴보자.

 

 

 

1. request객체 이용 / session 객체 이용

 

request.setAttribute("REQMOD1", "request"+testMsg);
session.setAttribute("SESMOD1", "session"+testMsg);

이 부분이다. 우리가 jsp에서 배운것과 이번에도 차이가 크게 존재하지는 않는다.

 

다만 여기서 알아야할 차이점은 이제 우리가 session을 꼭 method내에서 선언할 필요 없이

 

method의 paramete의 method에서 선언 되어도 된다.

@RequestMapping("/modelTest1")
	public String modelTest1(HttpServletRequest request, HttpSession session	)

이렇게 작성되어도 사용에 문제가 없다는 뜻이다.

 

2. Model 객체 이용

@RequestMapping("/modelTest1")
	public String modelTest1(Model model){
    String testMsg = "-객체를 이용하고 있어욧!";
    model.addAttribute("MODMOD1", "model"+testMsg);
    }

Spring에서 새로 등장한 객체이다. addAttribute 메서드를 이용하면 위의 방식과 큰 차이 없이 출력도 할 수 있다.

 

 

 

3. parameter에서 먼저 Attribute를 선언하고 그 Attribute의 속성 지정

@RequestMapping("/modelTest1")
	public String modelTest1(@ModelAttribute("PARMOD1") TestDTO t){
    t.setSearchKey("파라미터에 있는 서치타입 필드");
    }

파라미터에서 아예 이름과 타입명 그리고 객체명을 지정 한 후 거꾸로 출력했을때도 문제 없이 잘 작동한다.

 

 

종합)

 

이 주제 처음 의 메서드가 실행되도록 주소를 입력하면

이와 같이 잘 작동된다.

 

 


ModelAndView를 이용하여 model과 view를 동시에 지정하기

1.Spring에서는 ModelAndView라는 객체를 이용해 view와 model 을 한번에 지정할 수 있다.

 

@RequestMapping("/modelViewTest1")
public ModelAndView modelViewTest1(ModelAndView mv) {
    // model과 view 작업 한번에
    // model 지정
    mv.addObject("MV1", "mv에 직접 넣은 String");
    // view 지정
    mv.setViewName("Test/modelView01");
    return mv;
}

1. return 타입을 ModelAndView로 지정 후 객체를 파라미터로 생성

 

2. 만들어진 객체를 이용해 model과 view 지정

 

3. return 하면 주소로 이동되며 model도 생성

 

이때 

 

		mv.setViewName("redirect:/paramTest1");

 

이러한 방식으로 포워드나 리다이렉트를 이용해 view를 지정할 수도 있다.

 

포워드와 리다이렉트의 차이를 내용이 더 복잡해지기 전에 다시 숙지해두자.

 

일단은 직접적인 주소가 forward이고 위와같이 언급한 방식이 redirect로 생각하자.