Skip to content

Commit 4c3d56d

Browse files
authored
[MVC 구현하기 - 2, 3단계] 포츈(정윤성) 미션 제출합니다. (#97)
* refactor: 레거시 Controller에서 String을 반환하던것을 ModelView를 반환하도록 수정 * refactor: 어댑터 패턴을 이용해 프레임워크 지원 기능 리팩토링 * chore: jackson 라이브러리 버전업 * feat: jsonView 구현 * refactor: 모든 컨트롤러를 어노테이션 기반 MVC로 변경 * refactor: Legacy MVC 제거 * refactor: 코드 포매팅 * refactor: 중복되는 Viewname을 Enum에서 관리하도록 수정 * refactor: GET, POST 순으로 메서드 위치 수정 * refactor: 생성자 위치 변경 * refactor: 빠져있던 접근제어자 추가 * refactor: HandlerMappings 일급컬렉션화 * refactor: HandlerAdapters 일급 컬렉션화 * refactor: 예외 메시지 추가 * refactor: 리다이랙팅도 Enum에서 처리하도록 수정
1 parent 470298c commit 4c3d56d

39 files changed

+370
-217
lines changed

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import jakarta.servlet.ServletContext;
44
import jakarta.servlet.ServletRegistration;
55
import nextstep.mvc.DispatcherServlet;
6+
import nextstep.mvc.controller.handler.HandlerMapping;
7+
import nextstep.mvc.controller.adapter.HandlerAdapter;
8+
import nextstep.mvc.controller.adapter.HandlerExecutionHandlerAdapter;
69
import nextstep.mvc.controller.tobe.AnnotationHandlerMapping;
710
import nextstep.web.WebApplicationInitializer;
811
import org.slf4j.Logger;
@@ -16,13 +19,18 @@ public class AppWebApplicationInitializer implements WebApplicationInitializer {
1619
@Override
1720
public void onStartup(ServletContext servletContext) {
1821
final DispatcherServlet dispatcherServlet = new DispatcherServlet();
19-
dispatcherServlet.addHandlerMapping(new ManualHandlerMapping());
20-
dispatcherServlet.addHandlerMapping(new AnnotationHandlerMapping(BASE_PACKAGE));
22+
23+
addFrameWork(dispatcherServlet, new AnnotationHandlerMapping(BASE_PACKAGE), new HandlerExecutionHandlerAdapter());
2124

2225
final ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);
2326
dispatcher.setLoadOnStartup(1);
2427
dispatcher.addMapping("/");
2528

2629
LOGGER.info("Start AppWebApplication Initializer");
2730
}
31+
32+
private void addFrameWork(final DispatcherServlet dispatcherServlet, final HandlerMapping handlerMapping, final HandlerAdapter handlerAdapter) {
33+
dispatcherServlet.addHandlerMapping(handlerMapping);
34+
dispatcherServlet.addHandlerAdapter(handlerAdapter);
35+
}
2836
}

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

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

3+
import java.io.File;
4+
import java.util.stream.Stream;
35
import org.apache.catalina.Context;
46
import org.apache.catalina.connector.Connector;
57
import org.apache.catalina.startup.Tomcat;
68
import org.slf4j.Logger;
79
import org.slf4j.LoggerFactory;
810

9-
import java.io.File;
10-
import java.util.stream.Stream;
11-
1211
public class JwpApplication {
1312

1413
private static final Logger log = LoggerFactory.getLogger(JwpApplication.class);
@@ -31,9 +30,9 @@ public static void main(String[] args) throws Exception {
3130

3231
private static int defaultPortIfNull(String[] args) {
3332
return Stream.of(args)
34-
.findFirst()
35-
.map(Integer::parseInt)
36-
.orElse(DEFAULT_PORT);
33+
.findFirst()
34+
.map(Integer::parseInt)
35+
.orElse(DEFAULT_PORT);
3736
}
3837

3938
private static Context addWebapp(Tomcat tomcat) {

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

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.techcourse.controller;
2+
3+
import jakarta.servlet.http.HttpServletRequest;
4+
import jakarta.servlet.http.HttpServletResponse;
5+
import nextstep.mvc.view.JspView;
6+
import nextstep.mvc.view.ModelAndView;
7+
import nextstep.web.annotation.Controller;
8+
import nextstep.web.annotation.RequestMapping;
9+
import nextstep.web.support.JspPage;
10+
import nextstep.web.support.RequestMethod;
11+
12+
@Controller
13+
public class ForwardController {
14+
15+
@RequestMapping(value = "/", method = RequestMethod.GET)
16+
public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) {
17+
return new ModelAndView(new JspView(JspPage.INDEX.value()));
18+
}
19+
}
Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,59 @@
11
package com.techcourse.controller;
22

33
import com.techcourse.domain.User;
4+
import com.techcourse.domain.UserSession;
45
import com.techcourse.repository.InMemoryUserRepository;
56
import jakarta.servlet.http.HttpServletRequest;
67
import jakarta.servlet.http.HttpServletResponse;
78
import jakarta.servlet.http.HttpSession;
8-
import nextstep.mvc.controller.asis.Controller;
9+
import nextstep.mvc.view.JspView;
10+
import nextstep.mvc.view.ModelAndView;
11+
import nextstep.mvc.view.View;
12+
import nextstep.web.annotation.Controller;
13+
import nextstep.web.annotation.RequestMapping;
14+
import nextstep.web.support.JspPage;
15+
import nextstep.web.support.RequestMethod;
916
import org.slf4j.Logger;
1017
import org.slf4j.LoggerFactory;
1118

12-
public class LoginController implements Controller {
19+
@Controller
20+
public class LoginController {
1321

14-
private static final Logger log = LoggerFactory.getLogger(LoginController.class);
22+
private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);
1523

16-
@Override
17-
public String execute(HttpServletRequest req, HttpServletResponse res) {
24+
@RequestMapping(value = "/login/view", method = RequestMethod.GET)
25+
public ModelAndView view(HttpServletRequest req, HttpServletResponse res) {
1826
if (UserSession.isLoggedIn(req.getSession())) {
19-
return "redirect:/index.jsp";
27+
View view = new JspView(JspPage.INDEX.value());
28+
return new ModelAndView(view);
29+
}
30+
return new ModelAndView(new JspView(JspPage.LOGIN.value()));
31+
}
32+
33+
@RequestMapping(value = "/login", method = RequestMethod.POST)
34+
public ModelAndView login(HttpServletRequest req, HttpServletResponse res) {
35+
if (UserSession.isLoggedIn(req.getSession())) {
36+
View view = new JspView(JspPage.INDEX.redirect());
37+
return new ModelAndView(view);
2038
}
2139

2240
return InMemoryUserRepository.findByAccount(req.getParameter("account"))
23-
.map(user -> {
24-
log.info("User : {}", user);
25-
return login(req, user);
26-
})
27-
.orElse("redirect:/401.jsp");
41+
.map(user -> {
42+
LOGGER.info("User : {}", user);
43+
return new ModelAndView(loginCheck(req, user));
44+
})
45+
.orElse(new ModelAndView(
46+
new JspView(JspPage.UNAUTHORIZED.redirect())
47+
));
2848
}
2949

30-
private String login(HttpServletRequest request, User user) {
50+
private View loginCheck(HttpServletRequest request, User user) {
3151
if (user.checkPassword(request.getParameter("password"))) {
3252
final HttpSession session = request.getSession();
3353
session.setAttribute(UserSession.SESSION_KEY, user);
34-
return "redirect:/index.jsp";
54+
return new JspView(JspPage.INDEX.redirect());
3555
} else {
36-
return "redirect:/401.jsp";
56+
return new JspView(JspPage.UNAUTHORIZED.redirect());
3757
}
3858
}
3959
}

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

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

3+
import com.techcourse.domain.UserSession;
34
import jakarta.servlet.http.HttpServletRequest;
45
import jakarta.servlet.http.HttpServletResponse;
56
import jakarta.servlet.http.HttpSession;
6-
import nextstep.mvc.controller.asis.Controller;
7+
import nextstep.mvc.view.JspView;
8+
import nextstep.mvc.view.ModelAndView;
9+
import nextstep.mvc.view.View;
10+
import nextstep.web.annotation.Controller;
11+
import nextstep.web.annotation.RequestMapping;
12+
import nextstep.web.support.RequestMethod;
713

8-
public class LogoutController implements Controller {
14+
@Controller
15+
public class LogoutController {
916

10-
@Override
11-
public String execute(HttpServletRequest req, HttpServletResponse res) throws Exception {
17+
@RequestMapping(value = "/logout", method = RequestMethod.GET)
18+
public ModelAndView logout(HttpServletRequest req, HttpServletResponse res) {
1219
final HttpSession session = req.getSession();
1320
session.removeAttribute(UserSession.SESSION_KEY);
14-
return "redirect:/";
21+
View view = new JspView("redirect:/");
22+
return new ModelAndView(view);
1523
}
1624
}
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 jakarta.servlet.http.HttpServletRequest;
4+
import jakarta.servlet.http.HttpServletResponse;
5+
import nextstep.mvc.view.JsonView;
6+
import nextstep.mvc.view.ModelAndView;
7+
import nextstep.web.annotation.Controller;
8+
import nextstep.web.annotation.RequestMapping;
9+
import nextstep.web.support.RequestMethod;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
12+
13+
@Controller
14+
public class MultiInputController {
15+
16+
private static final Logger LOGGER = LoggerFactory.getLogger(MultiInputController.class);
17+
18+
@RequestMapping(value = "/api/multi", method = RequestMethod.GET)
19+
public ModelAndView show(HttpServletRequest request, HttpServletResponse response) {
20+
String input1 = request.getParameter("input1");
21+
String input2 = request.getParameter("input2");
22+
23+
LOGGER.debug("input1 : {}", input1);
24+
LOGGER.debug("input2 : {}", input2);
25+
26+
ModelAndView modelAndView = new ModelAndView(new JsonView());
27+
28+
modelAndView.addObject("input1", input1);
29+
modelAndView.addObject("input2", input2);
30+
return modelAndView;
31+
}
32+
}

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,25 @@
99
import nextstep.mvc.view.ModelAndView;
1010
import nextstep.web.annotation.Controller;
1111
import nextstep.web.annotation.RequestMapping;
12+
import nextstep.web.support.JspPage;
1213
import nextstep.web.support.RequestMethod;
1314

1415
@Controller
1516
public class RegisterController {
16-
17+
18+
@RequestMapping(value = "/register/view", method = RequestMethod.GET)
19+
public ModelAndView show(final HttpServletRequest req, final HttpServletResponse res) {
20+
return new ModelAndView(new JspView(JspPage.REGISTER.value()));
21+
}
22+
1723
@RequestMapping(value = "/register", method = RequestMethod.POST)
1824
public ModelAndView save(final HttpServletRequest req, final HttpServletResponse res) {
1925
User user = new User(2,
2026
req.getParameter("account"),
2127
req.getParameter("password"),
22-
req.getParameter("email"));
28+
req.getParameter("email")
29+
);
2330
InMemoryUserRepository.save(user);
24-
25-
return new ModelAndView(new JspView("redirect:/index.jsp"));
26-
}
27-
28-
@RequestMapping(value = "/register/view", method = RequestMethod.GET)
29-
public ModelAndView show(final HttpServletRequest req, final HttpServletResponse res) {
30-
return new ModelAndView(new JspView("/register.jsp"));
31+
return new ModelAndView(new JspView(String.format("redirect:%s", JspPage.INDEX.value())));
3132
}
3233
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import nextstep.mvc.view.ModelAndView;
77
import nextstep.web.annotation.Controller;
88
import nextstep.web.annotation.RequestMapping;
9+
import nextstep.web.support.JspPage;
910
import nextstep.web.support.RequestMethod;
1011
import org.slf4j.Logger;
1112
import org.slf4j.LoggerFactory;
@@ -18,15 +19,15 @@ public class TestController {
1819
@RequestMapping(value = "/get-test", method = RequestMethod.GET)
1920
public ModelAndView findUserId(final HttpServletRequest request, final HttpServletResponse response) {
2021
LOGGER.info("test controller get method");
21-
ModelAndView modelAndView = new ModelAndView(new JspView("/get-test.jsp"));
22+
ModelAndView modelAndView = new ModelAndView(new JspView(JspPage.GET_TEST.value()));
2223
modelAndView.addObject("id", request.getAttribute("id"));
2324
return modelAndView;
2425
}
2526

2627
@RequestMapping(value = "/post-test", method = RequestMethod.POST)
2728
public ModelAndView save(final HttpServletRequest request, final HttpServletResponse response) {
2829
LOGGER.info("test controller post method");
29-
ModelAndView modelAndView = new ModelAndView(new JspView("/post-test.jsp"));
30+
ModelAndView modelAndView = new ModelAndView(new JspView(JspPage.POST_TEST.value()));
3031
modelAndView.addObject("id", request.getAttribute("id"));
3132
return modelAndView;
3233
}
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 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 LOGGER = 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+
LOGGER.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/domain/User.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,17 @@ public String getAccount() {
2525
@Override
2626
public String toString() {
2727
return "User{" +
28-
"id=" + id +
29-
", account='" + account + '\'' +
30-
", email='" + email + '\'' +
31-
", password='" + password + '\'' +
32-
'}';
28+
"id=" + id +
29+
", account='" + account + '\'' +
30+
", email='" + email + '\'' +
31+
'}';
32+
}
33+
34+
public long getId() {
35+
return id;
36+
}
37+
38+
public String getEmail() {
39+
return email;
3340
}
3441
}

0 commit comments

Comments
 (0)