Skip to content

Commit d5618ee

Browse files
authored
[MVC 구현하기 - 2,3단계] 케빈(박진홍) 미션 제출합니다. (#102)
* chore: jackson 버전 수정 * feat: 404 예외 처리 추가 * feat: 레거시코드 분리 및 비활성화, 애너테이션 기반 컨트롤러 추가 * feat: jsonview 구현 * refactor: 값이 1개일때 예외 추가 * chore: package명 컨벤션에 맞춰 수정 * chore: 클래스명 new 삭제 및 legacy 키워드 추가
1 parent 0155bad commit d5618ee

19 files changed

+212
-24
lines changed

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import nextstep.mvc.DispatcherServlet;
66
import nextstep.mvc.controller.tobe.AnnotationHandlerAdapter;
77
import nextstep.mvc.controller.tobe.AnnotationHandlerMapping;
8-
import nextstep.mvc.controller.tobe.ManualHandlerAdapter;
98
import nextstep.web.WebApplicationInitializer;
109
import org.slf4j.Logger;
1110
import org.slf4j.LoggerFactory;
@@ -18,9 +17,9 @@ public class AppWebApplicationInitializer implements WebApplicationInitializer {
1817
@Override
1918
public void onStartup(ServletContext servletContext) {
2019
final DispatcherServlet dispatcherServlet = new DispatcherServlet();
21-
dispatcherServlet.addHandlerMapping(new ManualHandlerMapping());
20+
// dispatcherServlet.addHandlerMapping(new ManualHandlerMapping());
2221
dispatcherServlet.addHandlerMapping(new AnnotationHandlerMapping(BASE_PACKAGE));
23-
dispatcherServlet.addHandlerAdapter(new ManualHandlerAdapter());
22+
// dispatcherServlet.addHandlerAdapter(new ManualHandlerAdapter());
2423
dispatcherServlet.addHandlerAdapter(new AnnotationHandlerAdapter());
2524
final ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);
2625
dispatcher.setLoadOnStartup(1);

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package com.techcourse;
22

3-
import com.techcourse.controller.*;
3+
import com.techcourse.controller.legacy.LegacyLoginController;
4+
import com.techcourse.controller.legacy.LegacyLoginViewController;
5+
import com.techcourse.controller.legacy.LegacyLogoutController;
6+
import com.techcourse.controller.legacy.LegacyRegisterController;
7+
import com.techcourse.controller.legacy.LegacyRegisterViewController;
48
import jakarta.servlet.http.HttpServletRequest;
59
import nextstep.mvc.HandlerMapping;
610
import nextstep.mvc.controller.asis.Controller;
@@ -20,11 +24,11 @@ public class ManualHandlerMapping implements HandlerMapping {
2024
@Override
2125
public void initialize() {
2226
controllers.put("/", new ForwardController("/index.jsp"));
23-
controllers.put("/login", new LoginController());
24-
controllers.put("/login/view", new LoginViewController());
25-
controllers.put("/logout", new LogoutController());
26-
controllers.put("/register/view", new RegisterViewController());
27-
controllers.put("/register", new RegisterController());
27+
controllers.put("/login", new LegacyLoginController());
28+
controllers.put("/login/view", new LegacyLoginViewController());
29+
controllers.put("/logout", new LegacyLogoutController());
30+
controllers.put("/register/view", new LegacyRegisterViewController());
31+
controllers.put("/register", new LegacyRegisterController());
2832

2933
log.info("Initialized Handler Mapping!");
3034
controllers.keySet().forEach(path -> log.info("Path : {}, Controller : {}", path, controllers.get(path).getClass()));
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.techcourse.controller.annotationbase;
2+
3+
import jakarta.servlet.http.HttpServletRequest;
4+
import jakarta.servlet.http.HttpServletResponse;
5+
import nextstep.mvc.view.ModelAndView;
6+
import nextstep.web.annotation.Controller;
7+
import nextstep.web.annotation.RequestMapping;
8+
import nextstep.web.support.RequestMethod;
9+
10+
@Controller
11+
public class ForwardController {
12+
13+
@RequestMapping(value = "/", method = RequestMethod.GET)
14+
public ModelAndView indexPage(HttpServletRequest req, HttpServletResponse res) {
15+
return ModelAndView.fromJspView("/index.jsp");
16+
}
17+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.techcourse.controller.annotationbase;
2+
3+
import com.techcourse.controller.UserSession;
4+
import com.techcourse.domain.User;
5+
import com.techcourse.repository.InMemoryUserRepository;
6+
import jakarta.servlet.http.HttpServletRequest;
7+
import jakarta.servlet.http.HttpServletResponse;
8+
import jakarta.servlet.http.HttpSession;
9+
import nextstep.mvc.view.ModelAndView;
10+
import nextstep.web.annotation.Controller;
11+
import nextstep.web.annotation.RequestMapping;
12+
import nextstep.web.support.RequestMethod;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
15+
16+
@Controller
17+
public class LoginController {
18+
19+
private static final Logger log = LoggerFactory.getLogger(LoginController.class);
20+
21+
@RequestMapping(value = "/login/view", method = RequestMethod.GET)
22+
public ModelAndView viewLogin(HttpServletRequest req, HttpServletResponse res) {
23+
return UserSession.getUserFrom(req.getSession())
24+
.map(user -> {
25+
log.info("logged in {}", user.getAccount());
26+
return ModelAndView.fromJspView("redirect:/index.jsp");
27+
})
28+
.orElse(ModelAndView.fromJspView("/login.jsp"));
29+
}
30+
31+
@RequestMapping(value = "/login", method = RequestMethod.POST)
32+
public ModelAndView login(HttpServletRequest req, HttpServletResponse res) {
33+
if (UserSession.isLoggedIn(req.getSession())) {
34+
return ModelAndView.fromJspView("redirect:/index.jsp");
35+
}
36+
37+
return InMemoryUserRepository.findByAccount(req.getParameter("account"))
38+
.map(user -> {
39+
log.info("User : {}", user);
40+
return login(req, user);
41+
})
42+
.orElse(ModelAndView.fromJspView("redirect:/401.jsp"));
43+
}
44+
45+
private ModelAndView login(HttpServletRequest request, User user) {
46+
if (user.checkPassword(request.getParameter("password"))) {
47+
final HttpSession session = request.getSession();
48+
session.setAttribute(UserSession.SESSION_KEY, user);
49+
return ModelAndView.fromJspView("redirect:/index.jsp");
50+
}
51+
return ModelAndView.fromJspView("redirect:/401.jsp");
52+
}
53+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.techcourse.controller.annotationbase;
2+
3+
import com.techcourse.controller.UserSession;
4+
import jakarta.servlet.http.HttpServletRequest;
5+
import jakarta.servlet.http.HttpServletResponse;
6+
import jakarta.servlet.http.HttpSession;
7+
import nextstep.mvc.view.ModelAndView;
8+
import nextstep.web.annotation.Controller;
9+
import nextstep.web.annotation.RequestMapping;
10+
import nextstep.web.support.RequestMethod;
11+
12+
@Controller
13+
public class LogoutController {
14+
15+
@RequestMapping(value = "/logout", method = RequestMethod.GET)
16+
public ModelAndView logout(HttpServletRequest req, HttpServletResponse res) {
17+
final HttpSession session = req.getSession();
18+
session.removeAttribute(UserSession.SESSION_KEY);
19+
return ModelAndView.fromJspView("redirect:/");
20+
}
21+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.techcourse.controller.annotationbase;
2+
3+
import com.techcourse.domain.User;
4+
import com.techcourse.repository.InMemoryUserRepository;
5+
import jakarta.servlet.http.HttpServletRequest;
6+
import jakarta.servlet.http.HttpServletResponse;
7+
import nextstep.mvc.view.ModelAndView;
8+
import nextstep.web.annotation.Controller;
9+
import nextstep.web.annotation.RequestMapping;
10+
import nextstep.web.support.RequestMethod;
11+
12+
@Controller
13+
public class RegisterController {
14+
15+
@RequestMapping(value = "/register/view", method = RequestMethod.GET)
16+
public ModelAndView viewRegister(HttpServletRequest req, HttpServletResponse res) {
17+
return ModelAndView.fromJspView("/register.jsp");
18+
}
19+
20+
@RequestMapping(value = "/register", method = RequestMethod.POST)
21+
public ModelAndView register(HttpServletRequest req, HttpServletResponse res) {
22+
final User user = new User(2,
23+
req.getParameter("account"),
24+
req.getParameter("password"),
25+
req.getParameter("email"));
26+
InMemoryUserRepository.save(user);
27+
return ModelAndView.fromJspView("redirect:/index.jsp");
28+
}
29+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.techcourse.controller.annotationbase;
2+
3+
import com.techcourse.domain.User;
4+
import com.techcourse.repository.InMemoryUserRepository;
5+
import jakarta.servlet.http.HttpServletRequest;
6+
import jakarta.servlet.http.HttpServletResponse;
7+
import nextstep.mvc.view.JsonView;
8+
import nextstep.mvc.view.ModelAndView;
9+
import nextstep.web.annotation.Controller;
10+
import nextstep.web.annotation.RequestMapping;
11+
import nextstep.web.support.RequestMethod;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
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+
}

app/src/main/java/com/techcourse/controller/LoginController.java renamed to app/src/main/java/com/techcourse/controller/legacy/LegacyLoginController.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
package com.techcourse.controller;
1+
package com.techcourse.controller.legacy;
22

3+
import com.techcourse.controller.UserSession;
34
import com.techcourse.domain.User;
45
import com.techcourse.repository.InMemoryUserRepository;
56
import jakarta.servlet.http.HttpServletRequest;
@@ -9,9 +10,9 @@
910
import org.slf4j.Logger;
1011
import org.slf4j.LoggerFactory;
1112

12-
public class LoginController implements Controller {
13+
public class LegacyLoginController implements Controller {
1314

14-
private static final Logger log = LoggerFactory.getLogger(LoginController.class);
15+
private static final Logger log = LoggerFactory.getLogger(LegacyLoginController.class);
1516

1617
@Override
1718
public String execute(HttpServletRequest req, HttpServletResponse res) throws Exception {

app/src/main/java/com/techcourse/controller/LoginViewController.java renamed to app/src/main/java/com/techcourse/controller/legacy/LegacyLoginViewController.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
package com.techcourse.controller;
1+
package com.techcourse.controller.legacy;
22

3+
import com.techcourse.controller.UserSession;
34
import jakarta.servlet.http.HttpServletRequest;
45
import jakarta.servlet.http.HttpServletResponse;
56
import nextstep.mvc.controller.asis.Controller;
67
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;
89

9-
public class LoginViewController implements Controller {
10+
public class LegacyLoginViewController implements Controller {
1011

11-
private static final Logger log = LoggerFactory.getLogger(LoginViewController.class);
12+
private static final Logger log = LoggerFactory.getLogger(LegacyLoginViewController.class);
1213

1314
@Override
1415
public String execute(HttpServletRequest req, HttpServletResponse res) throws Exception {

app/src/main/java/com/techcourse/controller/LogoutController.java renamed to app/src/main/java/com/techcourse/controller/legacy/LegacyLogoutController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
package com.techcourse.controller;
1+
package com.techcourse.controller.legacy;
22

3+
import com.techcourse.controller.UserSession;
34
import jakarta.servlet.http.HttpServletRequest;
45
import jakarta.servlet.http.HttpServletResponse;
56
import jakarta.servlet.http.HttpSession;
67
import nextstep.mvc.controller.asis.Controller;
78

8-
public class LogoutController implements Controller {
9+
public class LegacyLogoutController implements Controller {
910

1011
@Override
1112
public String execute(HttpServletRequest req, HttpServletResponse res) throws Exception {

0 commit comments

Comments
 (0)