96일차 Spring Controller 에서 어노테이션

쿠우·2022년 8월 17일
0

-MVC에 대해

  • ApplicationContext => WebApplicationContext
    -> Spring container가 존재하는 영역
  • context내에 주입되는 bean은 root-context.xml 나 servlet-context.xml이나 runtime시 동일하다 .
    (container안에서 생성 주입된다.)
    -프로젝트의 루트 경로는 / 만들어준다. (pom.xml 의 finalName 태그)

스프링MVC의 기본

-servlet 기반이긴 하지만 한 단계 더 추상화된 수준의 개발 지향
-servlet API없이도 개발이 가능한 수준
-개발자는 Servlet/JSP의 API신경을 쓰지 않고 웹앱 제작
-Servlet/JSP에 대해 내부적으로 Spring MVC가 처리한다.

스프링 MVC의 기본흐름

(밑에 모든 것은 Bean이다)

(1)DispatcherServlet > (2)HandlerMapping >
(요청이 들어오면 해당 매핑에 관련된 Controller를 찾아야한다고 알려준다.)

DispatcherServlet > (3)HandlerAdapter > (4)Controller > HandlerAdapter >
(지시된 Controller와 연결하여 model의 처리결과를 다시 넘겨준다.)

DispatcherServlet > (5)Viewresolver > DispatcherServlet >
(6)View > DispatcherServlet
(모델을 어떻게 View를 만들어야하는지 Viewresolver에게 물어보고 알려주면 해당 View를 응답한다.)


Web 3계층

(1) Presentation(표현) - 화면을 만들어 내는 계층
- Spring MVC framework
- User-defined Controller (@Controller), JSP

(2) Business (== Service) - 핵심 비지니스로직 수행 및 Model 생성
- @Service 서비스 객체가 해당
- 핵심 비지니스로직 수행 및 Model 생성

(3) Persistence(== DAO) - Database 조작
- @Repository DAO객체가 해당
- 대신, MyBatis's Mapper Interface 로 단방에 구현("자동실행규칙"필요)


Controller

  • HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현
  • 다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용 가능
  • GET 방식, POST 방식 등 전송 방식에 대한 처리를 어노테이션으로 처리 가능
  • 상속/인터페이스 방식 대신에 어노테이션만으로도 필요한 설정 가능

- @Controller, @RequestMapping에 대해

@Controller – 해당 클래스의 인스턴스를 스프링의 빈으로 등록하고 컨트롤러로 사용
<component-scan>과 같이 활용

@RequestMapping – 특정한 URI에 대한 처리를 해당 컨트롤러나 메서드에서 처리

-기본 예제

알아본 점
(1)@Controller는 bean추가해주는 기능까지 해준다.
(2)@RequestMapping 안에서 요청방식을 정하기도 하지만 @GetMapping/@PostMapping 등 어노테이션 따로 정의
(3)return 타입이 void 일 때 반환되는 view 이름은 Request URI뷰의 이름 반환

// 기본적으로  Spring beans container에 등록될 클래스는 자바빈즈 규약을 지키는 "자바빈즈" 클래스이다.
@NoArgsConstructor
@Log4j2

//전체요청 URI == BaseURI + Detail URI
@RequestMapping("/board/")
@Controller // 현재의 클래스의 역할: Controller 정의
public class SempleController {

	//컨트롤러에 선언되는 메소드 => 컨트롤러의 핸들러라고 부른다. 
	// 그럼 무엇을 핸들링하느냐 => 특정 request를 처리한다(handling)는 의미 
	// (1) 어떤 전송방식 (2) 어떤 Request URI를 가지고 들어온 Request를 처리하겠다 라는 의미 
	// 위의 2가지 정보를 설정하는 어노테이션이 바로 @RequestMapping이다. 
	@RequestMapping(
			path={"/doA" ,"/doB"}, 
			method= {RequestMethod.GET , RequestMethod.POST})
	public void doA() { 
		log.trace("doA() invoked");
	}// doA
	
//	@RequestMapping("") // Request URI =  BaseURI + Detail URI => "/board/" + "" => /board/
	@RequestMapping //Request URI =  BaseURI + Detail URI => "/board/"  => /board/
	public void basic() {
		log.trace("basic() invoked.");
		// return type이 void 일 경우  Request URI 뷰의 반환이름이 된다.
		// 반환되는 뷰의 이름 = Request URI when return type is void
	}// basic
	
	
//	@RequestMapping(path="/basicOnlyGet",method=RequestMethod.GET)
	// 각각의 매핑어노테이션이 다 존재한다. 
	@GetMapping("/basicOnlyGet")
	public void basicOnlyGet() {
		log.trace("basicOnlyGet() invoked.");
	}// basicOnlyGet
	
	@PostMapping("/basicOnlyPost")
	public void basicOnlyPost() {
		log.trace("basicOnlyPost() invoked.");
	}// basicOnlyGet
	
	
	// 컨트롤러의 핸들러는 아래의 역할 및 값을 반환: 
	// 1. 역할 : 요청을 위임받아 처리 
	// 2. 뷰의 이름을 반환 
	// 3. 역할에 따라, 요청을 위임처리한 결과 => Model(비즈니스 데이터)을 생성 및  View로 전달
	@GetMapping("/ex01")
	public String ex01() { 
		log.trace("ex01() invoked.");
		
		
		// View Resolver의 설정에 따라 
		// Prefix +ViewName + Suffix  =  /WEB-INF/views/ +  /ex01 +  .jsp
		return "ex01"; // MVC패턴에서 , View의 이름 
	}// basicOnlyGet
	
	
}// end class
profile
일단 흐자

0개의 댓글