Spring(2023-05-02)

권단비·2023년 5월 2일
0

IT

목록 보기
129/139

[스프링레거시]

Autowired와 Inject는 하는 일이 100%같다.

주입을 위해 지원하는 애너테이션 종류 3가지
-@Autowired(현업사용) : 스프링에서만 제공
-@Inject : 자바에서 제공
-@Resource : 해당 빈의 이름으로 찾음

주입의 종류 3가지
-생성자주입(추천)
-setter주입
-필드주입

[마이바티스 활용 - 4가지]

1.SQL session에서 제공하는 함수를 활용 (interface class활용)

- interface IBDao를  XML namespace에 매핑 <mapper namespace="edu.bit.ex.board1.IBDao">
- sqlSession.getMapper(IBDao.class)를 이용.

2.CRUD SQL session 객체에서 제공하는 직접 xml연결하는 것

- interface는 필요가 없음 
- sqlSession에서 제공하는 함수(selectList,selectOne)를 이용함
- 쿼리구현을 위한 XML이 필요. 해당 XML의 namespace는 개발자가가 정함

3. @Mapper사용

@Mapper // MyBatis 연결을 알려주는 것
public interface BoardMapper { // interface를 BoardMapper.xml에서 구현한다. >> Mybatis
	@Select("select * from mvc_board order by bGroup desc, bStep asc") // Mybatis 3버전
	public List<BoardVO> getList();
	public BoardVO read(int bid); // 파라미터는 url로 넘어오는 bid값을 의미
	public int update(BoardVO board); // 글수정
	public int delete(BoardVO board); // 글삭제
	public int insert(BoardVO board); // 글작성
	
	//답글관리
	public void updateShape(BoardVO board); // 답글위치
	public void insertReply(BoardVO board); // 답글등록

	 //paging 관련
	 public abstract int getTotalCount();   
	 public abstract List<BoardVO> getListWithPaging(Criteria cri);
}

4. interface위에 mapper정의해서 사용

@Mapper // MyBatis용 인터페이스라는 것을 알려주는 어노테이션
//SecurityConfig.java의 Bean을 끌고옴
public interface UserMapper {
	public UserVO getUser(String username);

	@Insert("insert into users(username,password,enabled) values(#{username},#{password},#{enabled})")
	public int insertUser(UserVO userVO);

	@Insert("insert into AUTHORITIES (username,AUTHORITY) values(#{username},'ROLE_USER')")
	public void insertAuthorities(UserVO UserVO);

	@Insert("insert into AUTHORITIES (username,AUTHORITY) values(#{username},'ROLE_ADMIN')")
	public void insertAdminAuthorities(UserVO UserVO);
}

[첫번째방법]

[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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- Root Context: defines shared resources visible to all other web components -->

	<!-- HikariConfig hikariConfig = new com.zaxxer.hikari.HikariConfig() 객체 생성해서 applicationContext.xml에 넣어라(Service,Repository클래스)-->
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
			value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
		<property name="jdbcUrl"
			value="jdbc:log4jdbc:oracle:thin:@localhost:1521:xe"></property>
		<property name="username" value="scott"></property>
		<property name="password" value="tiger"></property>
	</bean>

	<!-- dataSource.getConnection() DB와 커넥션 객체를 갖고 있어서 오라클과 연결되어 데이터를 사용할 수 있다-->
	<!-- HikariCP(커넥션풀) configuration -->
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
		destroy-method="close">
		<constructor-arg ref="hikariConfig" />
	</bean>

	<!-- Mybatis설정 -->
	<!-- SqlSessionFactoryBean sqlSessionFactory = new org.mybatis.spring.SqlSessionFactoryBean(); -->
	<!-- sqlSessionFactory.setDataSource(dataSource); -->
	<!-- 상기와 같이 호출되고 있다 -->
	<!-- 1.번 방법을 위하여 mapperLocations 을 추가 함 -->
	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="mapperLocations" value="classpath:/mappers/**/*.xml" />
	</bean>
	<!-- 실질적 Mybatis = sqlSession -->
	<!-- 1번 방식 사용을 위한 sqlSession(보통 id를 sqlSession으로 설정한다) -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg index="0" ref="sqlSessionFactory" />
	</bean>
</beans>
-------------------------------------------------------------------------------
[BController1.java]
//Mybatis를 사용하는 첫 번째 방법
package edu.global.ex.board.one;

import org.springframework.stereotype.Controller;
import lombok.extern.slf4j.Slf4j;

//1.interface IBDao를  XML namespace에 매핑 <mapper namespace="edu.bit.ex.board1.IBDao"> 
//2.sqlSession.getMapper(IBDao.class)를 이용.

@Slf4j
@Controller
public class BController1 {
}
-------------------------------------------------------------------------------
[IBDao.java]
//Mybatis를 사용하는 첫 번째 방법
package edu.global.ex.board.one;

import java.util.List;
import edu.global.ex.vo.BoardVO;

public interface IBDao {
	public List<BoardVO> listDao();
}
-------------------------------------------------------------------------------
[board1.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="edu.global.ex.board.one.IBDao">
	<select id="listDao" resultType="edu.global.ex.vo.BoardVO">
      <![CDATA[select * from mvc_board order by bGroup desc, bStep asc]]>
	</select>
</mapper>
-------------------------------------------------------------------------------
[BoardVO.java]
package edu.global.ex.vo;
import java.sql.Timestamp;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class BoardVO {
	private int bid;
	private String bname;
	private String btitle;
	private String bcontent;
	private Timestamp bdate;
	private int bhit;
	private int bgroup;
	private int bstep;
	private int bindent;
}
-------------------------------------------------------------------------------
[BService1.java]
//Mybatis를 사용하는 첫 번째 방법
package edu.global.ex.board.one;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import edu.global.ex.vo.BoardVO;

@Service
public class BService1 {
	@Inject
	private SqlSession sqlSession; // root-context.xml에서 끌고온다

	public List<BoardVO> selectBoardList() throws Exception {
		IBDao dao = sqlSession.getMapper(IBDao.class); // dao에 넣을 원형을 알려주고(.class), 객체로 만들어서 넣어준다.
		return dao.listDao();
	}
}
-------------------------------------------------------------------------------
[list.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<img src="/images/shop/product10.jpg">
	<table width="500" cellpadding="0" cellspacing="0" border="1">
		<tr>
			<td>번호</td>
			<td>이름</td>
			<td>제목</td>
			<td>날짜</td>
			<td>히트</td>
		</tr>
		<c:forEach var="board" items="${boards}">
			<tr>
				<td>${board.bid}</td>
				<td>${board.bname}</td>
				<td><c:forEach begin="1" end="${board.bindent}">-</c:forEach> <a href="${pageContext.request.contextPath}/jboard/content_view?bid=${board.bid}">${board.btitle}</a></td>
				<td>${board.bdate}</td>
				<td>${board.bhit}</td>
			</tr>
		</c:forEach>
		<tr>
			<td colspan="5"><a href="write_view">글작성</a></td>
		</tr>
	</table>
</body>
</html>
[결과값]


[두번째방법]

[root-context.xml]
동일
-------------------------------------------------------------------------------
[BController2.java]
//Mybatis를 사용하는 두 번째 방법
package edu.global.ex.board.two;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.extern.slf4j.Slf4j;

//1. interface는 필요가 없음 
//2. sqlSession에서 제공하는 함수(selectList,selectOne)를 이용함
//3. 쿼리구현을 위한 XML이 필요. 해당 XML의 namespace는  개발자가가 정함

@Controller
public class BController2 {
	@Inject
	BService2 bservice;

	@RequestMapping("/list2")
	public String list(Model model) throws Exception {
		System.out.println("list2()");

		model.addAttribute("boards", bservice.selectBoardList());
		return "list";
	}
}
-------------------------------------------------------------------------------
[BService2.java]
//Mybatis를 사용하는 두 번째 방법
package edu.global.ex.board.two;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Service;
import edu.global.ex.vo.BoardVO;

@Service
public class BService2 {
	@Inject
	SqlSession sqlSession;

	public List<BoardVO> selectBoardList() throws Exception {
		return sqlSession.selectList("board.selectBoardList");
	}
}
-------------------------------------------------------------------------------
[board2.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="board">
	<select id="selectBoardList"
		resultType="edu.global.ex.vo.BoardVO">
      <![CDATA[select * from mvc_board order by bGroup desc, bStep asc]]>
	</select>
</mapper>
-------------------------------------------------------------------------------
[BoardVO.java]
동일
-------------------------------------------------------------------------------
[list.jsp]
동일
[결과값]


[세번째방법]

@Mapper // MyBatis 연결을 알려주는 것
public interface BoardMapper { // interface를 BoardMapper.xml에서 구현한다. >> Mybatis
	@Select("select * from mvc_board order by bGroup desc, bStep asc") // Mybatis 3버전
	public List<BoardVO> getList();
	public BoardVO read(int bid); // 파라미터는 url로 넘어오는 bid값을 의미
	public int update(BoardVO board); // 글수정
	public int delete(BoardVO board); // 글삭제
	public int insert(BoardVO board); // 글작성
	
	//답글관리
	public void updateShape(BoardVO board); // 답글위치
	public void insertReply(BoardVO board); // 답글등록

	 //paging 관련
	 public abstract int getTotalCount();   
	 public abstract List<BoardVO> getListWithPaging(Criteria cri);
}

[네번째방법]

@Mapper // MyBatis용 인터페이스라는 것을 알려주는 어노테이션
//SecurityConfig.java의 Bean을 끌고옴
public interface UserMapper {
	public UserVO getUser(String username);

	@Insert("insert into users(username,password,enabled) values(#{username},#{password},#{enabled})")
	public int insertUser(UserVO userVO);

	@Insert("insert into AUTHORITIES (username,AUTHORITY) values(#{username},'ROLE_USER')")
	public void insertAuthorities(UserVO UserVO);

	@Insert("insert into AUTHORITIES (username,AUTHORITY) values(#{username},'ROLE_ADMIN')")
	public void insertAdminAuthorities(UserVO UserVO);
}

0개의 댓글