FrontController

disdos0928·2022년 6월 21일
0

Spring

목록 보기
8/18
post-thumbnail

서블릿에서 했을 때는 HttpServlet를 extends후
@WebServlet으로 url를 잡았지만.
이제 그런 건 없다

  1. POJO ( Plain Old Java Object )
  • 오래된 방식의 간단한 자바 오브젝트라는 말이다
    여러 프레임워크에 의존하면서 해당 프레임워크에 종속된 무서운 객체를 만들게 된것에서 반발해 사용하게 되었다.
    마틴 파울러라는 분이 만드신 용어라는데 기원을 말한게 좀 웃기다

간단히 말해 어디에 얽매이지 않고 객체지향성을 유지하는게 POJO라고 한다
근대 약간 내로남불 속성있어서 필요할때는 한다고 함

그런 의미에서 extends 받지 않고 스프링에게 생성을 지시한다


이 때 생성한 객체를 Bean이라 명칭한다.

@(Annotation | 어노테이션)은 프로그램에게 전달하는 주석 같은 느낌인대 이를 이용해 Bean객체로 등록 명시를 해야 한다


Bean 등록 Annotatin

클래스 레벨에서 선언시 공통주소
최상위경로 / member 으로 들어오는 모든 요청 캐치

@RequestMapping("/member") 
public class MemberController 

메서드 레벨에서 선언시 공통주소로 들어온 후 상세 주소를 의미
최상위경로/member/login 으로 들어오는 요청 캐치( Get/Post 상관 X)

@RequestMapping("/login")
public String login(HttpServletRequest req){

@Component

  • 해당 클래스를 Bean으로 등록해라 (WebServlet 같은 느낌?)

@Controller

  • 해당 클래스를 Bean으로 등록하면서 Controller인것을 동시에 지정

@RequestMapping ("url")

  • Bean으로 등록하면서 괄호 안에 요청 주소에 일치하는 모든 주소를 잡아낸다
  • ex ) ("/member") == member로 들어오는 모든 요청을 처리하는 FrontController (Get/Post구분 안함.)

@GetMapping("url")

  • url요청중 Get요청만 처리한다
  • 메서드 레벨에서만 작성 가능하다

@PostMapping("url")

  • url요청중 Post요청만 처리한다
  • 메서드 레벨에서만 작성 가능하다

Parameter Annotation

@RequestParam

@RequestParam("name속성값") 자료형 변수명

  • name속성에 맞는 속성값이 오른쪽의 자료형의 변수명에 자동으로 대입된다

@RequestParam(value="name속성값",required=(T/F)자료형 변수명

  • value는 name 이름이 들어가야한다
  • required에는 True / False만 들어 갈 수 있다.
  • required = true일때 value의 name 속성값이 없으면 400에러
  • required = false일때 value의 name 속성값이 없으면 null 대입

@RequestParam(value="name속성값",required=false,defaultValue='값')

  • parameter가 false일 경우 null 대신 defaultValue값을 대입한다.

서블릿 프로젝트할때 맨날 봤던 NullPointerException 안봐도 된다
Int형으로 변수 지정시 자동으로 parse 된다

@ModelAttrubute(parameter)

@ModelAttrubute VO타입 변수명.

이게 진짜 무친 개꿀인거같다
VO타입에 맞게 작성하면 전달 받은 파라미터중
Name 속성 이름과 변수명이 동일하면 자동으로 대입된다
무친 효율
이때 VO에 없는 데이터는 null 대입된다
Int 자료형의 파라미터가 없을 경우 0이 초기값이 되는데
null 필요하면 int가 아니라 integer로 선언하면 될 것 같다

이 떄! 반드시 필요한것


기본생성자
필드에 대한 Setter


반환

forward / redirect

처음에 class으로 들어오는 모든 요청을 잡은후
메서드를 선언하면서 반환형을 왜 String으로 하지 했는데
이것도 무친 효율이라 엄청 좋았다.

@PostMapping("/login") //위와 동일한 코드
public String login(Member member){
	// @ModelAttribute 생략 가능
	// -> 커맨드 객체라고 명칭함 (Model Attrbute가 생략된 상태에서 파라미터가 필드에 세팅된 객체 )

	logger.info("로그인 기능 수행됨");

return "redirect:/";
}

위의 예제가 [ 최상위경로/member/login ] 으로 Post 방식 요청이 들어올때 수행되는 함수인대 반환형이 String이다
이 때 반환되는 "redirect:/" 을 dispatcherServlet에서 받아
요청에 맞는 응답을 수행한다

위에서는 redirect : / 이라 최상위 경로로 재요청을 시도한다

다른 예제로는

@GetMapping("/signUp")
public String signUp() {		
	return "member/signUp";		
 }

이 메서드는 [ 최상위경로/member/signUp ] 으로 Get요청이 들어왔을때 수행되는 메서드다 redirect 명시가 없을 경우 자동적으로 forward가 수행된다
위의 경우 DispatcherServlet 에서 경로를 가공해
/WEB-INF/views/member/signUp.jsp라는 경로로 forward하게 된다


View를 선택하는 ViewResolver
<!-- View Resolver : Controller에서 반환된 문자열 앞 뒤의 Prefxi : 접두사 , Suffix: 후미사
그 이후 만들어진 경로의 JSP로 요청 위임을 수행한다 (forward)
		
단 , 반환된 요청의 문자열 시작이 Redirect일 경우 재요청을 진행한다(redirect)  -->
	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<beans:property name="prefix" value="/WEB-INF/views/" />
	<beans:property name="suffix" value=".jsp" />
</beans:bean>

0개의 댓글