ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MVC 구조 이해
    Spring 2023. 3. 28. 10:45

    MVC

     : model - view - controller 로 웹 서비스를 데이터와 처리, 화면을 분리하는 방식

    프론트 엔드와 백 엔드가 나눠져 있기 때문에 협업할 때 유리하다.

     

     - Spring을 사용하면 서블릿 기반이 마련되어 있기 때문에 별도로 설정할 필요가 없다.

     

    MVC 방식은 항상 컨트롤러를 거쳐서 작동하기 때문에, 보안이 강화된다.

     

     - 모델 2 방식과 스프링 MVC

     - 스프링의 기본 흐름

     


    Controller

     - Java의 패키지중 하나로서 , 유저로부터 데이터를 받고 이를 처리 요청 및 뷰어로 전송하는 통로 역할을 한다.

     

     - HttpServletRequest, HttpServletResponse 를 거의 사용할 필요 없이 필요한 기능 구현

     

     - 다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용 가능

     

     - Get 방식, Post 방식 등 전송 방식에 대한 처리를 어노테이션으로 처리

     

     - 상속/인터페이스 방식 대신에 어노테이션 만으로도 필요한 설정 가능

     

     

    어노테이션

     : @Controller , @RequestMapping , @Overriding 과 같이 개발자가 기능을 사용하기 쉽게 도와주는 기능

     

     - 개발자는 Class에 다양한 역할을 맡길 수 있고 이 중에는 자주 사용되는 역할이 있을 것이다.

    어노테이션은 이런 역할을 구분해주고 기능을 좀 더 세부적으로 사용할 수 있도록 도와준다.

    package org.hj.controller;
    
    @Controller
    public class A {
    	@RequestMapping(value = "sample/aaa", method = RequestMethod.GET)
        public String A(Locale locale, Model model){
        	return A;
        }
        
    @Controller
    @RequestMapping(value = "sample")
    public class A {
    	@RequestMapping(value = "aaa", method = RequestMethod.GET)
        public String A(Locale locale, Model model){
        	return A;
        }
        
     - 두 코드는 결과가 같다.

     

    @Controller

     : 해당 클래스의 인스턴스를 스프링의 빈으로 등록하고 컨트롤러로 사용

     

    @RequestMapping

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

    스프링 4.3 이후에는
    @Controller
    public class A {
    	@RequestMapping(value = "sample/aaa", method = RequestMethod.GET)
        public String A(Locale locale, Model model){
        	return A;
        }
        
    대신 
    
    @Controller
    public class A {
    	@GETMapping(value = "sample/aaa")
        public String A(Locale locale, Model model){
        	return A;
        }
        
    로 줄여서 사용할 수도 있다.

    컨트롤러의 파라미터 수집

     : Java Beans 규칙에 맞게 작성했다면, 스프링 MVC 컨트롤러는 파라미터를 자동으로 수집, 변환하는 기능을 제공한다

    @GetMapping("/ex01)
    public String ex01(SampleDTO dto){
    	log.info("" + dto);
        
        return "ex01";
    }
    
    @Data
    public class SampleDTO{
    	private String name;
        private int age;
    }

     

    파라미터로 배열이 들어온다면?

    배열은 크기가 정해져있는 고정 배열과 데이터의 양에 따라 크기가 변하는 가변 배열이 있다.

     

    고정배열

     : int[ ] score = new int[5];    -> 5칸 짜리 고정 배열 선언

     

    가변배열

     : ArrayList<Integer> score = new ArrayList<Integer>

    -> 배열 내부의 값에 따라 배열의 크기가 변한다.

    ArrayList는 자동 정렬 기능이 있다

    검색할 때 느리다.

     

     - 가변배열과 반대되는 형태로 Hashmap이 있다.

    Hashmap은 index가 아니라 해시맵(key와 같음, 하나의 키에 하나의 값만 저장 가능) 을 이용해서 검색하기 때문에, 검색 속도가 매우 빠르다.

    하지만 정렬 기능이 없기 때문에, 해시맵에 저장된 데이터를 정렬해서 보고싶다면 다른 요소의 힘을 빌려야한다.

     


    Model의 데이터 전달

     : controller에서 데이터를 수집할 수 있다고 배웠다. 그렇다면, 이 데이터를 저장 / 처리하고나서 어떻게 유저에게 돌려줄까? 이 역할은 Model이 한다.

    Model 객체는 JSP의 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 한다.

    클래스를 이용해서 데이터를 전달하는 방법
    
    public String home(Model model){
    	model.addAttribute("serverTime",new java.util.Date());
        return "home";
    }

     

     

    @ModelAttribute

     : 어노테이션을 이용해서 데이터를 전달할 수도 있다.

    컨트롤러에서 메서드의 파라미터는 기본자료형을 제외한 객체형 타입은 다시 화면으로 전달한다.

    @GetMapping("/ex04")
    public String ex04(SampleDTO dto, @ModelAttribute("page") int page){
    
    	log.info("dto:" + dto);
    	log.info("page:" + page);
        
        return "/sample/ex04";
    }

     - @ModelAttribute 어노테이션을 사용하면 원하는 데이터를 바로 화면에 뿌려줄 수 있다.

     - 위에서 선언된 @ModelAttribute("page") int page 로 인해, int page를 <h2> 태그 내부에 바로 전달할 수 있었다.

     


    RedirectAttribute

     : 컨트롤러에서 다른 컨트롤러로 데이터를 전달할 때 사용하는 객체

    화면에 한번만 전달되는 파라미터를 처리하는 용도,

    내부적으로 HttpSession 객체에 담아서 한번만 사용되고, 폐기된다.

     

     - 게시판 수정의 가장 아레에 있는 redirect:/detail 이 실행되면, rttr.addAttribute() 데이터를 가지고 게시판 상세 페이지로 이동하는 /board/detail 컨트롤러를 실행한다. 

    그 결과로, /board/modify 컨트롤러가 가지고 있는 데이터로 /board/detail 컨트롤러를 실행하여, 원하는 페이지, 원하는 데이터를 얻을 수 있다.


    Controller의 리턴 타입

     : 컨트롤러는 데이터를 리턴할 때 데이터의 타입에 따라 주로 취급하는 데이터를 구분한다.

     

    String : jsp를 이용하는 경우, Jsp 파일의 경로와 파일의 이름을 나타내기 위해서 사용

    void : 호출하는 URL과 동일한 이름의 jsp를 의미

    VO, DTO 타입 : 주로 JSON 타입의 데이터를 만들어 반환하는 용도 ( 추가적인 라이브러리 필요 )

    ResponseEntity 타입 : response 할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용 ( 추가적인 라이브러리 필요 )

    Model, ModelAndView : Model로 데이터를 반환하거나 화면까지 같이 지정하는 경 우에 사용 (최근에는 많이 사용 x ) HttpHeaders : 응답에 내용 없이 Http 헤더 메시지만 전달하는 용도로 사용

     

    1) void 타입

     : 호출하는 URL과 동일한 이름의 jsp 파일

    @GetMapping("/ex05")
    public void ex05(){
    	log.info("/ex05......");
    }

     - > 특정 폴더 내부의 ex05.jsp 파일을 실행한다.

    ( 실제 주소와 jsp파일의 이름이 같다면 리턴이 없어도 정상적으로 이동할 수 있지만, 이름이 다르다면, 원하는 jsp 파일을 리턴해줘야한다. )

     

    2) String 타입

     : 상황에 따라 다른 화면을 보여줄 필요가 있을 경우 사용할 수 있다.

    String 타입에는 특별한 키워드를 붙여서 사용할 수 있다.

     - redirect : 리다이렉트 방식으로 처리하는 경우

     - forward : 포워드 방식으로 처리하는 경우

    ** 쉽게 말해서 return 타입을 String으로 지정한다는 뜻은, return을 통해 브라우저에 나타내고자 하는 파일을

    URL에 상관없이 제어하고 싶을 때 사용한다. 

     

    3) 객체 타입

     : XML / JSON으로 처리한다.

    @RepsoneBody 어노테이션과 같이 사용

     

    4) ResponseEntity

     : Http 헤더 정보와 추가적인 데이터를 전달할 때 사용

    특히 비동기식 함수의 경우 결과가 화면에 나타나지 않기 때문에 서버와 연결이 잘 됐는지 확인하는 용도

     

Designed by Tistory.