인프런 커뮤니티 질문&답변

양치잘하기님의 프로필 이미지
양치잘하기

작성한 질문수

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

MVC 패턴 - 적용

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

작성

·

510

·

수정됨

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>

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

답변 2

1

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

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

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

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

https://bit.ly/3fX6ygx


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


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

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

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

 


링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

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

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

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

MvcMemberSaveServlet클래스의 viewPath경로에서

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

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

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

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

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

@WebServlet urlPattern 관련

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

@WebServlet name 관련

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

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

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

image

 

 

0

안녕하세요, 인프런 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에서의 데이터 흐름에 대해 확인하고 있어 이것도 참고할 만합니다.

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

양치잘하기님의 프로필 이미지
양치잘하기

작성한 질문수

질문하기