Skip to content

Commit 66001c1

Browse files
authored
[MVC 구현하기 - 3단계] 망고(고재철) 미션 제출합니다. (#605)
* refactor: JspView 클래스 구현 * refactor: JsonView 클래스 구현 * feat: UserController 추가 * refactor: 모든 Controller 어노테이션 기반 MVC로 변경 * refactor: asis 패키지 제거 및 tobe 패키지 내 클래스 이동 * refactor: DispatcherServlet 패키지 이동 * refactor: RedirectView 추상 클래스 추가
1 parent cd71121 commit 66001c1

25 files changed

+163
-187
lines changed

app/src/main/java/com/techcourse/DispatcherServletInitializer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.slf4j.Logger;
55
import org.slf4j.LoggerFactory;
66
import web.org.springframework.web.WebApplicationInitializer;
7+
import webmvc.org.springframework.web.servlet.DispatcherServlet;
78

89
/**
910
* Base class for {@link WebApplicationInitializer}

app/src/main/java/com/techcourse/ManualHandlerMapping.java

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.techcourse.controller;
2+
3+
import context.org.springframework.stereotype.Controller;
4+
import jakarta.servlet.http.HttpServletRequest;
5+
import jakarta.servlet.http.HttpServletResponse;
6+
import web.org.springframework.web.bind.annotation.RequestMapping;
7+
import web.org.springframework.web.bind.annotation.RequestMethod;
8+
import webmvc.org.springframework.web.servlet.ModelAndView;
9+
import webmvc.org.springframework.web.servlet.view.JspView;
10+
11+
@Controller
12+
public class HomeController {
13+
14+
@RequestMapping(value = "/", method = RequestMethod.GET)
15+
public ModelAndView show(final HttpServletRequest request, final HttpServletResponse response) {
16+
return new ModelAndView(new JspView("/index.jsp"));
17+
}
18+
}

app/src/main/java/com/techcourse/controller/LoginController.java

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,33 @@
22

33
import com.techcourse.domain.User;
44
import com.techcourse.repository.InMemoryUserRepository;
5+
import context.org.springframework.stereotype.Controller;
56
import jakarta.servlet.http.HttpServletRequest;
67
import jakarta.servlet.http.HttpServletResponse;
7-
import webmvc.org.springframework.web.servlet.mvc.asis.Controller;
88
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
10+
import web.org.springframework.web.bind.annotation.RequestMapping;
11+
import web.org.springframework.web.bind.annotation.RequestMethod;
12+
import webmvc.org.springframework.web.servlet.ModelAndView;
13+
import webmvc.org.springframework.web.servlet.view.JspView;
1014

11-
public class LoginController implements Controller {
15+
@Controller
16+
public class LoginController {
1217

1318
private static final Logger log = LoggerFactory.getLogger(LoginController.class);
1419

15-
@Override
16-
public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception {
17-
if (UserSession.isLoggedIn(req.getSession())) {
18-
return "redirect:/index.jsp";
20+
@RequestMapping(value = "/login", method = RequestMethod.POST)
21+
public ModelAndView execute(final HttpServletRequest request, final HttpServletResponse response) {
22+
if (UserSession.isLoggedIn(request.getSession())) {
23+
return new ModelAndView(new JspView("redirect:/index.jsp"));
1924
}
20-
21-
return InMemoryUserRepository.findByAccount(req.getParameter("account"))
25+
final String result = InMemoryUserRepository.findByAccount(request.getParameter("account"))
2226
.map(user -> {
2327
log.info("User : {}", user);
24-
return login(req, user);
28+
return login(request, user);
2529
})
2630
.orElse("redirect:/401.jsp");
31+
return new ModelAndView(new JspView(result));
2732
}
2833

2934
private String login(final HttpServletRequest request, final User user) {
@@ -34,4 +39,15 @@ private String login(final HttpServletRequest request, final User user) {
3439
}
3540
return "redirect:/401.jsp";
3641
}
42+
43+
@RequestMapping(value = "/login", method = RequestMethod.GET)
44+
public ModelAndView show(final HttpServletRequest request, final HttpServletResponse response) {
45+
final String result = UserSession.getUserFrom(request.getSession())
46+
.map(user -> {
47+
log.info("logged in {}", user.getAccount());
48+
return "redirect:/index.jsp";
49+
})
50+
.orElse("/login.jsp");
51+
return new ModelAndView(new JspView(result));
52+
}
3753
}

app/src/main/java/com/techcourse/controller/LoginViewController.java

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
package com.techcourse.controller;
22

3+
import context.org.springframework.stereotype.Controller;
34
import jakarta.servlet.http.HttpServletRequest;
45
import jakarta.servlet.http.HttpServletResponse;
5-
import webmvc.org.springframework.web.servlet.mvc.asis.Controller;
6+
import web.org.springframework.web.bind.annotation.RequestMapping;
7+
import web.org.springframework.web.bind.annotation.RequestMethod;
8+
import webmvc.org.springframework.web.servlet.ModelAndView;
9+
import webmvc.org.springframework.web.servlet.view.JspView;
610

7-
public class LogoutController implements Controller {
11+
@Controller
12+
public class LogoutController {
813

9-
@Override
10-
public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception {
14+
@RequestMapping(value = "/logout", method = RequestMethod.GET)
15+
public ModelAndView execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception {
1116
final var session = req.getSession();
1217
session.removeAttribute(UserSession.SESSION_KEY);
13-
return "redirect:/";
18+
return new ModelAndView(new JspView("redirect:/"));
1419
}
1520
}

app/src/main/java/com/techcourse/controller/RegisterController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public ModelAndView save(final HttpServletRequest request, final HttpServletResp
2424
return new ModelAndView(new JspView("redirect:/index.jsp"));
2525
}
2626

27-
@RequestMapping(value = "/register/view", method = RequestMethod.GET)
27+
@RequestMapping(value = "/register", method = RequestMethod.GET)
2828
public ModelAndView show(final HttpServletRequest request, final HttpServletResponse response) {
2929
return new ModelAndView(new JspView("/register.jsp"));
3030
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.techcourse.controller;
2+
3+
import com.techcourse.domain.User;
4+
import com.techcourse.repository.InMemoryUserRepository;
5+
import context.org.springframework.stereotype.Controller;
6+
import jakarta.servlet.http.HttpServletRequest;
7+
import jakarta.servlet.http.HttpServletResponse;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
import web.org.springframework.web.bind.annotation.RequestMapping;
11+
import web.org.springframework.web.bind.annotation.RequestMethod;
12+
import webmvc.org.springframework.web.servlet.ModelAndView;
13+
import webmvc.org.springframework.web.servlet.view.JsonView;
14+
15+
@Controller
16+
public class UserController {
17+
18+
private static final Logger log = LoggerFactory.getLogger(UserController.class);
19+
20+
@RequestMapping(value = "/api/user", method = RequestMethod.GET)
21+
public ModelAndView show(HttpServletRequest request, HttpServletResponse response) {
22+
final String account = request.getParameter("account");
23+
log.debug("user id : {}", account);
24+
25+
final ModelAndView modelAndView = new ModelAndView(new JsonView());
26+
final User user = InMemoryUserRepository.findByAccount(account)
27+
.orElseThrow();
28+
29+
modelAndView.addObject("user", user);
30+
return modelAndView;
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
package com.techcourse;
1+
package webmvc.org.springframework.web.servlet;
22

33
import jakarta.servlet.ServletException;
44
import jakarta.servlet.http.HttpServlet;
55
import jakarta.servlet.http.HttpServletRequest;
66
import jakarta.servlet.http.HttpServletResponse;
77
import org.slf4j.Logger;
88
import org.slf4j.LoggerFactory;
9-
import webmvc.org.springframework.web.servlet.ModelAndView;
10-
import webmvc.org.springframework.web.servlet.mvc.asis.ManualHandlerAdapter;
11-
import webmvc.org.springframework.web.servlet.mvc.tobe.AnnotationHandlerAdapter;
12-
import webmvc.org.springframework.web.servlet.mvc.tobe.AnnotationHandlerMapping;
13-
import webmvc.org.springframework.web.servlet.view.JspView;
9+
import webmvc.org.springframework.web.servlet.mvc.AnnotationHandlerAdapter;
10+
import webmvc.org.springframework.web.servlet.mvc.AnnotationHandlerMapping;
11+
import webmvc.org.springframework.web.servlet.mvc.HandlerAdapters;
12+
import webmvc.org.springframework.web.servlet.mvc.HandlerMappings;
1413

1514
public class DispatcherServlet extends HttpServlet {
1615

@@ -27,9 +26,7 @@ public DispatcherServlet() {
2726

2827
@Override
2928
public void init() {
30-
handlerMappings.addHandlerMapping(new ManualHandlerMapping());
3129
handlerMappings.addHandlerMapping(new AnnotationHandlerMapping());
32-
handlerAdapters.addHandlerAdapter(new ManualHandlerAdapter());
3330
handlerAdapters.addHandlerAdapter(new AnnotationHandlerAdapter());
3431
}
3532

@@ -41,21 +38,11 @@ protected void service(final HttpServletRequest request, final HttpServletRespon
4138
final var handler = handlerMappings.getHandler(request);
4239
final var handlerAdapter = handlerAdapters.getHandlerAdapter(handler);
4340
final ModelAndView modelAndView = handlerAdapter.handle(request, response, handler);
44-
move(modelAndView, request, response);
41+
final View view = modelAndView.getView();
42+
view.render(modelAndView.getModel(), request, response);
4543
} catch (Throwable e) {
4644
log.error("Exception : {}", e.getMessage(), e);
4745
throw new ServletException(e.getMessage());
4846
}
4947
}
50-
51-
private void move(final ModelAndView modelAndView, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
52-
final String viewName = modelAndView.getView().getViewName();
53-
if (viewName.startsWith(JspView.REDIRECT_PREFIX)) {
54-
response.sendRedirect(viewName.substring(JspView.REDIRECT_PREFIX.length()));
55-
return;
56-
}
57-
58-
final var requestDispatcher = request.getRequestDispatcher(viewName);
59-
requestDispatcher.forward(request, response);
60-
}
6148
}

mvc/src/main/java/webmvc/org/springframework/web/servlet/View.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,4 @@
77

88
public interface View {
99
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
10-
11-
String getViewName();
1210
}

0 commit comments

Comments
 (0)