-
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 헤더 정보와 추가적인 데이터를 전달할 때 사용
특히 비동기식 함수의 경우 결과가 화면에 나타나지 않기 때문에 서버와 연결이 잘 됐는지 확인하는 용도
'Spring' 카테고리의 다른 글
프로젝트의 구조 (0) 2023.03.29 기본 Spring 프로젝트 둘러보기 (0) 2023.03.28 Spring (in eclips) jar 파일 에러 발생 시 (0) 2023.03.27 servlet-context (controller 작동 방식) (0) 2023.03.27 eclips 에서 Spring 다운로드 / 실행 (0) 2023.03.27