프레임워크 MVC Chapter-5

robin Han·2023년 4월 3일
0

Spring

목록 보기
6/13

MVC 프레임 워크

  • 자바 웹 어플리케이션 설계 방식 (model 1, model2 , front-controller)
  • 모델 , 뷰 , 컨트롤러에 각자의 인터페이스가 있어 약한 결합도와 유연하고 확장하기 쉬움
  • 다양한 라이브러리 연계

model 1

  • JSP만 사용하여 개발하고 Java Bean 포함하여 개발
  • View 와 business logic 혼합
  • 큰프로젝트에 유지보수 어려움

model 2

  • model , view , controller 분리
  • controller 데이터처리
  • view : 화면상의 처리
  • model : 뷰에 필요한 비즈니스 데이터 처리

Front Controller pattern

모든 servlet을 빈을 등록해서 필요할때만 생성하여 사용
하나의 프론트 컨트롤러로 여러 컨트롤러관리
DispathcerServlet

실행 순서

1) dispatcherservlet http 요청 받음
2) DispatcherServlet은 알맞는 Controller로 HTTP 요청 위임
3) 클라이언트 요청을 처리하기위해 DAO 객체 호출
4) DAO 객체에 엑세스하여 model객체를 생성하고 결과 반환
5) DispatchServlet이 처리결과에 뷰에 화면 처리 요처
6) 화면처리 및 모델객체
7) http 응답

구성요소

annotation-driven: 여러가지 애노테이션을 사용할때 annotation-driven에 설정이 되어있어야된다. 활성화 시켜주는 태그

애노테이션 타입

@Component로 모든걸 사용했어지만 spring에서 확장을 하여 계층마다 애노테이션 분리

@RestController: RestAPI를 위한 컨트롤러,

라이브러리 설정

spring-webmvc : spring-web + spring-context
hibernate- validator: VO값의 유효성 검사, 예) not null..

웹 애플리케이션은 메인이 없기 때문에 Tomcat의 요청을 받는 시점이 시작 동작

ContextLoadListener

@Service 와 @Repository 빈들을 등록
이벤트가 발생하면 클래스를생성
톰캣이 생성될때 이벤트를 받는 시점에 리스너가 실행됨

DispatcherServlet

@Controller 또는 @Component 의 서블릿들을 빈으로 등록

모든 서블릿들이 DispatcherServlet 컨테이너인 appServlet을 통하고 가게 설정

<servlet-mapping> 
 <servlet-name>appServlet</servlet-name>
 <url-pattern>/</url-pattern>
</servlet-mapping>

@PostConstruct

빈 생성후에 초기화 애노테이션으로 초기화

public void init(){
	codes
}

@RequestMapping

@RequestMethod.Post

jsp 에 있는 테그 안에 있는 name="" 부부과 value object vo 의 겍체 변수명이 똑같아야함.

Rest 아키텍처

Representational State Transfer
http 프로토콜 매소드를 통해서 (GET, POST, PUT , DELTE) : json 또는 XML , YAML 형식으로 전송

jacjson-databind : json을 사용하기 위한 라이브러리

-----pom.xml
<dependency> 
	<groupId>com.fasterxml.jackson.core</groupId> 
   <artifactId>jackson-databind</artifactId> 
   <version>2.12.6</version>
</dependency>

@RestController

REST API 제공하는 컨트롤러: @Controller + @Responsebody

@RequestBody

요청된 HTTP request body를 해당 매개변수에 바인딩

@ResponseBody

반환값을 HTTP response body에 바인딩 메소드에 Content-type에 정의를 해주면, 해당 지정되있는 타입으로 변환을 해주는데 HTTP Message converter를 사용한다.

ResponseEntity

반환하는 response의 객체로 , statusCode, headers, body 3가지 속성값이 있다.

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<StudentVO> readMember(@PathVariable String id) throws Exception {
	StudentVO student = memberService.readMember(id);
	logger.info(" /member/rest/{id} REST-API GET method called. then methodexecuted."); 
    HttpHeaders headers = new HttpHeaders();
	headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8"))); 
    headers.set("My-Header", "MyHeaderValue");
	return new ResponseEntity<StudentVO>(student, headers, HttpStatus.OK);
}

Quiz 정리

1) 자바웹 어플리케이션 패턴 3개 차이점

Model 1 : JSP만 사용해서 개발 하거나, Java Bean을 포함하여 개발 , 유지보수가 어렵고, 복잡도 높음
Model 2 : Model- View - Controller 로 분리하여 결합도 낮춤.
FrontController : 클라이언트 요청을 나누어서 실행 해당 기능별 요청별로 서브 컨트롤러로 이동하여 처리한다 이때 사용하는게 DispatcherServlet 과 Hanlder mapping

2) 프론트컨트롤러 에서 실행 패턴 절차들 쭉 설명

1. DispatcherServlet이 HTTP 요청 받음 
2. DispatcherServlet은 알맞는 Controller로 HTTP 요청 위임 
3. 해당 Controller 클라이언트의 요청 처리를 위해 DAO 객체 호출 
4. DAO 객체는 소스를 액세스해서 Model 객체를 생성한후 요청 결과 리턴 
5. DispatcherServlet 은 처리결과를 알맞는 뷰에 화면처리 요청 
6. 선택된 뷰를 화면처리 
7. HTTP 응답 보낸다.

3) mvc 모듈 구성 요소

4) rest컨트롤러 애노테이션 의미

@RestController = @Controller + @ResponseBody
@Controlller는 알맞는 비즈니스 로직으로 요청을 보내고 응답을 받아서, 알맞는 뷰로 처리하는 역할을 한다
이때 처리된 내용이 어떤것인지에 따라서 달라지는데, 뷰가아닌 데이터로 처리할때 JSON 형태로 보내고 싶으면 @ResponseBody 사용해서 해당 데이터들을 ResponseEntity로 감싸서 보내주면 된다.

@ResController 는 이렇게 나누어서 하는 작업을 합쳐서 더 편리하게 사용할수있다.

5) 웹어플리케이션 컨택스트 만드는과정 설명(디스패치~)

ContextLoadListner: @Service, @Repository 클래스 등록
DispatchServlet : @Controller 또는 @Component 클래스 등록

모든 컨트롤 클래스에 @Controller 설정
@RequestMapping 사용하여 URL 매핑 설정
@RequestParam HTTP요청 파라미터를 메소드의 파라미터로 전달 받을때 사용
반환은 View

annotation-driven : MVC를 사용할때 ,필요한 컴포넌트 빈 등록을 자동으로 수행, 찾은 빈과 URL 맵핑

context:component-scan: base-package 에있는 @Controller로 지정된 컨트롤러 검색해서 빈으로 등록


//Dispatcher 설정
------- servelt-context.xml--------
<annotation-driven/>
<resources mapping="경로"...>
<beans> 뷰파일ㅇ 위치 
<context:component-scan base-package="controller"/> 

//ContextLoadListner
---------root-context.xml------------
<context: component-scan base-packe ="service"/> 

6) 매개변수 받는 방식의 차이점

1. @PathVarible : URL 경로에 있는 변ㅅ 값을 전달하여 매핑 
2. @RequestParam : 요청 파라미터 값을 적용변수로 전달  파라미터 값이 기본으로 required 여서 꼭 하			나의 파라미터는 필요하다.
3. @MoldetAttribute : 요청 파라미터 값을 적용변수로 전달 폼형태로 HTTP body 보냄  객체에 바인딩 
4. @RequestMapping(value={"/tryC", "/tryD"}) : 배열 형태의 값을 지정 하거나, 하나이상의 URL  사용. 

7) 애노테이션들은 기본적으로 외우고

@RequestMapping :
@ModelAttribute
@PathVaariable
@RequestParam
@MatrixVariable
@RequestBody

@PreDestroy
@PostConstruct

7) rest아키텍처 관련내용 + 관련 애노테이션 설명

클라이언트와 서버 사이에 데이터 연동
웹상의 정볼르 리소스 확인해서 URL 할당해 고유 주소로 지정
HTTP 프로토콜로 리소스 접근하고, 처리 결과를 JSON 또는 XML로 전송
GET, POST , PUT, Delete

JSON을 사용하기위해, Jackson-databind 라이브러리 사용

관련애노테이션:

  • @RestController : REST API 제공하는 컨트롤러
  • @ReqeustBody : HTTP requestbody 매개변수에 바인딩
  • @ResponseBody : 반환값이 HTTP responsebody에 바인딩
  • ResponseEntity: HTTP 응답으로 statusCode , headers , body 3가지 속성 있다.

8) 예외처리 관련 애노테이션

  • 컨트롤러 별로 예외 처리 : 하나의 컨트롤러 메서드에 @ExceptionHandler 지정해서 예외 처리

  • 하나의 웹애플리케이션 단위로 공통 예외 처리: 공통되는 예외처리 클래스에 @ControllerAdvice 설정

9) 스프링 mvc적용할때 선언하는 문장 쓰게되면 mvc애노테이션 활성화 시켜주는

0개의 댓글