Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MVC 구현하기 - 3단계] 몰리(김지민) 미션 제출합니다. #826

Merged
merged 19 commits into from
Oct 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
59f49c6
refactor(JsonView): JSON으로 응답할 수 있도록 JsonView 클래스 구현
jminkkk Sep 30, 2024
526aa44
refactor(LoginController): Annotation 기반으로 변경
jminkkk Sep 30, 2024
3c7e2f6
refactor(LogoutController): Annotation 기반으로 변경
jminkkk Sep 30, 2024
cc4bf46
refactor(IndexController): Annotation 기반으로 변경
jminkkk Sep 30, 2024
9fc5a5e
refactor(/asis): controller 인터페이스 기반 레거시 @Deprecated 처
jminkkk Sep 30, 2024
295f360
refactor(/): 패키지 구조 개편
jminkkk Sep 30, 2024
8036b93
refactor(DispatcherServlet): 애플리케이션 기본 패키지를 외부에서 주입
jminkkk Sep 30, 2024
eb72ebb
refactor(UserController): 요구사항에 주어진 컨트롤러 클래스 구현
jminkkk Sep 30, 2024
dd7e2f6
refactor(JsonView): 데이터가 1개일 경우 로직 변경
jminkkk Sep 30, 2024
121c474
refactor(DIContainer): 필드 주입 로직 구현
jminkkk Sep 30, 2024
7e310c0
refactor(ClassPathScanner): 패키지 경로로부터 해당하는 클래스를 반환하는 스캐너 구현
jminkkk Sep 30, 2024
ea54e80
refactor(DIContainer): @Service, @Repository Component 빈 등록 및 @Inject…
jminkkk Sep 30, 2024
d14dd84
refactor(DispatcherServletInitializer): DispatcherServletInitializer …
jminkkk Sep 30, 2024
a4d55f7
refactor(DIContainer): 에러 메시지 오타 수정
jminkkk Oct 2, 2024
b7add77
refactor(DIContainer): 빈을 찾을 수 없는 경우 IllegalArgumentException 발생
jminkkk Oct 2, 2024
af782c8
refactor(ClassPathScanner): 가변 인자 메서드만 남기고 제거
jminkkk Oct 2, 2024
d89ecb7
refactor(ClassPathScanner): 사용하지 않는 메서드 제거
jminkkk Oct 2, 2024
16c2c7b
refactor(JsonView): 데이터가 없는 경우 예외가 아닌 null을 반환하도록 변경
jminkkk Oct 2, 2024
e3407a2
test(JsonView): 데이터가 없다면 null 반환하는 테스트 추가
jminkkk Oct 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.interface21.web.WebApplicationInitializer;
import com.interface21.webmvc.servlet.DispatcherServlet;

/**
* Base class for {@link WebApplicationInitializer}
Expand All @@ -17,7 +18,9 @@ public class DispatcherServletInitializer implements WebApplicationInitializer {

@Override
public void onStartup(final ServletContext servletContext) {
final var dispatcherServlet = new DispatcherServlet();
final var basePackage = getClass().getPackage().getName();
servletContext.setAttribute("basePackage", basePackage);
final var dispatcherServlet = new DispatcherServlet(servletContext);

final var registration = servletContext.addServlet(DEFAULT_SERVLET_NAME, dispatcherServlet);
if (registration == null) {
Expand Down
14 changes: 3 additions & 11 deletions app/src/main/java/com/techcourse/ManualHandlerMapping.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.interface21.webmvc.servlet.mvc.HandlerMapping;
import com.interface21.webmvc.servlet.mvc.asis.Controller;
import com.interface21.webmvc.servlet.mvc.asis.ForwardController;
import com.techcourse.controller.LoginController;
import com.techcourse.controller.LoginViewController;
import com.techcourse.controller.LogoutController;
import com.interface21.webmvc.servlet.HandlerMapping;
import com.interface21.webmvc.servlet.mvc.legacy.Controller;

@Deprecated
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Deprecated 활용 저는 생각도 못했는데 괜찮네요..

public class ManualHandlerMapping implements HandlerMapping {

private static final Logger log = LoggerFactory.getLogger(ManualHandlerMapping.class);
Expand All @@ -26,11 +23,6 @@ public ManualHandlerMapping() {
}

private void initialize() {
controllers.put("/", new ForwardController("/index.jsp"));
controllers.put("/login", new LoginController());
controllers.put("/login/view", new LoginViewController());
controllers.put("/logout", new LogoutController());

log.info("Initialized Handler Mapping!");
controllers.keySet()
.forEach(path -> log.info("Path : {}, Controller : {}", path, controllers.get(path).getClass()));
Expand Down
19 changes: 19 additions & 0 deletions app/src/main/java/com/techcourse/controller/IndexController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.techcourse.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import com.interface21.context.stereotype.Controller;
import com.interface21.web.bind.annotation.RequestMapping;
import com.interface21.web.bind.annotation.RequestMethod;
import com.interface21.webmvc.servlet.ModelAndView;
import com.interface21.webmvc.servlet.view.JspView;

@Controller
public class IndexController {

@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView getIndexPage(final HttpServletRequest req, final HttpServletResponse res) {
return new ModelAndView(new JspView("/index.jsp"));
}
}
39 changes: 28 additions & 11 deletions app/src/main/java/com/techcourse/controller/LoginController.java
Original file line number Diff line number Diff line change
@@ -1,37 +1,54 @@
package com.techcourse.controller;

import com.techcourse.domain.User;
import com.techcourse.repository.InMemoryUserRepository;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import com.interface21.webmvc.servlet.mvc.asis.Controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoginController implements Controller {
import com.interface21.context.stereotype.Controller;
import com.interface21.web.bind.annotation.RequestMapping;
import com.interface21.web.bind.annotation.RequestMethod;
import com.interface21.webmvc.servlet.ModelAndView;
import com.interface21.webmvc.servlet.view.JspView;
import com.techcourse.domain.User;
import com.techcourse.repository.InMemoryUserRepository;

@Controller
public class LoginController {

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

@Override
public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView getLoginPage(final HttpServletRequest req, final HttpServletResponse res) {
return UserSession.getUserFrom(req.getSession())
.map(user -> {
log.info("logged in {}", user.getAccount());
return new ModelAndView(new JspView("redirect:/index.jsp"));
})
.orElse(new ModelAndView(new JspView("/login.jsp")));
}

@RequestMapping(value = "/login", method = RequestMethod.POST)
public ModelAndView postLogin(final HttpServletRequest req, final HttpServletResponse res) {
if (UserSession.isLoggedIn(req.getSession())) {
return "redirect:/index.jsp";
return new ModelAndView(new JspView("redirect:/index.jsp"));
}

return InMemoryUserRepository.findByAccount(req.getParameter("account"))
.map(user -> {
log.info("User : {}", user);
return login(req, user);
})
.orElse("redirect:/401.jsp");
.orElse(new ModelAndView(new JspView("redirect:/401.jsp")));
}

private String login(final HttpServletRequest request, final User user) {
private ModelAndView login(final HttpServletRequest request, final User user) {
if (user.checkPassword(request.getParameter("password"))) {
final var session = request.getSession();
session.setAttribute(UserSession.SESSION_KEY, user);
return "redirect:/index.jsp";
return new ModelAndView(new JspView("redirect:/index.jsp"));
}
return "redirect:/401.jsp";
return new ModelAndView(new JspView("redirect:/401.jsp"));
}
}

This file was deleted.

16 changes: 11 additions & 5 deletions app/src/main/java/com/techcourse/controller/LogoutController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,20 @@

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import com.interface21.webmvc.servlet.mvc.asis.Controller;

public class LogoutController implements Controller {
import com.interface21.context.stereotype.Controller;
import com.interface21.web.bind.annotation.RequestMapping;
import com.interface21.web.bind.annotation.RequestMethod;
import com.interface21.webmvc.servlet.ModelAndView;
import com.interface21.webmvc.servlet.view.JspView;

@Override
public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception {
@Controller
public class LogoutController {

@RequestMapping(value = "/logout", method = RequestMethod.GET)
public ModelAndView logout(final HttpServletRequest req, final HttpServletResponse res) {
final var session = req.getSession();
session.removeAttribute(UserSession.SESSION_KEY);
return "redirect:/";
return new ModelAndView(new JspView("redirect:/"));
}
}
34 changes: 34 additions & 0 deletions app/src/main/java/com/techcourse/controller/UserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.techcourse.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.interface21.context.stereotype.Controller;
import com.interface21.web.bind.annotation.RequestMapping;
import com.interface21.web.bind.annotation.RequestMethod;
import com.interface21.webmvc.servlet.ModelAndView;
import com.interface21.webmvc.servlet.view.JsonView;
import com.techcourse.domain.User;
import com.techcourse.repository.InMemoryUserRepository;

@Controller
public class UserController {

private static final Logger log = LoggerFactory.getLogger(UserController.class);

@RequestMapping(value = "/api/user", method = RequestMethod.GET)
public ModelAndView show(final HttpServletRequest request, final HttpServletResponse response) {
final String account = request.getParameter("account");
log.debug("user id : {}", account);

final ModelAndView modelAndView = new ModelAndView(new JsonView());
final User user = InMemoryUserRepository.findByAccount(account)
.orElseThrow(() -> new IllegalArgumentException("해당 사용자가 존재하지 않습니다. 다시 로그인 해주세요."));

modelAndView.addObject("user", user);
return modelAndView;
}
}
2 changes: 1 addition & 1 deletion app/src/main/webapp/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

<!-- before login -->
<div class="navbar-nav d-none d-md-inline-block ms-auto me-0 me-md-3 my-2 my-md-0">
<a class="nav-link" href="/login/view" role="button"><i class="fas fa-user fa-fw"></i>&nbsp;로그인</a>
<a class="nav-link" href="/login" role="button"><i class="fas fa-user fa-fw"></i>&nbsp;로그인</a>
</div>
<!-- before login -->

Expand Down
2 changes: 1 addition & 1 deletion app/src/main/webapp/index.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
</div>
<% } else { %>
<div class="navbar-nav d-none d-md-inline-block ms-auto me-0 me-md-3 my-2 my-md-0">
<a class="nav-link" href="/login/view" role="button"><i class="fas fa-user fa-fw"></i>&nbsp;로그인</a>
<a class="nav-link" href="/login" role="button"><i class="fas fa-user fa-fw"></i>&nbsp;로그인</a>
</div>
<% } %>
</nav>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/webapp/register.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
</form>
</div>
<div class="card-footer text-center py-3">
<div class="small"><a href="/login/view">이미 가입하셨나요? 로그인 하러가기</a></div>
<div class="small"><a href="/login">이미 가입하셨나요? 로그인 하러가기</a></div>
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

import com.interface21.webmvc.servlet.mvc.asis.Controller;
import com.interface21.webmvc.servlet.mvc.legacy.Controller;

@Deprecated
class ManualHandlerMappingTest {

@Nested
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.techcourse;
package com.interface21.webmvc.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
Expand All @@ -8,27 +9,27 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.interface21.webmvc.servlet.ModelAndView;
import com.interface21.webmvc.servlet.mvc.HandlerAdapter;
import com.interface21.webmvc.servlet.mvc.HandlerAdapterRegistry;
import com.interface21.webmvc.servlet.mvc.HandlerMappingRegistry;

public class DispatcherServlet extends HttpServlet {

private static final long serialVersionUID = 1L;
private static final Logger log = LoggerFactory.getLogger(DispatcherServlet.class);
private static final String BASE_PACKAGE_KEY = "basePackage";

private final HandlerMappingRegistry handlerMappingRegistry;
private final HandlerAdapterRegistry handlerAdapterRegistry;

public DispatcherServlet() {
this.handlerMappingRegistry = new HandlerMappingRegistry("com.techcourse");
public DispatcherServlet(final ServletContext servletContext) {
String basePackage = (String) servletContext.getAttribute(BASE_PACKAGE_KEY);
this.handlerMappingRegistry = new HandlerMappingRegistry(basePackage);
this.handlerAdapterRegistry = new HandlerAdapterRegistry();
}

@Override
public void init() {
handlerMappingRegistry.add(new ManualHandlerMapping());
log.info("DispatcherServlet init");
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package com.interface21.webmvc.servlet.mvc;
package com.interface21.webmvc.servlet;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import com.interface21.webmvc.servlet.ModelAndView;

public interface HandlerAdapter {

boolean supports(final Object handler);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.interface21.webmvc.servlet.mvc;
package com.interface21.webmvc.servlet;

import jakarta.servlet.http.HttpServletRequest;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.interface21.webmvc.servlet.mvc.tobe;
package com.interface21.webmvc.servlet.mvc;

import java.lang.reflect.Method;
import java.util.Arrays;
Expand All @@ -11,7 +11,7 @@

import com.interface21.web.bind.annotation.RequestMapping;
import com.interface21.web.bind.annotation.RequestMethod;
import com.interface21.webmvc.servlet.mvc.HandlerMapping;
import com.interface21.webmvc.servlet.HandlerMapping;

public class AnnotationHandlerMapping implements HandlerMapping {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.interface21.webmvc.servlet.mvc.tobe;
package com.interface21.webmvc.servlet.mvc;

import java.lang.reflect.Modifier;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.interface21.webmvc.servlet.mvc.tobe;
package com.interface21.webmvc.servlet.mvc;

import java.util.Set;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import java.util.ArrayList;
import java.util.List;

import com.interface21.webmvc.servlet.HandlerAdapter;

public class HandlerAdapterRegistry {

private final List<HandlerAdapter> handlerAdapters;
Expand All @@ -14,7 +16,6 @@ public HandlerAdapterRegistry() {

private void initialize() {
handlerAdapters.add(new HandlerExecutionHandlerAdapter());
handlerAdapters.add(new ControllerHandlerAdapter());
}

public HandlerAdapter getHandlerAdapter(final Object handler) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.interface21.webmvc.servlet.mvc.tobe;
package com.interface21.webmvc.servlet.mvc;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import com.interface21.webmvc.servlet.HandlerAdapter;
import com.interface21.webmvc.servlet.ModelAndView;
import com.interface21.webmvc.servlet.mvc.tobe.HandlerExecution;

public class HandlerExecutionHandlerAdapter implements HandlerAdapter {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.interface21.webmvc.servlet.mvc.tobe;
package com.interface21.webmvc.servlet.mvc;

import com.interface21.web.bind.annotation.RequestMethod;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import jakarta.servlet.http.HttpServletRequest;

import com.interface21.webmvc.servlet.mvc.tobe.AnnotationHandlerMapping;
import com.interface21.webmvc.servlet.HandlerMapping;

public class HandlerMappingRegistry {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.interface21.webmvc.servlet.mvc.tobe;
package com.interface21.webmvc.servlet.mvc;

import java.util.Arrays;
import java.util.List;
Expand Down
Loading