Skip to content

Commit 9183292

Browse files
authored
[MVC 구현 3단계] 오리(오현서) 미션 제출합니다. (#543)
* feat: JsonView 구현 * refactor: Login 로직 annotation Controller로 동작하도록 변경 * refactor: logout 로직 annotation Controller로 동작하도록 변경 * refactor: ForwardController 어노테이션 기반으로 변경 * refactor: 사용하지 않게된 ManulHandler 관련된 클래스 제거 * chore: DispatcherServlet 패키지 변경 * feat: UserController 추가 * refactor: JsonView가 요구사항에 맞게 view를 반환하도록 변경 * style: 개행 수정 * refactor: 개행 HandlerMapping 구현체 변경 * refactor: DispatcherServlet에서 JspView 의존성 제거
1 parent b67953b commit 9183292

26 files changed

+234
-222
lines changed

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
package com.techcourse;
22

3+
import com.techcourse.exception.NotFoundExceptionHandler;
34
import jakarta.servlet.ServletContext;
5+
import java.util.List;
46
import org.slf4j.Logger;
57
import org.slf4j.LoggerFactory;
68
import web.org.springframework.web.WebApplicationInitializer;
9+
import webmvc.org.springframework.web.servlet.DispatcherServlet;
10+
import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.AnnotationHandlerAdapter;
11+
import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.HandlerAdapterFinder;
12+
import webmvc.org.springframework.web.servlet.mvc.tobe.exception.ExceptionResolver;
13+
import webmvc.org.springframework.web.servlet.mvc.tobe.handler.AnnotationHandlerMapping;
14+
import webmvc.org.springframework.web.servlet.mvc.tobe.handler.HandlerMapping;
715

816
/**
917
* Base class for {@link WebApplicationInitializer}
@@ -17,7 +25,7 @@ public class DispatcherServletInitializer implements WebApplicationInitializer {
1725

1826
@Override
1927
public void onStartup(final ServletContext servletContext) {
20-
final var dispatcherServlet = new DispatcherServlet();
28+
final var dispatcherServlet = initDispatcherServlet();
2129

2230
final var registration = servletContext.addServlet(DEFAULT_SERVLET_NAME, dispatcherServlet);
2331
if (registration == null) {
@@ -30,4 +38,12 @@ public void onStartup(final ServletContext servletContext) {
3038

3139
log.info("Start AppWebApplication Initializer");
3240
}
41+
42+
public DispatcherServlet initDispatcherServlet() {
43+
HandlerMapping handlerMapping = new AnnotationHandlerMapping();
44+
handlerMapping.initialize();
45+
HandlerAdapterFinder handlerAdapterFinder = new HandlerAdapterFinder(List.of(new AnnotationHandlerAdapter()));
46+
ExceptionResolver exceptionResolver = new ExceptionResolver(List.of(new NotFoundExceptionHandler()));
47+
return new DispatcherServlet(handlerMapping, handlerAdapterFinder, exceptionResolver);
48+
}
3349
}

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

Lines changed: 0 additions & 39 deletions
This file was deleted.

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

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

3+
import com.techcourse.exception.UncheckedServletException;
4+
import java.io.File;
35
import org.apache.catalina.Context;
46
import org.apache.catalina.LifecycleException;
57
import org.apache.catalina.connector.Connector;
68
import org.apache.catalina.core.StandardContext;
79
import org.apache.catalina.startup.Tomcat;
810
import org.apache.tomcat.util.scan.StandardJarScanner;
911

10-
import java.io.File;
11-
1212
public class TomcatStarter {
1313

1414
public static final String WEBAPP_DIR_LOCATION = "app/src/main/webapp/";
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 ForwardController {
13+
14+
@RequestMapping(value = "/", method = RequestMethod.GET)
15+
public ModelAndView show(final HttpServletRequest req, final HttpServletResponse res) {
16+
return new ModelAndView(new JspView("/index.jsp"));
17+
}
18+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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.JspView;
14+
15+
@Controller
16+
public class LoginController {
17+
18+
private static final Logger log = LoggerFactory.getLogger(LoginController.class);
19+
20+
@RequestMapping(value = "/login", method = RequestMethod.POST)
21+
public ModelAndView login(final HttpServletRequest req, final HttpServletResponse res) {
22+
if (UserSession.isLoggedIn(req.getSession())) {
23+
return new ModelAndView(new JspView("redirect:/index.jsp"));
24+
}
25+
26+
String responseUrl = InMemoryUserRepository.findByAccount(req.getParameter("account"))
27+
.map(user -> {
28+
log.info("User : {}", user);
29+
return login(req, user);
30+
})
31+
.orElse("redirect:/401.jsp");
32+
return new ModelAndView(new JspView(responseUrl));
33+
}
34+
35+
private String login(final HttpServletRequest request, final User user) {
36+
if (user.checkPassword(request.getParameter("password"))) {
37+
final var session = request.getSession();
38+
session.setAttribute(UserSession.SESSION_KEY, user);
39+
return "redirect:/index.jsp";
40+
}
41+
return "redirect:/401.jsp";
42+
}
43+
44+
@RequestMapping(value = "/login", method = RequestMethod.GET)
45+
public ModelAndView show(HttpServletRequest req, HttpServletResponse res) {
46+
String responseUrl = UserSession.getUserFrom(req.getSession())
47+
.map(user -> {
48+
log.info("logged in {}", user.getAccount());
49+
return "redirect:/index.jsp";
50+
})
51+
.orElse("/login.jsp");
52+
return new ModelAndView(new JspView(responseUrl));
53+
}
54+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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 LogoutController {
13+
14+
@RequestMapping(value = "/logout", method = RequestMethod.GET)
15+
public ModelAndView logout(final HttpServletRequest req, final HttpServletResponse res) {
16+
final var session = req.getSession();
17+
session.removeAttribute(UserSession.SESSION_KEY);
18+
return new ModelAndView(new JspView("redirect:/"));
19+
}
20+
}

app/src/main/java/com/techcourse/controller/annotation/RegisterController.java renamed to app/src/main/java/com/techcourse/controller/RegisterController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.techcourse.controller.annotation;
1+
package com.techcourse.controller;
22

33
import com.techcourse.domain.User;
44
import com.techcourse.repository.InMemoryUserRepository;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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+
modelAndView.addObject("user", user);
29+
return modelAndView;
30+
}
31+
}

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

Lines changed: 0 additions & 38 deletions
This file was deleted.

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

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)