Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

프로그래밍 끄적끄적

[SpringBoot] 스프링 MVC 본문

백엔드/스프링

[SpringBoot] 스프링 MVC

soeunkk 2022. 1. 19. 15:40

1. 스프링 MVC가 View를 찾을 수 있도록 설정

resource > application.properties 파일에 하단의 설정 추가

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

line 1) spring.mvc.view.prefix: spring mvc가 찾을 뷰 경로를 설정

line 2) spring.mvc.view.suffix: 뷰로 인식할 확장자를 설정

 

2. 스프링 MVC 적용하기

1) 폼 만들기 컨트롤러

1
2
3
4
5
6
7
8
@Controller
public class SpringMemberFormControllerV1 {
 
    @RequestMapping("/springmvc/v1/members/new-form")
    public ModelAndView process() {
        return new ModelAndView("new-form");    //application.properties에 적혀진 내용에 따라 해당 뷰를 찾음
    }
}
cs

line 1) @Controller에 의해 해당 객체가 자동으로 스프링 빈으로 등록 & 애노테이션 기반 컨트롤러로 인식

line 4) @RequestMapping에 의해 해당 URL이 호출되면 이 매서드가 호출됨 (메서드 이름은 아무거나 상관없음)

line 6) ModelAndView 라는 객체에 모델과 뷰 정보를 담아서 반환

 

* 매핑 정보로 인식하는 대상

- RequestMappingHandleMapping은 스프링 빈 중에서 @RequestMapping 또는 @Controller 가 클래스 레벨에 붙어 있는 경우 인식함 (@Controller를 클래스에 붙이는 방법을 많이 사용함)

 

2) 폼 저장 컨트롤러

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Controller
public class SpringMemberSaveControllerV1 {
    private MemberRepository memberRepository = MemberRepository.getInstance();
 
    @RequestMapping("/springmvc/v1/members/save")
    public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
 
        Member member = new Member(username, age);
        memberRepository.save(member);
 
        ModelAndView mv = new ModelAndView("save-result");
        mv.addObject("member", member);
        return mv;
    }
}
cs

line 7,8) request.getParameter(): 사용자가 입력한 폼의 정보를 가져옴

line 14) addObject(): ModelAndView 객체에 모델을 추가

 

3) 회원 조회 컨트롤러

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Controller
public class SpringMemberListControllerV1 {
 
    MemberRepository memberRepository = MemberRepository.getInstance();
 
    @RequestMapping("/springmvc/v1/members")
    public ModelAndView process() {
        List<Member> members = memberRepository.findAll();
 
        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members", members);
 
        return mv;
    }
}
cs

 

3. 컨트롤러 통합하기 (Develop)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {
 
    private MemberRepository memberRepository = MemberRepository.getInstance();
 
    @RequestMapping("/new-form")
    public ModelAndView newForm() {
        return new ModelAndView("new-form");  
    }
 
    @RequestMapping("/save")
    public ModelAndView save(HttpServletRequest request, HttpServletResponse response) {
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
 
        Member member = new Member(username, age);
        memberRepository.save(member);
 
        ModelAndView mv = new ModelAndView("save-result");
        mv.addObject("member", member);
        return mv;
    }
 
   @RequestMapping
    public ModelAndView members() {
        List<Member> members = memberRepository.findAll();
 
        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members", members);
 
        return mv;
    }
}
cs

line 2) 클래스에 @RequestMapping 어노테이션을 붙여 내부 메서드의 공통 URL을 설정할 수 있음

line 7,12,25) 공통 URL을 제외한 나머지 URL만 기입하면 됨 (특히 line 25는 나머지 URL이 없으므로 value 값 없음)

 

 

* 이렇게 컨트롤러끼리 합칠 수 있으나, 어느정도 연관성이 있는 컨트롤러들만 뭉치자!

 

4. 실용적인 방식 (Develop)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMamberControllerV3 {
 
    private MemberRepository memberRepository = MemberRepository.getInstance();
    
    @GetMapping("/new-form")
    public String newForm() {
        return "new-form";   
    }
    
    @PostMapping("/save")
    public String save(
            @RequestParam("username"String username,
            @RequestParam("age"int age,
            Model model) {
 
        Member member = new Member(username, age);
        memberRepository.save(member);
 
        model.addAttribute("member", member);
        return "save-result";
    }
    
    @GetMapping
    public String members(Model model) {
        List<Member> members = memberRepository.findAll();
 
        model.addAttribute("members", members);
        return "members";
    }
}
cs

line 9,22,30) ModelAndView 대신 String을 반환해도 알아서 뷰를 찾아줌

line 14,15) @RequestParam(): HttpServletRequest 말고 파라미터 값을 바로 받을 수 있음

line 15) @RequestParam에서 형변환까지 알아서 해줌

line 16,26) 뷰의 String을 반환하는 대신 모델 정보를 담도록 Model 파라미터를 받음 (사용 방법: line 21,29)

line 7,12,25) @RequestMapping 대신 @GetMapping 또는 @PostMapping 등을 통해 HTTP 전송방식에 제약을 걸 수 있음 (좀 더 안전한 설계 가능)

 

 

* @Controller는 반환값이 String이면 뷰 이름으로 인식하고 @RestController는 HTTP 메시지 바디에 바로 입력한다.

1
2
3
4
5
6
7
8
@Controller
public class Controller {
 
    @RequestMapping("/members/save")
    public String save() {
        return "save"
    }
}
cs

line 6) @Controller 이므로 "save"로 된 뷰를 찾음

1
2
3
4
5
6
7
8
@RestController
public class LogTestController {
 
    @RequestMapping("/log-test")
    public String logTest() {
        return "ok";
    }
}
cs

line 6) @RestController 이므로 "ok"를 HTTP 메시지 바디로 입력

 

 


참고자료

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

'백엔드 > 스프링' 카테고리의 다른 글

[SpringBoot] 요청 매핑  (0) 2022.01.23
[SpringBoot] 로깅  (0) 2022.01.20
[SpringBoot] 빈 스코프  (0) 2021.09.13
[SpringBoot] 빈 생명주기  (0) 2021.09.13
[SpringBoot] 롬복(Lombok)  (0) 2021.09.08
Comments