inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

MVC 패턴 - 적용

mvc회원 저장이 이루어 지지 않고 404 에러페이지로 연결됩니다.

해결된 질문

662

양치잘하기

작성한 질문수 67

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

MvcMemberSaveServlet입니다.

package hello.servlet.web.servletmvc;

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {
    // 싱글톤으로 설정하여 인스턴스를 가져와야함
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 브라우저에서 넘어온 값 변수로 설정하기
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        // 파라미터 읽어온 값은 스트링이기 때문에 int형으로 변환을 해주어야 한다.

        // 자바 코드로 작성한 멤버 객체를 브라우저에서 넘어온 값으로 생성, 저장
        Member member = new Member(username, age);
        memberRepository.save(member);

        // Model에 데이터를 보관해야 한다.
        request.setAttribute("member", member);
        // request객체 내부에 저장소에 저장하는 기능임

        String viewPath = "WEB-INF/views/save-result.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);
    }
}

save-result.jsp입니다.

<li>태그가 인식이 이상하게 되는거 같습니다. 중간에 줄바꿈이 안되요

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
성공
<ul>
    <li>id= ${member.id}</li><li>username=${member.username}</li>
    <li>age=${member.age}</li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>

new-form.jsp입니다.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="save" method="post">
    username: <input type="text" name="username" />
    age:      <input type="text" name="age" />
    <button type="submit">전송</button>
</form>
</body>
</html>

어느 부분에서 틀린건지 찾아봐도 모르겠습니다 .ㅠ

spring mvc

답변 2

1

OMG

안녕하세요. 양치잘하기님, 공식 서포터즈 OMG입니다.

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx


주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

 


링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

0

양치잘하기

https://drive.google.com/file/d/1lpLDI2tdB1XYJ9gcBULCswP8e14BblrG/view?usp=drive_link

구글 드라이브에 파일 압축해서 업로드 하였습니다. 확인해주시면 감사하겠습니다.

0

양치잘하기

으아아 문제점 확인하였습니다.

MvcMemberSaveServlet클래스의 viewPath경로에서

WEB-INF 경로 앞부분에 / 를 빼먹었었네요 ㅠㅠ 새벽에 하느라 문제점을 잘 못찾았던거 같습니다. 다시 보니까 문제점이 보이네요 ㅠㅠ

0

양치잘하기

다른 질문으로 @WebServlet 어노테이션에서 urlPattern은 패턴과 동일한 경로를 입력하면 해당 클래스를 실행해주는것으로 이해하였는데 잘 제가 잘 이해 한 것인지 궁금합니다.

또 name=""의 값이 단지 개발자의 유지보수 측면에서 시작문자만 소문자로 바꾼 클래스의 이름과 동일하게 작성하는 이유인지 궁금합니다.

1

OMG

저도 문제 확인해서 '/' 누락 확인해서 답변 드릴려고했는데, 먼저 발견하셨군요 😀

추가 질문에 대한 답변드리겠습니다.

@WebServlet urlPattern 관련

네 맞습니다. 해당 패턴으로의 (클라이언트)요청을 처리하는 서블릿이 실행됩니다

@WebServlet name 관련

네 맞습니다. name으로 어떠한 컨벤션을 가져가더라도 큰 문제는 되지 않을거에요.

톰캣 쪽 문서를 보니 클래스 이름과 동일(소문자시작x)하게 지정한 것을 확인하였습니다.

강의에서나 혹은 다른 자료,코드에서 동일하게 카멜케이스 방식으로 작성된 서블릿 명칭이 있다면, 유지보수성, 가독성, 통일성 등을 고려하여 작명한 것으로 보시면 될 것 같아요 😀

image

 

 

1

OMG

다음 링크의 David님의 답변을 보시면 관련 배경지식을 확장하실 수 있으실거에요 😀
https://www.inflearn.com/questions/243878/webservlet%EC%9D%98-name%EC%9D%84-%EC%A7%80%EC%A0%95%ED%95%B4-%EC%A4%AC%EB%8A%94%EB%8D%B0-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%82%98%EC%9A%94

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 양치잘하기님.

오류가 발생하는 상황에 대해 확인해볼 수 있는 몇 가지 점검 사항이 있습니다. 일반적으로 404 에러는 요청한 리소스가 서버에 없을 때 발생하는 HTTP 응답 코드입니다. 따라서 먼저 확인해볼 부분은 URL 패턴과 서블릿 매핑이 올바르게 이루어졌는지, JSP 파일의 경로가 올바른지 여부입니다.

  1. 서블릿 URL 패턴 확인: @WebServlet 어노테이션에서 지정한 URL 패턴(/servlet-mvc/members/save)이 실제 요청 URL과 일치하는지 확인해야 합니다.

  2. JSP 파일 경로: save-result.jsp 파일의 경로 주소가 올바른지 확인합니다. WEB-INF 폴더 안에 위치해 있으므로 파일 경로 앞에 /WEB-INF/를 붙여야 합니다.

위 내용은 일반적인 점검 사항이며, 기존에 해결된 질문 가운데 유사한 상황을 다룬 사례를 찾아보면 아래와 같은 링크가 있습니다:

이 중에서 회원목록 조회시 오류 문제의 경우 질문자가 JSP 파일 경로 지정에 실수를 하여 발생한 문제로 보이며, 이를 수정하여 해결한 사례입니다. 이러한 해결 사례를 참고하여 귀하의 코드 경로를 확인해 볼 수 있습니다.

또한 forward 흐름을 제가 생각한게 맞는지 궁금합니다! 질문에서는 getRequestDispatcher와 JSP에서의 데이터 흐름에 대해 확인하고 있어 이것도 참고할 만합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

servlet과 container에 대한 질문입니다

0

20

1

api를 어느 컨트롤러에 작성해야하는지는 어떤 기준으로 해야하나요?

0

62

1

jsp 의존성 수정 요청

0

75

2

요즘 웹 서버가 주로 사용되는 이유는 SPA 구조 때문일까요 ?

0

142

1

save() 메서드 문의

0

65

1

절대 경로로 templates/basic 하위 파일 열면 css 적용 안되는 현상

0

99

1

request-body-json

0

83

2

MVC 패턴의 적용 단위

0

94

1

RequestMapping을 이용한 핸들러, 어댑터

0

118

2

save 후 결과화면

0

86

2

jsp를 이용한 view

0

97

1

application.properties에 debug 추가해도 결과가 똑같습니다.

0

174

1

수업 코드 제공 관련 문의

0

96

2

RequestMappingHandlerAdapter의 Controller 호출 과정

0

98

3

파일 오픈 시

0

68

1

스프링 배치 관련

0

77

1

@RequestParam의 defaultValue가 blank 값도 처리하는 지 여부

0

112

1

postman으로 /request-body-json-v1 호출시 500 error

0

94

1

프론트엔드와 백엔드의 mvc, rest api에 대한 질문

0

77

1

모델의 역할과 계층 분리에 대한 이해 차이 + 추가질문

0

111

1

console log 출력 관련 질문입니다.

0

73

1

애플리케이션이 실행 되지 않습니다 ㅠㅠㅠ

0

137

1

html 변경하는 부분 적용 문제

0

100

1

한글 깨짐

0

76

2