프로그래밍 끄적끄적
[SpringBoot] 스프링 MVC 본문
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
'백엔드 > 스프링' 카테고리의 다른 글
[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 |