휴먼교육센터 개발자과정 78일차

조하영·2022년 11월 25일
0

스프링 복습

DI는 스프링 컨테이너에 객체의 주소를 주입받는 방식
스프링의 설정 파일로 객체를 생성하고 컨테이너에 등록시킨다.
스프링의 설정파일은 xml, java파일로 가능하다.

컨트롤러에서 DAO에 요청하는 구조도 가능
컨트롤러가 2개의 작업을 요구한다. 요구하는 작업이 많아질수록 컨트롤러가 해야할일이 많아진다.

컨트롤러 DAO 중간에 서비스단을 만들 수 있다.
컨트롤러가 서브단에 하나만 요청하면 서비스단이 알아서 2개의 디비작업을 실시한다.
컨트롤러는 디비작업에서 자유로워지고 서비스가 실시한 결과만 받으면된다.

각 레이어별 개발기술

서비스 레이어도 개발자가 맘대로 구현해도 되나
스프링에서는 인터페이스로 구현한다. 관련 객체도 스프링에서 관리한다.

DAO 레이어는 mybatis로 개발한다.
mybatis에서는 인터페이스로 DAO를 작성하도록 한다.

인터페이스- 추상클래스, static, final로 정의하고 다른 클래스에서 구현받아서 사용
구현받은 클래스는 인터페이스의 추상클래스를 반드시 오버라이드 한다.
인터페이스 자료형의 변수는 구현받은 모든 클래스의 객체 주소값을 가진다.
인터페이스 변수로 구현받은 객체의 메서드에 접근이 가능하다.
객체가 다르고 기능도 가르지만 메서드 하나로 서로 다른 기능을 실행시킬 수 있다.

스프링 실습

1. pom.xml 설정

1.1 ojdbc8설정

		<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
		<dependency>
			<groupId>com.oracle.database.jdbc</groupId>
			<artifactId>ojdbc8</artifactId>
			<version>21.7.0.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.oracle.database.security/oraclepki -->
		<dependency>
			<groupId>com.oracle.database.security</groupId>
			<artifactId>oraclepki</artifactId>
			<version>21.7.0.0</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/com.oracle.database.security/osdt_cert -->
		<dependency>
			<groupId>com.oracle.database.security</groupId>
			<artifactId>osdt_cert</artifactId>
			<version>21.7.0.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.oracle.database.security/osdt_core -->
		<dependency>
			<groupId>com.oracle.database.security</groupId>
			<artifactId>osdt_core</artifactId>
			<version>21.7.0.0</version>
		</dependency>

1.2 오라클 레포지토리스 설정

	<!-- Oracle -->
	<repositories>
		<repository>
			<id>oracle</id>
			<name>ORACLE JDBC Repository</name>
			<url>http://maven.jahia.org/maven2</url>
		</repository>
	</repositories>

1.3 마이바티스 설정

		<!-- MyBatis 연동 라이브러리 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.8</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.2</version>
		</dependency>

2. web.xml설정

2.1 UTF-8인코딩

<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	<filter> 
    <filter-name>encodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
       <param-name>encoding</param-name> 
       <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
       <param-name>forceEncoding</param-name> 
       <param-value>true</param-value> 
    </init-param> 
 </filter> 
 <filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
 </filter-mapping> 

3.root-context.xml

3.1 oracle bean

	<!-- 오라클 bean -->
	<bean
      class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
      <property value="oracle.jdbc.driver.OracleDriver" name="driverClassName" />
      <property value="주소"   name="url" />
      <!-- 오라클 사용자 이름 -->
      <property value="계정" name="username" />
      <!-- 오라클 사용자 비밀번호 -->
      <property value="비밀번호" name="password" />
   </bean>

3.2 sqlSessionFactory bean

<bean class="org.mybatis.spring.SqlSessionFactoryBean"
      id="sqlSessionFactory">
      <property name="dataSource" ref="dataSource" />             
      <property value="classpath:/mapper/*Mapper.xml"
         name="mapperLocations" />                <!-- 메퍼지정 -->
   </bean>

3.3 sqlSession bean

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg index="0" ref="sqlSessionFactory" />
   </bean>

3.4 빈객체 생성할 주소 설정

<context:component-scan base-package="com.human.dao"/> 
<!-- 지정된 패키지의 클래스를 파일을 스캔하여 객체로 만들어라. 
   현재 여기에는 레포지토리로 설정되어 DAO 역할을 하는 클래스가 정의되어 있음. -->
<context:component-scan base-package="com.human.service"/>

4. 뷰

4.1 home

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>
<header>Spring BBS</header>
<nav>
[home]  <a href ="wrForm">[Write]</a>  <a href ="joinForm">[회원가입]</a>
</nav>

</body>
</html>

4.2 wrForm

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
 <%-- <style> <%@include file="../css/shopping.css" %></style> --%>
 <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/resources/css/shopping.css">
</head>
<script>
   //비동기로
   //서버에게 요청 작성자를 파라미터로 보낼 테니 중복여부 확인해줘
   // 응답을 받아서
   // 등록된 사용자라면 vlaue=1로 바꾸는 코드를 짠다. 

</script>
<body>
   <div id="wrap" align="center">
      <h1>게시글 등록</h1>
      <form name="frm" method="post" action="wrAction">
         <table>
            <tr>
               <th>작성자</th>
               <td><input type="text" name="name"> * 필수
                  <input type="button" value="등록여부확인">
                  <input type="hidden" name="duplexChk" vlaue="0">
               
               </td>
            </tr>
            <tr>
               <th>비밀번호</th>
               <td><input type="password" name="pass"> * 필수 (게시물 수정
                  삭제시 필요합니다.)</td>
            </tr>
            <tr>
               <th>이메일</th>
               <td><input type="text" name="email"></td>
            </tr>
            <tr>
               <th>제목</th>
               <td><input type="text" size="70" name="title"> * 필수</td>
            </tr>
            <tr>
               <th>내용</th>
               <td><textarea cols="70" rows="15" name="content"></textarea></td>
            </tr>
         </table>
         <br>
         <br> <input type="submit" value="등록"> <input type="reset"
            value="다시 작성"> <input type="button" value="목록">
      </form>
   </div>
   <script type="text/javascript">

   
   </script>
</body>
</html>

4.3 joinForm

<%@ 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>
	<div id="wrap" align="center">
		<h1>회원가입</h1>
		<form name="frm" method="post" action="joinAction">
			<table>
				<tr>
					<th>이름</th>
					<td><input type="text" name="name"></td>
				</tr>
				<tr>
					<th>아이디</th>
					<td><input type="text" name="id"> * 필수</td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td><input type="password" name="pass"> * 필수 (게시물 수정
						삭제시 필요합니다.)</td>
				</tr>
			</table>
			<br> <br> <input type="submit" value="회원가입">
		</form>
	</div>
</body>
</html>

5. 컨트롤러

5.1 홈 컨트롤러

package com.human.day02;

import java.util.Locale;

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

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	
	//private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {

		return "home";
	}
	
}

5.2 게시판 컨트롤러

package com.human.day02;

import java.util.Locale;

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.human.service.IF_boardService;
import com.human.service.IF_memberService;
import com.human.vo.BoardVO;
import com.human.vo.MemberVO;

@Controller
public class BbsController {
	@Inject
	private IF_boardService bsrv;
	
	@Inject
	private IF_memberService msrv;
	
	@RequestMapping(value = "/wrAction", method = RequestMethod.POST)
	public String wrAction(Locale locale, Model model, BoardVO bvo) throws Exception {
		//객체로 받을때는 파라미터의 이름과 객체 변수의 이름이 일치하고 getter, setter가 있어야 한다.->자동매핑
		System.out.println(bvo.getName());
		System.out.println(bvo.getPass());
		bsrv.insertOne(bvo);
		
		return "home";
	}
	
	@RequestMapping(value = "/wrForm", method = RequestMethod.GET)
	public String wrForm(Locale locale, Model model) {

		
		return "wrForm";
	}
	
	@RequestMapping(value = "/joinForm", method = RequestMethod.GET)
	public String joinForm(Locale locale, Model model) {
		
		return "joinForm";
	}
	
	@RequestMapping(value = "/joinAction", method = RequestMethod.POST)
	public String joinAction(Locale locale, Model model, MemberVO mvo) throws Exception {
		//객체로 받을때는 파라미터의 이름과 객체 변수의 이름이 일치하고 getter, setter가 있어야 한다.->자동매핑
		System.out.println(mvo.getName());
		System.out.println(mvo.getPass());
		msrv.insertOne(mvo);
		
		return "home";
	}
}

6. VO

6.1 게시판 VO

package com.human.vo;

public class BoardVO {
	public int num;
	public String name;
	public String pass;
	public String title;
	public String content;
	public String email;
	public String indate;
	
	
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public String getIndate() {
		return indate;
	}
	public void setIndate(String indate) {
		this.indate = indate;
	}
}

6.2 멤버VO

package com.human.vo;

public class MemberVO {
	String name;
	String id;
	String pass;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

}

7. 서비스

7.1 게시판 서비스 인터페이스

package com.human.service;

import com.human.vo.BoardVO;

public interface IF_boardService {
	public void insertOne(BoardVO bvo) throws Exception;

}

7.2 게시판 서비스

package com.human.service;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.human.dao.IF_boardDAO;
import com.human.vo.BoardVO;

@Service
public class BoardServiceImpl implements IF_boardService {
	@Inject
	private IF_boardDAO bdao;
	@Override
	public void insertOne(BoardVO bvo) throws Exception {
		// TODO Auto-generated method stub
		bdao.insertOne(bvo);
		
	}

}

7.3 멤버 서비스 인터페이스

package com.human.service;

import com.human.vo.MemberVO;

public interface IF_memberService {
	public void insertOne(MemberVO mvo) throws Exception;
}

7.4 멤버 서비스

package com.human.service;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.human.dao.IF_memberDAO;
import com.human.vo.MemberVO;

@Service
public class MemberServiceImpl implements IF_memberService{
	@Inject
	private IF_memberDAO mdao;
	
	@Override
	public void insertOne(MemberVO mvo) throws Exception {
		// TODO Auto-generated method stub
		mdao.insertOne(mvo);
		
	}
}

8. DAO

8.1 게시판 DAO 인터페이스

package com.human.dao;

import com.human.vo.BoardVO;

public interface IF_boardDAO {
	public void insertOne(BoardVO bvo) throws Exception;
	
}

8.2 게시판 DAO

package com.human.dao;

import javax.inject.Inject;

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

import com.human.vo.BoardVO;

@Repository  //DAO 단임을 알려준다.
public class BoardDAOImpl implements IF_boardDAO{
	//spring의 DAO와 MyBatis sqlsession을 연결하는 객체
	private static String mapperQuery="com.human.dao.IF_boardDAO"; //mapping 인터페이스 경로설정
	
	//MyBatis의 sqlsession객체 선언
	@Inject //컨테이너에서 자료향과 맞는 객체의 주소를 주입해준다.
	private SqlSession sqlSession;//sqlsession객체는 스프링 컨테이너에서 주입 받는다.
	
	@Override
	public void insertOne(BoardVO bvo) throws Exception {
		// TODO Auto-generated method stub
		sqlSession.insert(mapperQuery+".insertOne", bvo);
	}

}

8.3 멤버 DAO 인터페이스

package com.human.dao;

import com.human.vo.MemberVO;

public interface IF_memberDAO {
	public void insertOne(MemberVO mvo) throws Exception;
}

8.4 멤버 DAO

package com.human.dao;

import javax.inject.Inject;

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

import com.human.vo.MemberVO;

@Repository
public class MemberDAOImpl implements IF_memberDAO{
	//spring의 DAO와 MyBatis sqlsession을 연결하는 객체
		private static String mapperQuery="com.human.dao.IF_memberDAO"; //mapping 인터페이스 경로설정
		
		//MyBatis의 sqlsession객체 선언
		@Inject //컨테이너에서 자료향과 맞는 객체의 주소를 주입해준다.
		private SqlSession sqlSession;//sqlsession객체는 스프링 컨테이너에서 주입 받는다.
		
		@Override
		public void insertOne(MemberVO mvo) throws Exception {
			// TODO Auto-generated method stub
			sqlSession.insert(mapperQuery+".insertOne", mvo);
		}
}
profile
공부하는 개발자

0개의 댓글