스프링 MVC 순서
초기 설정
1. pom.xml 작성 (라이브러리 가져오기)
2. web.xml 작성 (미리 객체를 생성)
3. servlet-context.xml 객체 생성 (사용자마다 객체 각각 지급 / 컨트롤러, 뷰 리졸버, 핸들러 매핑)
root-context.xml 객체 생성 (모든 사용자가 하나의 객체를 공유)
초기 설정 후
4. DTO, Table 작성
5. 컨트롤러(전처리, 모델이동)
6. 서비스, 리퍼지토리
7. 컨트롤러(뷰이동)
8. 뷰작성
계층적 구조
- 도메인 객체 : 객체 정보를 저장하는 변수의 묶음이다.
- 퍼시스턴스 계층 : 데이터베이스나 파일에 접근하여 데이터를 처리한다.(Repository)
- 서비스 계층 : 프레젠테이션 계층(Controller)과 퍼시스턴스 계층(Repository) 사이를 연결하는 역할을 한다.
- 프레젠테이션 계층 : 사용자와의 최종 접점으로, 데이터를 입력받거나 데이터 결과를 웹 서버에 전달하여 사용자에게 보여주는 계층이다.(Controller + View)
DTO 작성 순서
- 클래스 생성
- 변수 선언
- getter / setter (이클립스 source에서 생성)
- 생성자
- toString (system.out.print로 나중에 값을 찍어보기 위함)
컨트롤러
- 매핑 @RequestMapping("/매핑태그")
- 객체확보 @autowired
- 전처리
- 모델 이동
- 뷰 이동
스프링의 빈(bean) 객체로서 @Controller를 클래스 위에 명시하면 스프링 컨테이너에 의해 자동으로 객체생성된다.
(빈(bean) 객체는 스프링에 의해 생성되고, 싱글턴이라는 특징이 있다.)
@Controller를 클래스 위에 적으면, 디스패쳐서블릿 안에 있는 서블릿 컨테이너에 의해서 객체생성 되게 되는데, 이 방법으로 객체생성이 되기 위해서는 servlet-context.xml 파일에서 <context:componet-scan base-package="패키지 이름"/> 태그를 통해서 등록해야한다.
이 과정에서 해당 패키지에 *을 적용하면 패키지에 있는 어노테이션 태그가 모두 등록된다.
(예시 : "com.springmvc.*")
자동이 아닌 수동으로 등록하는 방법도 있다.
<beans:bean class="com.springmvc.controller.HomeController"/>
<beans:bean id="bookRepositoryIpml" class="com.springmvc.repository.BookRepositoryImpl"/>
<beans:bean id="bookServiceImpl" class="com.springmvc.service.BookServidceImpl">
<beans:property name="bookRepository" ref="bookRepositoryImpl"/>
</beans:bean>
<beans:bean class="com.springmvc.controller.BookController">
<beans:bean name="bookService" ref="bookServiceImpl"/>
</beans:bean>
위의 코드를 그대로 작성하면 자동 등록과 같은 기능을 구현할수 있다.
보통은 자동으로 등록하지만 수동으로 등록하는 방법도 알고는 있는편이 좋다.
여기서 id는 참조변수, property는 파라미터, name은 key인 셈이다.
@RequestMapping을 이용한 요청 매핑 경로 설정
@RequestMapping은 클래스와 메서드에 사용할수 있는데 클래스에 사용하면 클래스수준, 메서드에 사용하면 메서드수준 이라고 한다.
기본적으로 메서드수준은 클래스수준의 하위로, 이는 URL로 이동할 때 차이가 난다.
@Controller
@RequestMapping("/home")
public class test {
@RequestMapping
public void test2(){}
}
이런 코드가 있다고 가정하면 URL주소는 http://localhost8080/프로젝트/파일명/home 가 된다.
이 경우에서는 클래스수준에서는 매핑이 존재하지만 메서드급에서는 존재하지 않기 때문에 디폴트 값으로 반영된다.
만약 메서드에 있는 매핑이 @RequestMapping("/exam") 이라고 가정하면
메서드 수준에 접근하는 URL주소는 http://localhost8080/프로젝트/파일명/home/exam이 된다.
이를 이용해서 메서드를 2개 이상 두고, 매핑되는 값을 하나는 주지않고, 하나는 exam으로 주면 http://localhost8080/프로젝트/파일명/home 까지만 입력하면 디폴트로 이동하고, http://localhost8080/프로젝트/파일명/home/exam까지 주면 exam을 매핑한 메서드로 이동하게 할수있다.
또한 스프링에서는 클래스수준과 메서드수준을 구분하기 위해서 메서드수준 매핑에는 @GetMapping, @PostMapping을 주로 사용하는데 이는 JSP에서 컨트롤러에서 doGet과 doPost를 떠올리면 쉽게 이해할수 있다.
정리하자면 클래스수준, 메서드수준 모두 @RequestMapping을 사용 가능하지만, 메서드수준에는 클래스와 구분하기 위해 @GetMapping, @PostMapping을 사용하며, 이 둘의 차이는 JSP의 doGet과 doPost의 차이와 같다.
Model 유형
Model은 스프링에서 쓰이는 기본 객체로 JSP의 request나 session과 비슷하다고 생각하면 된다.
대신 모델은 세션과 리퀘스트와는 다르게 한번 집어넣으면 다시 꺼내서 사용할 필요 없이 바로 사용할수 있다.
모델에는 Model, ModelMap, ModelAndView가 있는데 Model과 ModelMap은 이름 빼고는 완전히 동일하고, ModelAndView는 사용하기 위해서 따로 객체생성을 해야하기 때문에 번거롭다.
Model 사용 예시
public String requestMethod(Model model) {
model.addAttribute("key", value);
return "view_name"
}
ModelAndView 사용 예시
public ModelAndView requestMethod(ModelMap model) {
ModelAndView mav = new ModelAndView();
mav.addObject("key", value);
mav.seViewtName("view_name");
return mav;
}
모델과 모델앤뷰는 과정은 다르지만 결과는 같기 때문에 모델을 사용하면 된다.
경로 변수
웹 요청 URL에 포함된 파라미터 값을 전달받는데 사용하는 변수이다.
http:// ... /cars/red 라는 URL을 전달 받으면
...
@GetMapping("/cars/{color}")
public String requestMethod(@PathVariable String color, ...)
위와 같이 매핑 뒤에 변수를 지정해놓고 해당하는 값을 변수로 받아서 color 변수에 red 라는 값을 집어넣는 방법이다.
매핑에서 받는 변수 이름과 메서드에서 받는 변수이름이 같으면 @PathVariable만 적어두면 되고, 이름이 서로 다르면 @PathVariable("color")와 같은 형태로 color 변수를 받는다고 표시해주고, 뒤에 String 변수명을 적어준다.
@GetMapping("/cars/{color}")
public String requestMethod(@PathVariable("color") String design, ...)
이렇게 설정하면 color에 해당하는 값을 @PathVariable("color")이 받아서 design 변수에다가 red 라는 값을 넣어준다.
'프로그래밍 공부' 카테고리의 다른 글
2025.03.13 스프링 공부 (0) | 2025.03.13 |
---|---|
2025.03.12 스프링 공부 (0) | 2025.03.12 |
2025.03.10 스프링 공부 (0) | 2025.03.10 |
2025.03.07 스프링 공부 (0) | 2025.03.07 |
2025.03.04 SQL 공부 (0) | 2025.03.04 |