8/18/2019

스프링 게시판 만들기 #4. 게시물 목록 페이지 구현

지금은 테이블에 데이터가 하나도 없으므로, 임시로 데이터를 넣겠습니다.

insert into tbl_board(title, content, writer)
  values('테스트 제목1', '테스트 내용', '작성자');

insert into tbl_board(title, content, writer)
  values('테스트 제목2', '테스트 내용', '작성자');

insert into tbl_board(title, content, writer)
  values('테스트 제목3', '테스트 내용', '작성자');

insert into tbl_board(title, content, writer)
  values('테스트 제목4', '테스트 내용', '작성자');

insert into tbl_board(title, content, writer)
  values('테스트 제목5', '테스트 내용', '작성자');

commit;

select * from tbl_board;

목록을 출력할 페이지를 생성합니다.

view 폴더를 우클릭한 뒤 New → Folder을 선택해 폴더를 생성합니다.

폴더명은 board 로 해줍니다.

다음은 실제로 보여질 jsp파일을 생성합니다.

만들어진 board 폴더를 우클릭한 뒤 New → Other 를 선택합니다.

jsp로 검색하면 바로 찾을 수 있습니다. JSP File을 선택하고 다음(Next) 버튼을 클릭합니다.

경로를 확인하고, 파일명(File name)은 list.jsp를 입력한 뒤 다음(Next) 버튼을 클릭합니다.

html5 템플릿을 선택한 뒤 완료(Finish) 버튼을 클릭합니다. 만약 html5 템플릿이 없다면 html4.1등의 구형 템플릿을 선택한 뒤 나중에 수정하면 됩니다.

jsp파일이 생성되었습니다.

jsp파일의 내용을 수정/추가합니다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>insert title here</title>
</head>
<body>

</body>
</html>

<body> 태그 내부에 테이블 태그를 추가합니다.

<table>
 <thead>
  <tr>
   <th>번호</th>
   <th>제목</th>
   <th>작성일</th>
   <th>작성자</th>
   <th>조회수</th>
  </tr>
 </thead>
 
 <tbody>
  
 </tbody>

</table>

home.jsp에 게시물 목록 페이지로 이동할 수 있는 링크를 추가합니다.

<p><a href="/board/list">게시물 목록</a></p>

프로젝트를 실행하고, 게시물 목록 링크를 클릭합니다.

그럼 404 에러가 발생하는데, 404 에러가 발생한 이유는 board/list 에 해당되는 컨트롤러가 없기 때문입니다.

com.board.controller 패키지를 우클릭한 뒤 New → Class 를 선택합니다.

패키지를 확인하고, 컨트롤러 이름은 BoardController로 입력하고 완료(Finish) 버튼을 클릭합니다.

BoardController가 생성되었습니다.

BoardController에 코드를 추가합니다.

package com.board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.board.dao.BoardDAO;
import com.board.domain.BoardVO;
import com.board.service.BoardService;

@Controller
@RequestMapping("/board/*")
public class BoardController {

 @RequestMapping(value = "/list", method = RequestMethod.GET)
 public void getList() throws Exception {
  
   
 }
}

Server 윈도우에서 현재 사용하는 서버를 더블 클릭하고, Modules 탭을 선택합니다.

현재 프로젝트를 선택하고, 수정(Edit) 버튼을 클릭합니다.

Path의 값을 /를 입력하고 확인(OK) 버튼을 클릭합니다.

이제 프로젝트를 실행해보면, 첫 페이지의 주소에 있던 controller가 없어진걸 확인할 수 있습니다.

또, 게시물 목록 링크를 클릭하여 게시물 목록 페이지로 접속할 수 있게 되었습니다. 물론 아직 데이터 베이스에서 데이터를 가져오지 않았기 때문에 내용은 없습니다.

데이터 베이스에서 쿼리를 작성해 필요한 데이터를 출력해봅니다.

이때, 와일드 카드 문자(*)를 사용하지말고 필요한 컬럼을 직접 입력하도록 합니다.

매퍼에 쿼리를 추가합니다.

<!-- 게시물 목록 -->
<select id="list" resultType="com.board.domain.BoardVO">
 select
  bno, title, content, writer, regDate, viewCnt
 from tbl_board
</select>

아이디(id)는 매퍼내에서 쿼리를 구분짓는 고유한 이름, 리설트 타입(resultType)는 쿼리의 결과의 형태입니다.

src/main/java 를 우클릭한 뒤 New → Package 를 선택합니다.

com.board.dao 를 입력하고 완료(Finish) 버튼을 클릭합니다.

같은 방법으로 com.board.service 패키지를 생성합니다.

com.board.dao 패키지를 우클릭한 뒤 New → Interface 를 선택합니다.

이름(Name)에 BoardDAO 를 입력하고 완료(Finish) 버튼을 클릭합니다.

생성된 BoardDAO에 코드를 추가합니다.

package com.board.dao;

import java.util.List;

import com.board.domain.BoardVO;

public interface BoardDAO {
 
 public List list() throws Exception; 

}

com.board.dao 패키지를 우클릭한 뒤 New → Class 를 선택합니다.

이름(Name)에 BoardDAOImpl 를 입력하고, 인터페이스(Interfaces) 항목의 추가(Add) 버튼을 클릭합니다.

방금 만든 인터페이스를 검색하여 선택한 뒤 확인(OK) 버튼을 클릭합니다.

인터페이스(InterFaces) 항목에 BaordDAO가 추가된것을 확인할 수 있습니다. 이제 완료(Finish) 버튼을 클릭합니다.

BoardDAO를 상속받는 BoardDAOImple가 생성되었습니다.

BoardDAOImpl의 코드를 추가합니다.

package com.board.dao;

import java.util.List;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.board.domain.BoardVO;

@Repository
public class BoardDAOImpl implements BoardDAO {

 @Inject
 private SqlSession sql;
 
 private static String namespace = "com.board.mappers.board";

 // 게시물 목록
 @Override
 public List list() throws Exception { 
  
  return sql.selectList(namespace + ".list");
 }

}

게시물, 즉 tbl_board 1행의 데이터의 형태는 BoardVO와 같습니다. 게시물 목록은 tbl_board가 1행 이상 존재하는것이므로, BoardVO를 리스트(List) 형태로 만들면 게시물 목록을 받아올 수 있습니다.

여기서 BoardDAOImpl에 있는 namespace는 매퍼의 namespace와 일치해야합니다.

BoardDAO, BoardDAOImpl를 생성한것과 같은 방법으로, 인터페이스 BoardService와 이를 상속받는 BoardServiceImpl를 생성합니다.

BoardServiceImpl에 코드를 추가합니다.

package com.board.service;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.board.dao.BoardDAO;
import com.board.domain.BoardVO;

@Service
public class BoardServiceImpl implements BoardService {

 @Inject
 private BoardDAO dao;
 
 @Override
 public List list() throws Exception {

  return dao.list();
 }

}

코드 자체는 BoardDAOImpl와 크게 다르지 않지만, BoardDAOImpl와 다른 역할을 맡고 있습니다.

이제 BoardController에 코드를 추가합니다.

package com.board.controller;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.board.dao.BoardDAO;
import com.board.domain.BoardVO;
import com.board.service.BoardService;

@Controller
@RequestMapping("/board/*")
public class BoardController {

 @Inject
 private BoardService service;

 @RequestMapping(value = "/list", method = RequestMethod.GET)
 public void getList(Model model) throws Exception {
  
  List list = null;
  list = service.list();
  model.addAttribute("list", list);
 }
}

Model은 컨트롤러(Controller)와 뷰(View)를 연결해주는 역할을 합니다.

list.jps에 코드를 추가합니다.

<c:forEach items="${list}" var="list">
 <tr>
  <td>${list.bno}</td>
  <td>${list.title}</td>
  <td>${list.regDate}</td>
  <td>${list.writer}</td>
  <td>${list.viewCnt}</td>
 </tr>
</c:forEach>

컨트롤러(Controller)에서 받아온 데이터를 출력하기 위해 jstl의 반복문을 이용하여 출력합니다.

이제 프로젝트를 시작하려면... 500 에러가 발생합니다.

500 에러가 발생한 이유는, 스프링이 BoardDAO와 BoardService를 찾을 수 없기 때문입니다.

root-context.xml 를 열고 아래의 코드를 추가합니다.

<context:component-scan base-package="com.board.domain" />
<context:component-scan base-package="com.board.dao" />
<context:component-scan base-package="com.board.service" />

이 코드를 입력해두면 스프링이 패키지를 찾아서 사용할 수 있게됩니다.

자, 다시 프로젝트를 시작하고 게시물 목록 페이지로 이동해봅니다.

또 500 에러가 발생했습니다.

에러 내용을 살펴보면, 테이블을 찾을 수 없다는 내용입니다.

테이블을 찾을 수 없는 경우, 위 처럼 테이블 앞에 데이터 베이스명을 붙여주면 해결됩니다.

이제 게시물 목록 페이지에 접속하면, 데이터 베이스에 있는 데이터가 출력되는걸 확인할 수 있습니다.

여기에서 데이터 베이스는 board 하나만 사용하므로, 쿼리문마다 데이터 베이스명을 붙이는것보단 root-context.xml의 접속 주소에 데이터 베이스명을 미리 입력해주면 귀찮음(?)을 해결할 수 있습니다.

게시물 수정
  1. 정말 초보적인 질문 하나 하겠습니다ㅜㅜ
    컨트롤러 부분에서 list 메소드를 void로 처리하셨는데요.
    보통 String리턴메소드로 하고 리턴값으로 jsp파일 이름을 해서 화면에 띄우지 않나요?
    예: @RequestMapping(value = "/list")
    public String list(Model model) {
    List list = service.list();
    model.addAttribute("list", list);
    return "board/list";
    }

    근데 어떻게 void 로 처리해도 스프링이 알아서 list.jsp파일을 찾아서 화면에 출력하는지 궁금합니다.

    "Model은 컨트롤러(Controller)와 뷰(View)를 연결해주는 역할을 합니다."
    라고 쓰신 것처럼 model 에 넣어서 보낸 list가 list.jsp에서 쓰이기 때문에 출력할 수 있는 건가요?

    답글삭제
    답글
    1. 아 @RequestMapping이 매핑할 경로를 지정하는 거라서 우리가 @RequestMapping을 board/list 로 지정했으니
      뷰폴더 밑에 board/list 로 가서 매핑하고 출력하는거군요!

      그동안 가라로 @RequestMapping은 그냥 url주소에 쓸 경로 이름이구나 로 이해했어요.
      url에 쓰는 경로긴 하되 리턴할 jsp 없이 void면 @RequestMapping으로 쓴대로 뷰폴더 안 경로가 되는거군요!
      제가 이해한 게 맞을까요? ㅎㅎ
      늘 큰 도움 받고 있습니다!

      삭제
    2. 안녕하세요? 방문해주셔서 감사합니다.

      말씀하신대로 리퀘스트매핑(RequestMapping)을 기준으로 url의 접속여부가 결정됩니다.
      이때 리턴(return)으로 다른 페이지에 주소가 있는 경우는 일반적으로 POST 메서드입니다.

      POST메서드에서는 이런저런 작업을 끝내고 다른 페이지로 이동할 때 리턴값에 다른 페이지 주소를 적어서 그 주소의 GET 메서드로 이동하는거죠.

      삭제
  2. 안녕하세요?
    덕분에 잘 보고 있습니다..

    질문이 있는데요
    마지막에 실행하면 이렇게 줄바꿈없이 나오는데 어떤부분이 잘못된걸까요?


    번호 제목 작성일 작성자 조회수1 테스트 제목1 Thu Oct 03 13:22:19 KST 2019 작성자 0 2 테스트 제목2 Thu Oct 03 13:22:19 KST 2019 작성자 0 3 테스트 제목3 Thu Oct 03 13:22:19 KST 2019 작성자 0 4 테스트 제목4 Thu Oct 03 13:22:19 KST 2019 작성자 0 5 테스트 제목5 Thu Oct 03 13:22:19 KST 2019 작성자 0


    감사합니다.;

    답글삭제
    답글
    1. 안녕하세요?
      해결해가지고 답글 남깁니다.
      list.jsp 파일에서 jstl 반복문의 위치를 table 밖에 두어서 그랬었네요..

      삭제
    2. 안녕하세요? 방문해주셔서 감사합니다.
      해결되셨다니 다행이네요.

      삭제
  3. BoardController.java 파일에서 import com.board.dao.BoardDAO; 구문이 오류가 발생합니다.

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      먼저 에러가 어떤 종류인지 알아야겠지만...
      import com.board.dao.BoardDAO; 에서 에러가 발생한다면 com.board.dao.BoardDAO 파일이 존재하지 않거나 접근제한자(modifiers)가 public이 아니어서 그럴 수 있습니다.

      삭제
  4. 안녕하세요. 질문이 있는데 서비스랑 dao를 인터페이스로 사용하셨는데
    인터페이스가 아닌 Impl을 그냥 사용해도 에러 없이 동작하는데 굳이 인터페이스를 쓰는 이유가 뭔가요??
    그리고 인터페이스를 호출하는데 어떻게 Impl을 알아서 찾아가는지 궁금합니다.

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      먼저, 인터페이스 없이 구현부(Impl)를 그냥 사용하더라도 아무런 문제가 없고, 개인적으로 이쪽을 더 선호하기 때문에(!) 저는 실제로 작업할 때 인터페이스 자체를 사용하지 않고 곧바로 구현부를 만들어서 사용합니다.

      본문에 사용된 인터페이스는, 인터페이스라 부르기 힘들정도로 어떠한 코드도 없으나
      실제로 사용되는 인터페이스들은.. 최종적으로 재활용이 가능하며, 유지보수를 쉽게하기 위해 작성 및 사용됩니다.

      같은 기능을 하는 메서드가 여러개 필요할 때, 인터페이스를 미리 만들어두고 이를 호출하는 방식으로 사용하면 개발자가 개발하는데 있어서 더 용이할 수 있겠지요? 약간 다르긴 하지만, 결과적으로 공통적으로 사용될 기능을 따로 빼두어서 필요할때마다 사용할 목적으로 만들었다, 라고 이해하시면... 조금 괜찮지 않을까 싶습니다.

      위에서 말한대로 저는 인터페이스 사용을 하지 않고, 공통적으로 필요한 부분이라면 별도의 메서드나 클래스로 분류해서 호출하는 방식을 사용합니다. 저는 이게 더 보기 좋더군요. 무엇보다 '이게 여기 왜 있는건데?'라는 생각을 하지 않을 수 있어서 좋은거같습니다.


      그럼에도 불구하고 본문에 저런 불필요해보이는 인터페이스를 사용하는건.. 그냥 관례정도로 보시면 되겠습니다(...)

      그리고 호출되는건 인터페이스인데 구현부를 찾아가는건... 인터페이스를 호출하면, 인터페이스는 자동으로 구현부를 호출하게 되는걸로 알고 있습니다. 이 부분은 좀 부정확할수도 있겠네요.

      삭제
    2. 부정확할 수도 있다는 부분은 걱정 안하셔도 될 것 같습니다^^
      인터페이스를 호출하게 되면 스프링이 인터페이스를 상속받은 구현체를 자동으로 등록시켜줍니다.

      삭제
  5. 정말 너무너무 감사드립니다!!! 드디어 처음으로 빛이 조금 보이는 것 같아요ㅠㅠ

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      도움이 되어서 다행입니다. 이후 게시물들은 차근차근-_-; 만들어가겠습니다;

      삭제
  6. 안녕하세요 초보자인데 보면서 정말 도움이 되고 있습니다! 하다가 막혀서 그런데 그래도 복사 붙여넣기 했는데 BoardController랑 BoardServiceImpl list쪽에 빨간줄이 그어져있는데 create해서 BoardService에 List list() throws Exception; 하는거 맞는건가요????

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      list쪽에 빨간줄이 그어져있다면.. DAO부터 리턴 타입을 확인해보셔야할 것 같습니다.
      또는 빨간줄이 그어진곳에 마우스를 올려보시면, 어느부분이 잘못되었는디 툴팁형식으로 표시되니 확인해보시기 바랍니다.

      삭제
    2. 익명6/25/2021

      일단 질문드리기 전에 많은 도움 주셔서 감사합니다. 저도 같은 증상이 나타나 질문드립니다 일단 BoardController 와 BoardServicelmpl에서 List에 빨간줄이 그이는군요. 에러는 List cannot be resolved to a type이라 뜹니다
      그리고 BoardDaolmpl에서는 sql과 namespace 부분에 경고가 뜹니다 사용하지도 않는다라구요.... 공부하느라 일단 무지성으로 따라하는 학생입니다 잘 부탁드립니다

      삭제
    3. 안녕하세요? 방문해주셔서 감사합니다.

      List에 에러가 발생하는 경우, 컨트롤+쉬프트+O를 눌러서 자동 임포트 해주시면 해결될것 같습니다.
      sql, namespace는 실제로 사용하지 않아서 경고가 뜨는건지, 아니면 사용하는데 경고가 뜬다는건지 잘 모르겠군요. 전자의 경우 사용하면 경고가 사라질테니 문제는 안될텐데 후자라면 메시지를 좀 더 봐야할거같습니다.

      삭제
  7. 똑같이 진행했는데 여기에서 Origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 그것이 존재하는지를 밝히려 하지 않습니다.

    라는 에러가 나오네요...

    구글링해서 프로젝트 clean도 해보고 톰켓에 path가 /로 되어있는 것도 확인했는데 왜 오류가 나는지 모르겠네요 ㅠㅠ

    답글삭제
    답글
    1. 깃허브 소스 복사해서 붙여넣다보니 해결되긴 했는데...확실한 원인은 잘 모르겠네요.

      일단은 root-context.xml 에서 윗부분을 이걸로 고치니까 된 것같기도 하고..
      그 전까지는 문제가 없었었거든요.

      삭제
    2. 안녕하세요? 방문해주셔서 감사합니다.

      이클립스(또는 STS)를 사용하실때 흔히 겪는 문제입니다.

      문제가 없는데 확실한데, 심지어 아무작업도 안했는데 안되는 경우가 있습니다-_-;
      프로젝트 클린, 서버 클린, 이클립스 재시작 등등.. 반복적으로 초기화 작업을 해줘야 해결되는 경우도 있습니다.

      삭제
  8. <context:component-scan base-package="com.board.domain" />
    <context:component-scan base-package="com.board.dao" />
    <context:component-scan base-package="com.board.service" />

    답글삭제
    답글
    1. 일단 저 같은 경우 root-context.xml 에 이 부분을 넣고 나서 에러가 나와서
      그것을 고치려고 servlet-context.xml 에 있는 윗부분 내용을 긁어와서 해보려다가 404에러가 나와서요

      혹시 괜찮으시다면 글에 root-context.xml의 윗부분 코드도 추가해주시면 좋을 거같아요

      삭제
    2. 안녕하세요? 방문해주셔서 감사합니다.

      root-context.xml의 코드는 깃허브 저장소에서 보실 수 있습니다.
      게시물 본문 시작과 끝 또는 여기를 클릭하시면 보실 수 있습니다

      삭제
  9. 정말 감사합니다 ㅠㅠ 너무 자세히 써주셔가지고 도움이 많이 됐습니다. 남은 강좌도 잘 보고 가겠습니다!

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      말로만 빨리 다음글 추가하겠다고만 하지말고 행동으로 옮겨야하는데..
      나태병이 제대로 생겼나봅니다..ㅠㅠ

      삭제
  10. 작성자가 댓글을 삭제했습니다.

    답글삭제
  11. DAO 파일에 BoardVo 제네릭스가 없습니다.

    그리고 닉네임이 kuzuro인 이유가 무엇인가요?

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      DAO에 BoardVO가 없는(혹은 찾을 수 없는)에러가 발생한 경우
      BoardVO가 damain에 있다는 가정하에, Ctrl+shitf+O를 누르면 추가할 수 있습니다.

      닉네임은.. 한자의 의미와 발음으로 뜻이 나눠지는데, 그 뜻과 별개로 이렇다할 의미는 없습니다

      삭제
  12. @RequestMapping어노테이션이 사이트주소말고 실제 views의 폴더 경로에도 영향을 미친다면 그 영향을 없애기위해서 servlet의 메소드를 몽땅 return이 있는 String으로만 만들어야 하나요?????

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      @RequestMapping가 "aaa"이고, 실제로 보여지는 화면의 경로가 views/test/a/bbb.jsp 처럼 상이한 경우, 리턴에 경로를 입력하는 방식으로 실제 경로를 설정해주시면 됩니다.

      삭제
  13. root-context.xml에서 이 부분을 주석처리하니 실행이 되는데요 주석처리를 빼니 "HTTP 상태 404 – 찾을 수 없음" 에러가 뜨더라구요
    타입 상태 보고

    설명 Origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 그것이 존재하는지를 밝히려 하지 않습니다.

    인 원인 불명입니다 어디를 고쳐야 정상 동작이 될까요?ㅠㅠ 며칠째 헤매네요








    답글삭제
    답글
    1. 복붙한 코드가 보지 않네요
      root-context.xml의
      bean 태그의 id=sqlSessionFactory 부분과
      bean 태그의 id=sqlSeesion 부분들을 주석 처리 해야지만 정상실행이 됩니다.

      어디를 수정해야 할까요?ㅠㅠ

      삭제
    2. 일단 너무 해결이 안 되어 다시 프로젝트 생성부터 차근 차근 해보았는데요,

      list.jsp 의 코드와




      boardMapper.xml의 코드 부분이 있어서 에러가 납니다.


      heidisql의 db 부분과 연결이 안되어서 그런건지 감이 잘 잡히질 않네요 ㅠㅠ...
      이 부분들을 주석처리 하면

      삭제
    3. 첫 페이지가 실행은 됩니다... 혹시 저의 heidisql 버젼이 11이라서 연결이 안되는 걸까요?

      삭제
    4. 대문자 매칭이 안되어 오류가 발생 했던 것 같습니다.. 해결 하여
      bno 에러가 뜨는데요
      java.lang.NumberFormatException: For input string: "bno"

      이 부분만 해결 하면 나올 것 같네요...

      삭제
    5. 해결했네요 ㅠㅠ 며칠 헤매다가 차근차근 수정하고 추가하다보니 결과 나왔습니다

      삭제
    6. 안녕하세요? 방문해주셔서 감사합니다.

      db버전에 따른 문제는 아니고 다른 문제같은데 이미 해결하셨네요(...)

      코드가 안보이는건 구글 블로거의 댓글 시스템 때문이고
      댓글 입력창 위에 그것에 대한 언급 및 올리는 방법에 대한 링크도 있습니다.

      삭제









  14. 이 코드입니다.

    답글삭제
  15. 선생님 log4j로 콘솔에 debug 단계를 보고 싶은데 log4j.xml파일에 lever value 값을 debug로 지정해도 먹히지않고 info단계로만 되네요 프로퍼티 파일을 따로 만들어줘야하나요

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      log4j의 기본파일에서 설정하신 경우 아마 안될겁니다(...)
      log4j 사이트에서 설정 파일을 받아서 사용하시면 잘될겁니다.

      삭제
  16. 선생님 BoardDao 인터페이스가 빈객체로 등록이 되있지 않음에도 불구하고 자동주입이 가능한 이유가 알고 싶습니다.

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      root-context에서 component-scan을 해주면, 해당 경로에 해당되는 파일이 모두 빈으로 자동등록됩니다.

      삭제
  17. 안녕하세요 무작정따라하고 있는데 list.jsp에서 board테이블 안에 insert되있는 정보가 나오지않아요

    혹시 뭐가 잘못되었는지 알 수 있을까요?

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      list에 해당되는 컨트롤러에서 db에 있는 데이터를 가지고 오지 않거나, 쿼리가 잘못된(코드적으로는 오류가 없으나 가져올 수 없는) 경우일거같습니다.

      list 컨트롤러와 그와 연결된 서비스, DAO, mapper 및 mapper의 쿼리문을 보셔야할 것 같습니다.

      삭제
  18. 익명7/29/2021

    안녕하세요 ㅎㅎ 너무 좋은 정보 올려주셔서 진심으로 감사합니다....지금까지의 과정을 잘 따라오면서 서버 실행도 너무 잘 되었었는데요////... 이번편을 다 따라하고 나서는 계속 에러가 나네요ㅜㅜ 테이블 정보가 안나와요... 혹시 이유가 무엇인지 알 수 있을까요?.. 정말 똑같이 따라했거든요... 에러원인은 이렇게 나옵니다..
    java.lang.Error: Unresolved compilation problem:
    The method list() is undefined for the type BoardService

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      list() 메서드가 없다고하는데, BoardService부터 BoardDAO까지 list()가 정상적으로 입력된건지.. 그러니까 반환 타입부터 매개변수, 메서드명까지 동일한지 확인해보셔야할 것 같습니다.

      삭제
  19. 안녕하세요. 올려주신 글들 보며 감사히 배우고 있습니다.
    조회 리스트에 내용을 추가하려고 list.jsp에 <th>내용</th>,<td>${list.content}</td>을 추가해봤는데 내용은 조회 목록에 보이지 않네요. boardMapper의 쿼리문에서 테이블 항목을 다 가져오는데 조회 목록에선 보이지 않는 이유가 궁금합니다.

    답글삭제
  20. 작성자가 댓글을 삭제했습니다.

    답글삭제
  21. ### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.board.mappers.boardlist

    이부분에서 계속 에러가 나서 막히는데요 매핑에서 문제가 있는 거같은데 코드를 붙여넣기해도 풀리지가 않아서 질문드립니다 ㅠㅠ

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      해당 에러는 mapper의 id가 중복되었거나 없을 때(=잘 못 입력) 발생하는 에러입니다.
      dao에서 올바르게 호출했는지, 혹은 mapper의 id가 중복되거나 없는지 확인해 보셔야 할 것 같습니다.

      삭제
  22. 안녕하세요 열심히 독학중인 학생입니다.
    마리아 대신 전에 사용해보았던 sql devloper (오라클)을 사용해서 진행을 해서인지 게시물목록으로 들어가게 되면 500오류가 뜨는데 원인이 db와 연동이 안되서 인가요? 혹시 다른 db와 연결하려면 어떻게 설정을 해야하는지 알 수 있을까요?

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      500 에러의 경우 컨트롤러부터 쿼리문까지, 그러니까 백쪽에서 에러가 발생한 경우입니다.
      에러 로그를 보시면 어느 파일(컨트롤러, 서비스, dao)에서 에러가 발생했는지 알려줄테니 그쪽 부분을 보셔서 수정하셔야 합니다.

      삭제
  23. at com.board.controller.BoardController.getList 에서 null 에러가 발생하는데 알수있을까요?

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      너무 늦게 확인해서 죄송합니다;

      getList에서 null에러가 발생한 경우, 쿼리문으로 가져온 값이 없다는 의미이므로
      요청한 url, 즉 게시물 목록 url에서 데이터 베이스까지 정상적으로 요청이 되는지 확인해 보셔야할 것 같습니다.

      삭제
  24. 여기서 404가 계속 뜨네요.
    천천히 봐도 다른 부분은 딱히 없어보이는데...
    다시 한 번 다 지우고 확인해봐야 겠습니다.

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      404 에러는 경로가 틀렸거나 해당 파일이 없을때 발생하는 에러입니다.

      컨트롤러의 매핑 url이 올바른지, 특히 대소문자 확인을 해야하고
      해당 경로에 올바르게 jsp파일이 존재하는지 확인해보셔야 할 것 같습니다.

      삭제
  25. 안녕하세요!!





    똑같이 따라했는데 이부분에서 계속 오류가뜨는데 원인 알 수 있을까요ㅠ

    답글삭제
    답글
    1. root-context.xml에
      com.board.domain
      com.board.dao
      com.board.service
      추가하는 부분에서 오류가 뜹니다,,

      삭제
    2. 안녕하세요? 방문해주셔서 감사합니다.

      root-context.xml에 패키지 추가를 안하셨다면, 스프링이 패키지를 못 찾아서 에러가 발생할 수 있습니다.

      삭제
  26. 저는 오라클로 공부를 하고 있는데 위 코드 그대로 갖고오니 테이블이 생성안된다는 오류가 뜨더라고요.
    ORA-00907: missing right parenthesis

    오라클로는 어떤 테이블을 작성해야 하나요?

    답글삭제
    답글
    1. 수정했습니다. 포스팅 잘보고있습니다.

      삭제
  27. 익명4/20/2022

    안녕하세요 잘 보고 따라하다가 게시물 목록을 누르면 500오류가 뜨는부분에서 막혔습니다
    맵퍼 테이블 앞에 데이터베이스 이름을 넣어주라고 하셔서 넣었는데도 떠서 질문드립니다

    제가 heidiSQL하는거에서 데이터베이스가 돌고래모양 Mysql 로 되서 그것밖에 다른점이 없는것같은데
    그게 500 오류에 관련이 있을까요?

    Error querying database. 이런 오류가 뜨는데 해결하고싶습니다ㅠㅠ

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      말씀하신 Error querying database 에러는 쿼리문이 잘못되어서 발생한 오류로 보입니다.
      예를들어서 문법이 잘못되었거나, 세미콜론(;)을 넣었거나, null이 아니어야하는데 null이 나올 경우 발생합니다.

      오타 및 세미콜론 등의 쿼리문 확인, 해당 쿼리를 하이디SQL에서 실행 및 데이터 확인이 필요로 합니다.

      삭제
  28. 익명6/11/2022

    안녕하세요 자바만 아주 쪼끔 공부한 코린이 그냥 무작정 게시판만들어보기 따라하는중인데욥
    게시물목록 클릭하면 목록페이지로 넘어가는거까지 하고 500에러 뜨는거까지 해봤다가 404에러가 뜨길래
    다시 게시물목록 페이지 나오는곳부터 해보니 boardMapper.xml파일에 쿼리를 추가하니까 404에러가 뜨는걸 확인했는데요 뭐가 문젠가요? 쿼리 입력한걸로 404에러가 뜨지는 않는다는데..

    답글삭제
    답글
    1. 익명6/11/2022

      아 죄송합니다 패키지 만들때 오타가 잇는걸 뒤늦게 발견했네요 해결했습니다

      삭제
  29. DAO, Service, Controller 에서 타입을 List 인지 List로 해야하는지 모르겠습니다.
    자꾸 bno에서 numberFormatException 이 나네요 ㅠㅠ

    답글삭제
    답글
    1. List 인지 List<BoardVO> 인지 모르겠습니다.

      삭제
    2. List<BoardVO> 로 다 했는데도 자꾸 list.bno 에서 numberFormatException: For input String: "bno" 라고 뜨네요 ㅠㅠ

      삭제
    3. 해결했습니다.

      삭제
  30. 익명2/11/2023

    가장 마지막 과정에서 게시물 목록을 눌렀을때
    HTTP STATUS 500 - 내부 서버 오류인데

    저는 에러 내용이 다릅니다.

    Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

    이 내용이고 근본 원인이 여러가지가 있는데 어떻게 해결해야할지... 도와주세요...ㅠ

    답글삭제
    답글
    1. 익명8/21/2023

      검색해보니 다양한 오류가 있다고 합니다!!

      저 같은 경우는 root-context.xml에
      user와 password 값이 데이터베이스와 맞추니 해결됐습니다.

      삭제
  31. 안녕하세요 저도 따라하면서 공부하고 있는데요
    오류는 아닌데 INFO로
    INFO : org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization started
    음...500이 뜨는게 아니라 404가 뜨면서 가용하지 않는다고 나오는데 이건 어떻게 해야 하나요?

    답글삭제
    답글
    1. 익명8/21/2023

      검색해보니 다양한 오류가 있다고 합니다!!

      저 같은 경우는 root-context.xml에
      user와 password 값이 데이터베이스와 맞추니 해결됐습니다.

      삭제
  32. 익명8/21/2023

    선생님 감사합니다!! 아주 많이 행복하시길 바랍니다!!

    답글삭제