https://velog.io/@ggg4155/SpringMVC-Board-CRUD
에서 서비스인터페이스, DAO인터페이스를 추가한 코드
package kr.web.dao;
import java.util.List;
import kr.web.vo.BoardVO;
public interface BoardDAO {
public List<BoardVO> boardlist() throws Exception;
public BoardVO boardContent(int idx) throws Exception;
public void boardInsert(BoardVO vo) throws Exception;
public void boardUpdate(BoardVO vo) throws Exception;
public void boardDelete(int idx) throws Exception;
public void countUpdate(int idx) throws Exception;
}
package kr.web.dao;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import kr.web.vo.BoardVO;
@Repository
public class BoardDAOimpl implements BoardDAO {
@Inject
private SqlSession session;
private static String namespace = "kr.web.mapper.BoardMapper";
@Override
public List<BoardVO> boardlist() throws Exception {
return session.selectList(namespace + ".boardlist");
}
@Override
public BoardVO boardContent(int idx) throws Exception {
return session.selectOne(namespace + ".read", idx);
}
@Override
public void boardInsert(BoardVO vo) throws Exception {
session.insert(namespace + ".boardInsert", vo);
}
@Override
public void boardUpdate(BoardVO vo) throws Exception {
session.update(namespace + "boardUpdate", vo);
}
@Override
public void boardDelete(int idx) throws Exception {
session.delete(namespace + ".delete", idx);
}
@Override
public void countUpdate(int idx) throws Exception {
session.update(namespace + "countUpdate", idx);
}
}
서비스(비즈니스계층)
package kr.web.service;
import java.util.List;
import kr.web.vo.BoardVO;
public interface BoardService {
public void create(BoardVO vo) throws Exception;
public BoardVO read(int idx) throws Exception;
public void update(BoardVO vo) throws Exception;
public void updateCnt(int idx) throws Exception;
public void delete(int idx) throws Exception;
public List<BoardVO> listAll() throws Exception;
}
package kr.web.service;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import kr.web.dao.BoardDAO;
import kr.web.vo.BoardVO;
@Service
public class BoardServiceimpl implements BoardService{
@Inject
private BoardDAO dao;
@Override
public void create(BoardVO vo) throws Exception {
dao.boardInsert(vo);
}
@Override
public BoardVO read(int idx) throws Exception {
return dao.boardContent(idx);
}
@Override
public void update(BoardVO vo) throws Exception {
dao.boardUpdate(vo);
}
@Override
public void updateCnt(int idx) throws Exception {
}
@Override
public void delete(int idx) throws Exception {
dao.countUpdate(idx);
}
@Override
public List<BoardVO> listAll() throws Exception {
return dao.boardlist();
}
}
바뀐 root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring">
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/mysql"></property>
<property name="username" value="root"></property>
<property name="password" value="12345"></property>
</bean>
<!-- 히카리 CP 설정 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
<!-- sqlSession -->
<bean id="sqlSession"
class="org.mybatis.spring.SqlSessionTemplate"
destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory"
ref="sqlSessionFactory"></constructor-arg>
</bean>
<!-- sql xml db 연결 sqlSessionFactory -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation"
value="classpath:/mybatis-config.xml"></property>
<property name="mapperLocations"
value="classpath:mappers/**/*Mapper.xml"></property>
</bean>
<mybatis-spring:scan base-package="test.web.dao"/>
<!-- service, repository 스캔 -->
</beans>
컨트롤러도 수정해줌
스프링 mvc에서 컨트롤러를 설계할 때 고려할 것들
공통적인 uri 경로와 각 기능별 uri
RequestMapping value
각 uri에 대한 호출 방식(get, post)
RequestMapping method
결과 처리와 리다이렉트 방식의 페이지 결정
화면전환 방식
예외 페이지
@ExceptionHandler 애노테이션을 이용한 처리
@ControllerAdvice를 이용한 처리
@ResponseStatus를 이용한 Http 상태 코드 처리
package test.web.board2;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import test.web.service.BoardService;
import test.web.vo.BoardVO;
@Controller
public class BoardController {
@Inject
private BoardService service;
@RequestMapping("/boardlist")
public void boardlist(Model model) throws Exception {
System.out.println("게시판 목록 보기");
model.addAttribute("list", service.listAll());
}
@RequestMapping("/boardContent")
public void boardContent(int idx, Model model) throws Exception {
System.out.println("게시글 보기 실행, idx : " + idx);
BoardVO vo = service.read(idx);
service.updateCnt(idx);
model.addAttribute("vo", vo);
}
@RequestMapping("/boardInsertForm")
public void boardInsertForm() {
}
@RequestMapping("/boardInsert")
public String boardInsert(BoardVO vo) throws Exception {
System.out.println("작성내용 : " + vo.toString());
service.create(vo);
return "redirect:/boardlist";
//게시글 가지고 가도록 redirect
}
@RequestMapping("/boardUpdateForm")
public void boardUpdateForm(int idx, Model model) throws Exception {
BoardVO vo = service.read(idx);
System.out.println(vo.toString());
model.addAttribute("vo", vo);
}
@RequestMapping("/boardUpdate")
public String boardUpdate(BoardVO vo) throws Exception {
System.out.println("게시글수정내용 : " + vo.toString());
service.update(vo);
return "redirect:/boardlist";
}
@RequestMapping("/boardDelete")
public String boardDelete(int idx) throws Exception {
System.out.println("게시글삭제 실행, index : " + idx);
service.delete(idx);
return "redirect:/boardlist";
}
}
레파지토리, 서비스, 컨트롤러 어노테이션 작성하고, Mybatis 설정을 할 수 있는 Mybatis-config.xml 파일도 만들었는데,,
왜 자꾸 에러가 나는지 ㅠㅜ,,
에러 고치면 또다른에러가 나오고 산너머 산이다
The prefix "context" for element "context:component-scan" is not bound.
-----> 서비스,dao 객체 불러오려면 root-context에 xmlns:context="http://www.springframework.org/schema/context"
이 스키마 추가시키고 아래에 컨텍스트 태그를 추가해야됨 <context:component-scan base-package="test.web.dao"></context:component-scan>
위 문제가 해결이 안됨 .. 일치하는 와일드 카드 문자가 엄격하게 적용되지만 'context:component-scan' 요소에 대한 선언을 찾을 수 없습니다.
---> root-context에 위에거 지우고 다시xmlns:context="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" 스키마 추가함
Servlet.init() 호출이 예외를 발생시켰습니다.서비스,레파지토리 어노태이션문제
https://liante0904.tistory.com/113
이분 거 에러 원인 참고했지만,, 뭐가 잘못된건지 난 왜안돼,,,
구글링 겁나했지만 전부다 어노테이션이 잘 안달려있거나, 오타 등의 문제였는데 눈씻고찾아봐도 오타가 안보이고 xml sql문오타도 없고 (서비스DAO로 했을때와 달리 mapper로 매칭했을땐 잘 동작했음) 뭐가 문제냐. pom.xml 문제라기엔 에러 창에 그런 문구가 없는거같음 게다가 갑자기 jUnit DataSource 테스트에서 ds가 null이라고 뜸 ㄷㄷㄷㄷㄷ 아...아아아아아아앜!!!!!
error creating bean with name 'sqlSession' defined in ServletContext resource [/WEB-INF/spring/root-context.xml]: Cannot resolve reference to bean 'sqlSessionFactory' while setting constructor argument;
어쩌고저쩌고
이런 에러..
org.springframework.web.context.support.XmlWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'boardController':
어쩌고저쩌고
에러가 뜬다