본문 바로가기

복습/스프링-게시판만들기

2024.02.27 myboard- board

 

패키지 파일> controller, dao, dto, service 

controller 패키지> BoardController

// 일단 컨트롤러 만들어주고, 나중에 만들어도 된다.

 

어노테이션 만들기

@controller = 컨트롤러로 만들기
@Service = 서비스로 만들기
@Repository = DAO
@Component = 그 외 객체로 만들기

 

 

*데이터 흐름*

controller > service > repository > mybatis > DB

흐름제어  >  로직   >    DAO

 

1.Controller(흐름제어)

  • HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현
  • 다양한 타입의 파라미터 처리, 다양한 티입의 리턴 타입 사용 가능
  • GET방식, POST방식 등 전송 방식에 대한 처리를 어노테이션으로 처리 가능
  • 상속/인터페이스 방식 대신에 어노테이션만으로도 필요한 설정 가능

> BoardController : DB에서 값을 불러와서 화면에 찍어준다.Servie에게 일 시킨다.

 

 

 

Boardcotroller

@Controller
public class BoardController {
	@RequestMapping(value = "/", method = RequestMethod.GET)
	@RequestMapping(value = "/", method = RequestMethod.POST)
	@RequestMapping(value = "/")// GET,POST 상관없이 다 들어와
	@RequestMapping("/")// GET,POST 상관없이 다 들어와> 축약
	//각각 들어오는 요청들을 실행, 
		
	}
}

@RequestMapping : 각각 들어오는 요청들을 실행한다.

 

 

 

 

Boardcotroller

@Controller
public class BoardController {
	//@RequestMapping(value = "/", method = RequestMethod.POST)
	//@RequestMapping(value = "/")// GET,POST 상관없이 다 들어와
	//@RequestMapping("/")// GET,POST 상관없이 다 들어와> 축약

	@RequestMapping(value = "/", method = RequestMethod.GET) //각각 들어오는 요청들을 실행
	public String board() {
		return "board";
		
	}

@RequestMapping(value = "/", method = RequestMethod.GET)

사용자가 /로 들어오는 GET 방식의 요청에 대해서  return> board로 내보낸다

 

package org.myboard.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class BoardController {
	
	@GetMapping("/board")
	public String board(){
		return "board";
	}

}

이런식으로도 표현 된다.

 

 

servlet-context.xml

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<context:component-scan base-package="org.mirror.*" />
	
	<beans:import resource="classpath:/spring/db-context.xml"/>

<beans> : 객체 생성 > 스프링에서는 자바에서처럼 new 붙여서 하지않고 스프링이생성해주고, 우린 가져다가 쓴다.

에러가 안나려면 주석을 잘 적어야한다.

 

화면에 띄워지는 이유 : 컨트롤러에서 리턴 board로 해준 부분이

> 경로 : /WEB-INF/views/board. jsp = return(board)

이렇게 경로가 되기 때문이다.

이것은 servlet-context.xml에서  prefix, suffix 부분을 지정해주었기 때문이다 .

prefix >  "/WEB-INF/views/"

suffix >".jsp" 

 

 

board.jsp(파일이 있어야 경로대로 찾아가 창을 띄울 수 있다.)

<%@ 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>
<h1>보드입니다.</h1>
</body>
</html>

 

/요청이 들어오면 board가 뜬다. 이제 창이 뜨면 된다.

 

 

계속 404오류가 떠서 여러가지로 찾아봤는데 jsp파일 만들때 이름을 복사해서 컨트롤러 동일이름 부분에

붙여넣기하니까 오류가 해결되었다. 나도 잘 모르겠다^^ .

분명 이렇게까지 오류날 일이 아닌데 하며 봤는데 나도 모르는 오탈자가 있었보다.

 

 

아 진짜 완전 보드 이름 불러내기 힘들었다.

일단 config, mappers에 dto랑 sql문이 있다보니까 자꾸 500에러가 떴다.

컨트롤러랑 jsp 연동되는지 확인하려면 두군데 아무것도 없어야한다.

 

 

이제 데이터베이스에 있는 보드를 출력해보자.

 

의존성주입

의존성 : 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미. 하나의 객체가 다른 객체의 상태에 따라 영향을 받는 것을 으미한다. 흔히 A 객체가 B객체 없이 동작이 불가능한 상황을 'A가 B에 의존적이다.'라고 표현한다.

 

주입 : 외부에서 '밀어 넣는것'을 의미한다. 필요한 객체를 얻기 위해서 주체가 능동적인지 수동적인지에 대한 문제가 있다.

 

의존성+주입 : 어떤 객체가 필요한 객체를 외부에서 밀어 넣는다.

ApplicationContext라는 존재르 필요한 객체들을 생성하고, 필요한 객체들을 주입하는 역할을 해주는 구조이다.

 

 

선생님 필기 내용

//POJO = 
	//DI = 의존성 주입 =객체를 생성하지 않고 객체를 사용하는 것
	//AOP = 관점지향 프로그래밍
	//IoC = 제어 역전 = 객체 생명주기 = 스프링에게 제어 권한이 있는 것.
	//					Life Cycle = (객체 생성 -> 사용 -> 종료)

	//결합도는 낮을수록 좋고, 응집도는 높을수록 좋다
	
	//Controller -> Service -> Repository -> Mybatis ->DB
	//							DAO					   maridb
	//MVC -> 
	//M(모델) 	  데이터	= 데이터베이스 값, DAO/DTO/mybatis/DB
	//V (뷰)	  화면		= Model값을 붙여 사용자에게 보여줍니다.
	//C(컨트롤러) 흐름제어 	= 사용자 요청이 들어오면 먼저 동작

 

 

 

1. BoardList 가져오기

 

BoardController 전체 내용

package org.myboard.controller;

import java.util.List;

import org.myboard.dto.BoardDTO;
import org.myboard.service.BoardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class BoardController {
	
	@Autowired//서비스랑 연결
	private BoardService boardService;
	
	@GetMapping("/board")
	public String board(Model model){
		List<BoardDTO> list = boardService.boardList();
		//DAO = 데이터베이스 접속 객체
		//DTO = 데이터 베이스 전송 객체
		
		model.addAttribute("list", list);
		return "board";
	}

}

 

사용되는 어노테이션 설명

 @Controller	 = 객체생성 = 컨트롤러로 만들기
 @Service	 = 객체생성 = 서비스로 만들기
 @Repository	 = 객체생성 = DAO
 @Component 	 = 객체생성 = 그 외 객체로 만들기

 

@autoWired = 스프링 제공 	= 객체의 타입으로 검사 >이걸 제일 많이 씀
	@Qualifier("")
@Inject 	 = 자바 제공	=객체의 타입이 일치하면 자동주입
	@named("")
@Resources = 자바 제공		=id가 일치하는 것 주입
	@Resource(name="")

 

 

 

0.만들어 뒀던 BoardController부터 시작

package org.myboard.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class BoardController {

	@GetMapping("/board")	
	public String board(){
		
		return "board";
	}
}

 

/board > 왜 오류가 나는걸까.............ㅎ

일단 넘기자.

 

 

 

 

>서비스와 연결해 주기 : 데이터는 서비스에서 온다.

	@Autowired
	private BoardService boardservice; //서비스랑 연결합니다.

 

 

 

>불러올 자료 만들어주기

	@GetMapping("/board")
	public String board(Model model) {
		//나중에 되면 변환되는 녀석으로 쓰지만 일다 모델로 쓴다.
		List<BoardDTO> list = boardService.boardList();
		//앞에 타입은 여러개라면 LIST<멤버DTO>에 들어가 있어요
		
		model.addAttribute("list", list);
		
		return "board";
	}

List<BoardDTO>를 사용해서 불러온다.

이때,  DTO 만들어줘야한다.

 

 

 

1.BoardDTO만들기

데이터베이스 테이블 보고 만들어준다.

package org.myboard.dto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class BoardDTO {
	private int board_no,board_count;
	private String board_title, board_content,board_date, board_write;

}

 

롬복 만들어주기> @Getter,@Setter

 

 

2.BoardService 만들어주기 > @Service 어노테이션 사용

package org.myboard.service;

import java.util.List;

import org.myboard.dao.BoardDAO;
import org.myboard.dto.BoardDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;



@Service
public class BoardService {
	
	@Autowired//DAO와 연결
	private BoardDAO boardDAO;

	public List<BoardDTO> boardList() {
		
		return boardDAO.boardList(); //보드DAO>보드리스트
	}
	


}

컨트롤러때와 같이 @Autowired 해준다.

리턴값 잘 생각해보기.

 

 

3.BoardDAO 만들어주기 > @Repository 어노테이션 사용

package org.myboard.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.myboard.dto.BoardDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class BoardDAO {

	@Autowired
	private SqlSession sqlSession;

	public List<BoardDTO> boardList() {
		return sqlSession.selectList("board.boardList");
	}

}

 

 

4.board-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="board">

	<!-- 게시판 -->
	<select id="boardList" parameterType="Integer" resultType="boardDTO">
	SELECT * FROM boardview LIMIT 0,10	
	</select>


</mapper>

 

 

5.board-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<typeAliases>
		<!-- boardDTO 의 경로 알려주기 -->
		<typeAlias type="org.myboard.dto.BoardDTO" alias="boardDTO"/>
	</typeAliases>
</configuration>

typeAliases 에서 별명 입력해 줘야 mapper에서 resultType에 별명 쓸 수 있다.

 

 

6.board.jsp

 

상단에 jstl 선언문 써주기

<!-- jstl 선언문 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!-- jstl 선언문 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
</head>
<body>
	<h1>보드</h1>
	
	<table>
		<thead>
			<tr>
				<th>번호</th>
				<th>제목</th>
				<th>글쓴이</th>
				<th>날짜</th>
				<th>조회수</th>
			</tr>
		</thead>
		<tbody>
			<c:forEach items="${list }" var="row">
				<tr>
					<td>${row.board_no }</td>
					<td>${row.board_title }</td>
					<td>${row.board_write }</td>
					<td>${row.board_date }</td>
					<td>${row.board_count }</td>
				</tr>
			</c:forEach>
		</tbody>	
	</table>
</body>
</html>

 

 

BoardDTO에 있는 것들과 맞아야 테이블이 나온다.