Spring

08_Controller (미완성... 분량폭발)

계피러버 2022. 8. 5. 01:12

 

 

Spring Controller

MVC패턴 중 컨트롤러에 해당하는 부분이다.

Component이기 때문에 Spring Context에 의해 자동으로 수거된 후 필요할 때 호출됨.

 

GET/POST 등 여러 메서드에 관한 처리도 annotation으로 쉽게 구현할 수 있다. 

 

ex. 

 


@Controller

해당 클래스를 MVC 패턴의 컨트롤러 역할을 하는 컴포넌트라고 표시한다.

 

@RepuestMapping(value=" ", method=" ")

사용자의 요청 URI와 해당 컴포넌트 또는 메서드를 매핑시키는 annotation

value : 요청 URI 설정

method : 요청 방식 설정

URI와 method는 {}를 사용해 복수 지정 가능

 

근데 여기서 더 짧게 줄일 수 있음!

 

@GetMapping(value=" ")

@Request(value="URI", method = RequestMethod.GET) 와 같음 

 

@PostMapping(value=" ") 

@RequestMapping(value="URI", method = RequestMethod.POST) 와 같음 

 

 

 

@RequestMapping(value="URI", method="요청방식") 사용 예시

package com.ezen.springmvc.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Log4j2
@RequestMapping(value= {"/hello", "/hi", "/welcome"})
@Controller
public class HelloController {
	@RequestMapping(
			value = "/news", 
			method = {RequestMethod.GET, RequestMethod.POST})
	public String news() {
		log.info("컨트롤러에는 잘 도착함");
		
		return "hello/news";
	}
}

 

1.

 

컨트롤러 역할을 할 클래스 이름 위에 

@Controller 어노테이션과 

@RequestMapping("URI") 어노테이션을 달아주기

URI는 중괄호{ }를 사용해서 복수 지정 가능 @RequestMapping({"/hello", "/hi", "/welcome"})

 

2.

컨트롤러 안에서 요청을 받을 메서드도 @RequestMapping 어노테이션으로 주소 매핑 해주기

@RequestMapping(value="/news", method={RequestMethod.GET, RequestMethod.POST})

메서드도 중괄호{ } 사용해서 복수 지정 가능

 

3. 

메서드가 요청을 잘 받았는지 확인하기 위해

log.inf("컨트롤러에는 잘 도착함") 를 콘솔에 출력

콘솔에 출력할 지 파일에 출력할 지는 log4j2.xml의 맨 아래 <Root>태그 내에서

</appenderref ref="file" > <AppenderRef ref="console" />  로 조절할 수 있음

log4j에 대한 더 자세한 설명은 https://cinnamonlover.tistory.com/237

 

4.

메서드의 리턴값은

WEB-INF/views/  와  .jsp 사이에 들어갈 값으로 지정. 

 

src - main - webapp - WEB-INF - spring - appServlet - servlet-context.xml로 들어가서 

'컨트롤러에서 선택된 뷰를 /WEB-INF/views폴더 내부의 .jsp파일로 이어주는' 코드 부분을 보면

prefix와 suffix에 Controller의 메서드가 리턴한 값의 앞과 뒤에 붙을 문자열들이 각각 지정 돼 있음

 

그니까 메서드에서 "hello/news"를 리턴하면

해당 메서드가 들어 있는 클래스 위에 매핑된 /hello과 해당 메서드 위에 매핑된 /news를 이용해 

기본주소 + /hello/news 즉 http://localhost:8888/springmvc/hello/news로 접속했을 때

"/WEB-INF/views/hello/news.jsp" 파일이 보여지는 것 

 

 

 

 

 


Spring의 Controller는 JSP의 Process와 비교하면 될 듯

Controller : Controller내부의 메서드들 = Process 인터페이스 : Process인터페이스를 구현한 블라블라Process클래스

대충 이런 느낌? 

 

Process인터페이스를 구현하는 클래스들은 jprocess메서드 내부에서 request로 받은 데이터를 처리한 후 return "주소값"을 했었는데 그 리턴값이 Dispatcher Servlet으로 갔었지?

Spring의 Controller로 지목된 클래스 내부의 메서드가 주소값에 포함될 문자열을 리턴하는 거랑 같네

Spring에는 DispatcherServlet이 미리 구현 돼 있고 그 내부가 어떤진 몰라도 저 return값이 DispatcherServlet으로 가서 

prefix, suffix붙고 이런저런 처리가 되어서

http://localhost:8888/springmvc/hello/news로 접속했을 때 /WEB-INF/views/hello/news.jsp 파일이 뜨는 것 같음

 

 

 

 

 

 

 

 

 

 

 

 

 

 

# 컨트롤러 파라미터 자동 수집 기능

컨트롤러 역할을 하는 메서드의 매개변수로 자바빈 스타일의 데이터 클래스를 사용하면 

데이터 클래스 필드의 이름과 매개변수의 이름이 일치한다는 조건 하에 자동으로 바인딩한다. 

 

여기서 '자동으로 바인딩한다'는 건

해당 인스턴스의 내용을 자동으로 채운다는 뜻.

(=데이터 클래스의 멤버변수들을 매개변수로 전달된 값들로 자동으로 채운다)

 

바인딩
컴퓨터 프로그래밍에서 각종 값들이 확정되어 더 이상 구속할 수 없는 상태가 되는 것
메모리에 값을 할당하는 것 또한 바인딩이라 할 수 있다.

 

 

자동으로 바인딩되면서 데이터 타입도 알아서 해당 데이트 클래스 필드의 타입으로 캐스팅 된다.

 

 

 

 

 

 

 

 

바인딩 정의 출처 (설명 되게 잘 돼 있음)

https://m.blog.naver.com/reeeh/220716449491

 

자바 :: 바인딩(binding)

안녕하세요~ 프로입니다! 본 포스팅도 'Cory Kim'님의 요청으로 시작되었어요!! 이번 포스팅에서는 바인...

blog.naver.com