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단계] 짱수(장혁수) 미션 제출합니다. #840

Open
wants to merge 21 commits into
base: zangsu
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
d983eb8
feat: JsonView 구현
zangsu Sep 30, 2024
538ed8b
refactor: 모든 controller 를 어노테이션 기반으로 변경
zangsu Sep 30, 2024
61e8883
chore: 사용하지 않는 레거시 코드 삭제
zangsu Sep 30, 2024
44d1771
feat: 유저 정보 조회 기능 추가
zangsu Sep 30, 2024
f95547c
chore: tobe 패키지 삭제
zangsu Sep 30, 2024
457420f
refactor: model 이 하나인 경우에 대한 검증 추가
zangsu Sep 30, 2024
273ad5f
style: dependency 를 정렬
zangsu Oct 3, 2024
047876d
refactor: DispatcherServlet 이 포함할 패키지 명시
zangsu Oct 3, 2024
c6487f1
test: DispatcherServlet 이 테스트용 패키지를 사용하도록 변경
zangsu Oct 3, 2024
b1ed677
refactor: 미디어 타입을 정해진 상수를 사용하도록 변경
zangsu Oct 3, 2024
6cdd040
study: stage3 완료
zangsu Oct 3, 2024
3d40a74
style: 코드 스타일 재설정
zangsu Oct 7, 2024
7ca2947
refactor: Stream 을 사용해 HandlerMappingAdapter 생성부터 초기화까지의 과정을 한번에 진행하도…
zangsu Oct 7, 2024
f447f51
refactor: 요청을 처리할 수 있는 HandlerAdapter 를 조회하는 부분을 메서드 분리
zangsu Oct 7, 2024
4144e07
docs: 처리한 부분에 대한 todo 제거
zangsu Oct 7, 2024
dc16972
refactor: 필드 접근 제어자 중복 설정 제거
zangsu Oct 7, 2024
09adbde
study: stage4 완료
zangsu Oct 7, 2024
083c2f8
refactor: Throwable -> Exception 으로 변경
zangsu Oct 14, 2024
9ae262c
refactor: Stream.peek() 사용하도록 변경
zangsu Oct 14, 2024
d3b2066
refactor: 잘못된 요청에 대해 에러 페이지 제공
zangsu Oct 14, 2024
d87ddd1
refactor: Jsp 확장자를 빼고 전달할 수 있도록 변경
zangsu Oct 14, 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
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ dependencies {
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:10.1.25'
implementation 'ch.qos.logback:logback-classic:1.5.7'
implementation 'org.apache.commons:commons-lang3:3.14.0'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.1'

testImplementation 'org.assertj:assertj-core:3.26.0'
testImplementation 'org.mockito:mockito-core:5.12.0'
Expand Down
19 changes: 19 additions & 0 deletions app/src/main/java/com/techcourse/controller/ForwardController.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 ForwardController {

@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
return new ModelAndView(new JspView("/index"));
}
}
40 changes: 29 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,55 @@
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.POST)
public ModelAndView save(HttpServletRequest req, HttpServletResponse res) {
if (UserSession.isLoggedIn(req.getSession())) {
return "redirect:/index.jsp";
return new ModelAndView(new JspView("redirect:/index"));
}

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")));
}

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"));
}
return "redirect:/401.jsp";
return new ModelAndView(new JspView("redirect:/401"));
}

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

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) throws Exception {
final var session = req.getSession();
session.removeAttribute(UserSession.SESSION_KEY);
return "redirect:/";
return new ModelAndView(new JspView("redirect:/"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ public ModelAndView save(HttpServletRequest req, HttpServletResponse res) {
req.getParameter("email"));
InMemoryUserRepository.save(user);

return new ModelAndView(new JspView("redirect:/index.jsp"));
return new ModelAndView(new JspView("redirect:/index"));
}

@RequestMapping(value = "/register/view", method = RequestMethod.GET)
public ModelAndView show(HttpServletRequest req, HttpServletResponse res) {
return new ModelAndView(new JspView("/register.jsp"));
return new ModelAndView(new JspView("/register"));
}
}
35 changes: 35 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,35 @@
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)
dwax1324 marked this conversation as resolved.
Show resolved Hide resolved
public ModelAndView show(HttpServletRequest request, HttpServletResponse response) {
final String account = request.getParameter("account");
Copy link
Member

Choose a reason for hiding this comment

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

"account" parameter가 2개 이상이면 어떻게 될까요?🤔

Copy link
Author

Choose a reason for hiding this comment

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

그런 경우 첫번째로 전달된 파라미터의 값만 확인해주고 있네요.
그런데, 또 API 자체가 하나의 account 파라미터를 지원한다고 명시했을 때 여러개의 쿼리 파라미터 요청을 고려해 주는 것이 맞을지,,, 고민은 됩니다.

log.debug("user id : {}", account);

final ModelAndView modelAndView = new ModelAndView(new JsonView());
final User user = InMemoryUserRepository.findByAccount(account)
.orElseThrow();

modelAndView.addObject("user", user);
return modelAndView;
}
}
60 changes: 0 additions & 60 deletions app/src/main/java/com/techcourse/framework/DispatcherServlet.java

This file was deleted.

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.mvc.framework.DispatcherServlet;

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

@Override
public void onStartup(final ServletContext servletContext) {
final var dispatcherServlet = new DispatcherServlet();
final var dispatcherServlet = new DispatcherServlet("com.techcourse.controller");

final var registration = servletContext.addServlet(DEFAULT_SERVLET_NAME, dispatcherServlet);
if (registration == null) {
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Loading