[목차]

6. Spring에서 DB 연동 

* Maria DB lib 등록 

① JAVA의 JDBC를 사용  

② DaoSupport 클래스 사용  - spring이 지원 

③ MyBatis 사용

 


 

[내용]

 - Spring api 문서

docs.spring.io/spring/docs/5.0.x/javadoc-api/

* Maria DB lib 등록

① search.maven.org/접속

② Search창에 mariadb-java-client 검색 
③ 버전선택 (2.6.2) 
④ Apache Maven 내용 pom.xml에 copy & paste

<!-- MariaDB driver -->
<dependency>
  <groupId>org.mariadb.jdbc</groupId>
  <artifactId>mariadb-java-client</artifactId>
  <version>2.6.2</version>
</dependency>

⑤ Search창에 spring-boot-starter-jdbc 검색 
⑥ 버전선택 (2.3.6.RELEASE) 
⑦ Apache Maven 내용 pom.xml에 copy & paste

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
  <version>2.3.6.RELEASE</version>
</dependency>

 


① JAVA의 JDBC를 사용 

 

 - SangpumDto

public class SangpumDto {
	
	private String code, sang, su, dan;
	//getter 추가
	//setter 추가
}


 - SangpumInter

public interface SangpumInter {
	ArrayList<SangpumDto> selectList();
}

 

 - SangpumImpl : DB 처리

@Repository // @Componet와 동일. db와 연동할 코드
public class SangpumImpl implements SangpumInter{
	
	private Connection conn;
	private PreparedStatement ptmt;
	private ResultSet rs;
	
	public SangpumImpl() {
		try {
			Class.forName("org.mariadb.jdbc.Driver");
		} catch (Exception e) {
			System.out.println("SangpumImpl err"+e);
		}
	}
	
	public ArrayList<SangpumDto> selectList() {
		ArrayList<SangpumDto> list = new ArrayList<SangpumDto>();
		String sql="select * from sangdata";
		try {
			conn =DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123");
			ptmt = conn.prepareStatement(sql);
			rs = ptmt.executeQuery();
			while(rs.next()) {
				SangpumDto dto = new SangpumDto();
				dto.setCode(rs.getString("code"));
				dto.setSang(rs.getString("sang"));
				dto.setSu(rs.getString("su"));
				dto.setDan(rs.getString("dan"));
				list.add(dto);
			}
		} catch (Exception e) {
			System.out.println("selectList err"+e);
		}finally {
			try {
				if(conn != null) conn.close();
				if(ptmt != null) ptmt.close();
				if(rs != null) rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return list;
	}

}

    @Repository : @Componet와 동일. db와 연동할 코드

 

 - BusinessInter

public interface BusinessInter {
	public void dataList();
}

 

 - BusinessImpl

@Service // business logic에 사용
public class BusinessImpl implements BusinessInter{
	@Autowired // setter 주입 사용
	private SangpumInter sangpumInter;
	
	/* 생성자 주입 사용가능
	 * @Autowired public BusinessImpl(SangpumInter sangpumInter) {
	 * this.sangpumInter=sangpumInter; }
	 */
	
	public void dataList() {
		ArrayList<SangpumDto> list = sangpumInter.selectList();
		for(SangpumDto s:list) {
			System.out.println(s.getCode()+" "+
		s.getSang()+" "+
		s.getSu()+" "+
		s.getDan());
		}
	}
}

 

 - main

public static void main(String[] args) {
	ApplicationContext context = new ClassPathXmlApplicationContext("dbinit.xml");
	BusinessInter businessInter = (BusinessInter)context.getBean("businessImpl");
	businessInter.dataList();
}

 

 - dbinit.xml

<!-- 어노테이션 사용하도록 설정 -->
<context:component-scan base-package="pack.business"/>
<context:component-scan base-package="pack.model"/>

 

 


② DaoSupport 클래스 사용

 - SangpumDto 
 - BusinessImpl 
 - main 
 동일

 

 - SangpumInter

public interface SangpumInter {
	List<SangpumDto> selectList() throws DataAccessException;
}

 

 - SangpumImpl

// Spring이 제공하는 DB 연결처리. JdbcDaoSupport 상속.
public class SangpumImpl extends JdbcDaoSupport implements SangpumInter {

//	생성자 주입으로 처리 가능.
//	public SangpumImpl(DataSource dataSource) {
//		super.setDataSource(dataSource);
//	}

	public List<SangpumDto> selectList(/* String code */) throws DataAccessException {
		// member : Datasource, JdbcTemplate
		RowMapper rowMapper = new SangRowMapper();
		
		return getJdbcTemplate().query("select * from sangdata", rowMapper);
		// record수 만큼 mapRow() 호출.
		//return getJdbcTemplate().query("select * from sangdata where code=code", rowMapper); 
		// 매개변수 사용시
	}
	
	// 내부 클래스
	class SangRowMapper implements RowMapper{ // RowMapper 상속
		public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
			// mapRow는 레코드 수 만큼 호출. rs.next()가 내부적으로 처리됨.
			System.out.println("rowNum" + rowNum);
			SangpumDto dto = new SangpumDto();
			dto.setCode(rs.getString("code"));
			dto.setSang(rs.getString("sang"));
			dto.setSu(rs.getString("su"));
			dto.setDan(rs.getString("dan"));
			return dto;
		}
	}
}

 

 - BusinessInter

public class BusinessImpl implements BusinessInter{
	private SangpumInter sangpumInter;
	
	public void setSangpumInter(SangpumInter sangpumInter) {
		this.sangpumInter = sangpumInter;
	}
	
	public void dataList() {
		ArrayList<SangpumDto> list = (ArrayList<SangpumDto>)sangpumInter.selectList();
		for(SangpumDto s:list) {
			System.out.println(s.getCode()+" "+
		s.getSang()+" "+
		s.getSu()+" "+
		s.getDan());
		}
	}
}

 

 - dbinit.xml

<!-- db연결 -->
<!-- xml파일이 아니 별도 class로 작성 가능. -->
<bean id="dataSorce" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName">
		<value>org.mariadb.jdbc.Driver</value>
	</property>
	<property name="url">
		<value>jdbc:mysql://localhost:3306/test</value>
	</property>
	<property name="username">
		<value>root</value>
	</property>
	<property name="password">
		<value>123</value>
	</property>
</bean>
<!-- db연결 클래스 객체 생성 -->
<bean id="sangpumImpl" class="pack.model.SangpumImpl">
<!--JdbcDaoSupport을 상속받았기 때문에 별도로 dataSource setter를 정의하지않아도 setter주입을 할 수 있다.-->
	<property name="dataSource" ref="dataSorce"/>
</bean>
<!-- 객체생성 -->
<bean id="businessImpl" class="pack.business.BusinessImpl">
	<property name="sangpumInter" ref="sangpumImpl"/>
</bean>

 

 - dbinit.xml

<!-- DriverManagerDataSource를 상속받은 db 연결 class 객체 생성. -->
<bean id="dataSource" class="pack.model.DataSourceMaria"></bean>

<!-- db연결 클래스 객체 생성 -->
<bean id="sangpumImpl" class="pack.model.SangpumImpl">
<!-- JdbcDaoSupport을 상속받았기 때문에 별도로 dataSource setter를 정의하지않아도 setter주입을 할 수 있다. -->
	<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 객체생성 -->
<bean id="businessImpl" class="pack.business.BusinessImpl">
	<property name="sangpumInter" ref="sangpumImpl"/>
</bean>

 


③ MyBatis 사용

 

 - db.properties

 

 - DataMapper.xml

<mapper namespace="dev">
 <select id="selectAll" resultType="dto">
  select * from sangdata
 </select>
</mapper>

 

 - Configuration.xml

<configuration>
 <properties resource="pack/mybatis/db.properties" />
 <typeAliases>
 	<typeAlias type="pack.model.SangpumDto" alias="dto"/>
 </typeAliases>
 <environments default="dev">
  <environment id="dev">
   <transactionManager type="JDBC" />
   <dataSource type="POOLED">
    <property name="driver" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
   </dataSource>
  </environment>
 </environments>
 <mappers>
  <mapper resource="pack/mybatis/DataMapper.xml" />
 </mappers>
</configuration>

 

 - SqlMapConfig

public class SqlMapConfig { // 메뉴얼 확인하여 작성.
	public static SqlSessionFactory sqlSession; // DB의 SQL 명령 실행을 위한 메소드를 가진 객체.
	
	static {
		String resource = "pack/mybatis/Configuration.xml";
		try {
			Reader reader = Resources.getResourceAsReader(resource);
			// Configuration.xml을 읽는다.
			sqlSession = new SqlSessionFactoryBuilder().build(reader);
			// sqlSession 객체를 생성한다.
			reader.close();
		} catch (Exception e) {
			System.out.println("SqlMapConfig err"+e);
		}
	}
	public static SqlSessionFactory getSqlSession() {
		return sqlSession;
	}
}

 

 - SangpumInter

public interface SangpumInter {
	List<SangpumDto> selectDataAll();
}

 

 - SangpumImpl

@Repository
public class SangpumImpl implements SangpumInter{
	
	private SqlSessionFactory factory = SqlMapConfig.getSqlSession();
	
	public List<SangpumDto> selectDataAll() {
		SqlSession sqlSession = factory.openSession();
		List<SangpumDto> list = null;
		
		try {
			list=sqlSession.selectList("selectAll");
		} catch (Exception e) {
			System.out.println("selectDataAll err"+e);
		}finally {
			if(sqlSession!=null) sqlSession.close();
		}
		return list;
	}
}

 

 - BusinessInter

public interface BusinessInter {
	void dataList();
}

 

 - BusinessImpl

@Service
public class BusinessImpl implements BusinessInter{
	
	@Autowired
	private SangpumInter inter;
	
	public void dataList() {
		List<SangpumDto> list =inter.selectDataAll();
		
		for(SangpumDto s: list) {
			System.out.println(s.getCode()+" "+s.getSang()+" "+s.getSu()+" "+s.getDan());
		}
	}
}

 

 - main

public static void main(String[] args) {
	ApplicationContext context = new ClassPathXmlApplicationContext("dbinit.xml");
	BusinessInter businessInter = (BusinessInter)context.getBean("businessImpl");
	businessInter.dataList();
}

 

 - dbinit

<context:component-scan base-package="pack.business"/>
<context:component-scan base-package="pack.model"/>

 

 

 

[목차]

1. Spring 환경구축
* 이클립스에 연동
* 라이브러리 로딩방법
① maven을 사용하지 않고 spring lib 파일을 직접 다운로드
② Maven, Gradle


 

[내용]

1. Spring 환경구축

* 이클립스에 연동

 

[eclipse] - [help] - [eclipse marketplace] - [find : spring] - [Spring Tools 3 Add-On for Spring Tools 4 3.9.15 RELEASE] download


* 라이브러리 로딩방법

 

① maven을 사용하지 않고 spring lib 파일을 직접 다운로드

 framwork download

maven.springframework.org/release/org/springframework/spring/5.0.5.RELEASE/

 

Index of release/org/springframework/spring/5.0.5.RELEASE

 

maven.springframework.org

 => [spring-framework-5.0.5.RELEASE-dist.zip] Download

 

 라이브러리 등록

[File] - [New] - [New Spring Legacy Project] - [Simple java] check - [next] - [Library] tab - [Add jar] - [spring-framework-5.0.5.RELEASE\libs] 선택

 

③ bean xml 파일에 bean 등록

프로젝트의 [src] 오른쪽 클릭 - [New] - [Spring Bean Configuration file] - xml파일명 입력 - [finish]

<beans>
	<bean id="mes" class="pack.Message1" />
</beans>

④ getBean

ApplicationContext context = new ClassPathXmlApplicationContext("init.xml");
MessageInter inter2 = (MessageInter)context.getBean("mes");
inter2.sayHello("양길동");
// Spring이 객체를 Singletone으로 생성하여 줌.

 

② Maven, Gradle - 주로 사용

 - 외부에서 로딩
 - 프로젝트, 라이브러리 관리

 

① maven 프로젝트 생성

[New] - [Maven Project] - [create a simple project] check - [Group id], [Atifact id] 입력 - [finish]

 

pom.xml파일 수정

<project>
	<properties>
		<!-- Generic properties -->
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<!-- Spring -->
		<spring-framework.version>5.0.0.RELEASE</spring-framework.version>
		<!-- => 원하는 버전정보 입력 -->
		<!-- Mybatis -->
		<mybatis.version>3.2.3</mybatis.version>
	</properties>
	<dependencies>
		<!-- Spring and Transactions -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>
		<dependency>
			<groupId>javax.annotation</groupId>
			<artifactId>javax.annotation-api</artifactId>
			<version>1.3.2</version>
		</dependency>
		<!-- Spring jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>
		<!-- oracle jdbc driver -->
		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>11.1.0.7.0</version>
		</dependency>
		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.0.2</version>
		</dependency>
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.2.2</version>
		</dependency>
	</dependencies>
</project>

 => 다음 경로에 라이브러리가 사이트에서 받아지고 이후 로컬의 라이브러리를 사용한다.

C:\Users\wonh\.m2\repository\org\springframework\spring-core\5.0.0.RELEASE\

 

③ meta.xml 파일 생성

프로젝트의 [src/main/resource] 오른쪽 클릭 - [New] - [Spring Bean Configuration file] - xml파일명 입력 [next] - [beans],[http://www.springframwork.org/schema/beans/spring-beans.xsd] check - [finish] 

<beans>
	<bean id="mes" class="pack.Message1" />
</beans>

12. MVC pattern

Client
(html)
----> Controller
(servlet,
interface, class)
----> Model
(DTO, DAO-sql)
----> DB
----> View
(FormBean, jsp)
   

 

1) Client : html의 <form>,<a>태그로 값을 전달한다.

<form action="path" method="get">
	<input type="text" name="name1" value="value1">
	<input type="submit">
</form>


<a href="sang.do?command=sang">상품</a><br> // Parameter로 값 전달
<a href="sang.do">상품</a> // 요청명으로 값 전달
<a href="buser.do">부서</a>

 

2) Controller

① servlet

@WebServlet("/hobby.do") : 단일
@WebServlet({"/hobby.do","/nicd.do"}) : 배열(복수)
@WebServlet({"*.do","*.kor"}) : 확장자(복수)

 => ( )안 설정한 url pattern을 사용하여 servlet 호출할 수 있다.

 

private HobbyModel model;
public void init() throws ServletException {
	model = new HobbyModel();
}

 => servlet의 service에 구현시 요청마다 new 객체 생성시 메모리를 많이 소모 함으로 init()에 작성한다.

 

protected void service(HttpServletRequest request, HttpServletResponse response)
						throws ServletException, IOException {

 => get/post방식에 상관없이 동작하도록 구현.

 

	try {
		name=request.getParameter("name");
	} catch (Exception e) {
		name=null;
	}  

 => 요청처리 방법 1 : parameter사용. request.getParameter()로 html의 value를 전달받는다.

 

	String str1 = request.getRequestURI();
	// 요청명 : /mvc_ex3_db/sang.do
	int idx = str1.lastIndexOf('/');
	// 11
	String str2 = str1.substring(idx+1); // idx+!부터 끝까지 자름
	// sang.do
	StringTokenizer str3 = new StringTokenizer(str2,"."); // str2를 .을 기준으로 토큰화
	// sang ,  do
	str4 = str3.nextToken();
	// sang
	String command = str4;

 => 요청처리 방법 2 : 요청명을 사용

      "/프로젝트명/uripattern.확장자"로 전달받는다.

 

	CommandInter inter = null;
	String viewName = "views/";
	try {
		if(command.equals("sang")) {
			inter = SangpumImpl.instance();
		}else if(command.equals("buser")) {
			inter = BuserImpl.instance();
		}else if(command.equals("jikwon")) {
			inter = JikwonImpl.instance();			
		}else {
			viewName += "error.html";
			response.sendRedirect(viewName);
            return;
		}
		viewName += inter.showData(request, response);
	} catch (Exception e) {
		System.out.println("service : "+e);
	}

 => interface를 상속받은 클래스의 singletone 객체를 받아온다.

 => 명령에 따른 다른 table의 객체를 받아오도록 오버라이딩을 진행한 메소드를 실행한다.

 

	//HobbyModel model = new HobbyModel();
	ArrayList<String> list = model.getHobby(hobby);
	request.setAttribute("datas", list);

 => 다음의 모델은 interface를 상속받은 클래스에 구현한다.(다형성을 사용)

 

	//response.sendRedirect(viewName+"?result="+result); // 컬렉션 류의 객체는 전달X
		
	request.setAttribute("result", result); // 객체 전달 가능.
	RequestDispatcher rd = request.getRequestDispatcher(viewName);
	rd.forward(request, response);
}

 => request setAttribute(), getAttribute()으로 값 전달.

 => sendRedirect의 경우 객체를 전달할 수 없어 forward로 요청 재지정하여 값 전달.

 

 

 * web.xml를 이용한 url pattern 등록 (경로 : Context/WEB_INF/web.xml)

<welcome-file-list>
	<welcome-file>index.html</welcome-file>
	<welcome-file>index.htm</welcome-file>
	<welcome-file>index.jsp</welcome-file>
	<welcome-file>default.html</welcome-file>
	<welcome-file>default.htm</welcome-file>
	<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

 => <welcom-file>내 파일명을 입력하면, 도메인만 입력시에 해당 파일이 실행된다.

 => 위쪽 부터 우선순위를 가진다.

 

<servlet>
	<servlet-name>hobby</servlet-name>
	<servlet-class>pack.controller.HobbyController</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>hobby</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

=> url pattern 등록

 

 

② Interface

public interface CommandInter {
	String showData(HttpServletRequest request, HttpServletResponse response);
}

 

 

③ class

public class SangpumImpl implements CommandInter{
	//Singleton
	static SangpumImpl impl = new SangpumImpl();
	public static SangpumImpl instance() {
		return impl;
	}

	@Override
	public String showData(HttpServletRequest request, HttpServletResponse response) {
		SangpumModel model = new SangpumModel();//원래는 싱글으로 작성된 클래스를 읽어야함.
		ArrayList<SangpumDto> list = model.getDataAll();
		request.setAttribute("datas", list);
		return "sangpum.jsp";
	}

}

 => 모델에 있는 클래스와 통신을 하는 컨트롤러 영역내의 클래스를 선언한다.

 

* Singletone : 한클래스당 하나의 객체만 사용하도록 하는 인스턴스.

class 클래스명{
	private static 클래스명 singleton명 = new 클래스명();
	static 클래스명 getInstance(){
		return singleton;
	}
}

 

 

3) Model

① DTO

public class SangpumDto {
	private String code;
	private String sang;
	private String su;
	private int dan;
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
    ...
}

 => 필드, getter, setter 선언

 

 

② DAO (or Model)

 * JDBC Connection pooling

public class SangpumModel {
	private Connection conn;
	private PreparedStatement ptmt;
	private ResultSet rs;
	private DataSource ds;
	
	
	public SangpumModel() {
		try {
			Context context = new InitialContext();
			ds= (DataSource)context.lookup("java:comp/env/jdbc_maria");
		} catch (Exception e) {
			System.out.println("SangpumModel err"+e);
		}
	}
	
	public ArrayList<SangpumDto> getDataAll(){
		ArrayList<SangpumDto> list = new ArrayList<>();
		try {
			conn=ds.getConnection();
			String sql = "select * from sangdata";
			ptmt = conn.prepareStatement(sql);
			rs= ptmt.executeQuery();
			while(rs.next()) {
				SangpumDto dto = new SangpumDto();
				dto.setCode(rs.getString("code"));
				dto.setSang(rs.getString("sang"));
				dto.setSu(rs.getString("su"));
				dto.setDan(rs.getInt("dan"));
				list.add(dto);
			}
		} catch (Exception e) {
			System.out.println("getDataAll err"+e);
		}finally {
			try {
				if(conn!=null) conn.close();
				if(ptmt!=null) ptmt.close();
				if(rs!=null) rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return list;
	}
}

 

 * Mybatis (xml)

  - db.properties : 계정정보

  - Configuration.xml : <alias>, <mapper> 수정

  - DataMapper.xm : xml 형식 sql문 작성

  - SqlMapConfig : SqlSessionFactory 객체 생성

  - DAO(or model)

public class SangpumModel {
	private SqlSessionFactory factory = SqlMapConfig.getSqlSession();
	
	public ArrayList<SangpumDto> getDataAll(){
		ArrayList<SangpumDto> list = null;
		SqlSession sqlSession = factory.openSession();
		list = (ArrayList)sqlSession.selectList("selectDataAll");
		sqlSession.close();
		return list;
	}
}

 

* Mybatis (@어노테이션)

  - db.properties : 계정정보

  - Configuration.xml : <alias>, <mapper> 삭제

  - DataMapper.xm : 삭제

  - SqlMapperInter : 테이블수에 맞게 작성. sql문 작성

public interface SqlMapperInter_Jikwon {
	@Select("select jikwon_no, jikwon_name, buser_num, jikwon_jik from jikwon where buser_num = #{buser_no}")
	public List<JikwonDto> selectPartJikwon(String buser_no);
}

 

  - SqlMapConfig : SqlMapperInter의 class 배열에 연결.

Class[] mappers = {SqlMapperInter_Buser.class, SqlMapperInter_Jikwon.class, SqlMapperInter_Gogek.class};
for(int i=0; i<mappers.length;i++) {
	sqlSession.getConfiguration().addMapper(mappers[i]);
}

 

  - DAO(or model) : SqlSessionFactory객체사용하여 sql 메소드 호출.

public class JikwonDao {
	private SqlSessionFactory factory = SqlMapConfig.getSqlSession();
	
	public ArrayList<JikwonDto> selectPartJikwon(String buser_no){
		ArrayList<JikwonDto> list = new ArrayList<>(); 
		SqlSession sqlSession = factory.openSession();
		
		try {
			SqlMapperInter_Jikwon inter = sqlSession.getMapper(SqlMapperInter_Jikwon.class);
			list = (ArrayList)inter.selectPartJikwon(buser_no);
		} catch (Exception e) {
			System.out.println("selectPartJikwon err"+e);
		}finally {
			if(sqlSession != null) sqlSession.close();
		}
		return list;
	}
	
}

 

 

4) View

① 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 http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>Insert title here</title>
</head>
<body>
	*상품자료(MVC pattern)
	<table border="1">
		<tr>
			<td>코드</td><td>품명</td><td>수량</td><td>단가</td>
		</tr>
		<c:forEach var = "s" items="${datas}">
			<tr>
				<td>${s.code}</td>
				<td>${s.sang}</td>
				<td>${s.su}</td>
				<td>${s.dan}</td>
			</tr>
		</c:forEach>
	</table>
	
</body>
</html>

 

'BACK END > Servlet' 카테고리의 다른 글

[Servlet] Servlet 정리9 - Mybatis2  (0) 2021.01.06
[Servlet] Servlet 정리8 - Mybatis  (0) 2021.01.06
[Servlet] Servlet 정리7 - JDBC  (0) 2021.01.06
[Servlet] Servlet 정리6 - EL, JSTL  (0) 2021.01.04
[Servlet] Servlet 정리5 - Ajax  (0) 2021.01.03

[목차]

5. JSP

    1) MVC 패턴

    2) 요청재지정

    3) 데이터 공유 

    4) JSP

    5) 스크립트 요소 

 

[내용]

5. JSP

    [서블릿 & DAO 연동 코드작성]
    1) 서블릿을 작성.
    2) 서블릿을 작성시 등록한 urlpattern에 매핑된 path를 요청 View(서블릿을 요청하는 최초 실행되는 클라이언트

        화면)의 <form>태그 action속성이나 <a>태그 href속성에 연결.
    3) 서블릿에서 요청정보 추출 후 sysout 테스트 진행.
    4) DTO 클래스 작성.
    5) DAO 클래스 작성.(서블릿에서 호출하는 비지니스 메소드를 가진)
       - 메소드내 sysout으로 출력하여 sysout 테스트.
    6) 서블릿에서 DAO메소드 호출
    7) DAO 코드 작성.
        ① insert, delete, update는 실행결과 행 출력
        ② select
        while문을 작성하고 while문 안에서 sysout출력.
       출력되면 칼럼을 가져와서 출력.
    8) 서블릿에서 dao호출한 리턴결과를 출력.

 

//servlet
MyEmpDAO dao = new MyEmpDAO();
ArrayList<MyEmpDTO> list = dao.getMemberList();
out.println("list.get(i).getDeptno()");
//dao
public ArrayList<MyEmpDTO> getMemberList(){
	ArrayList<MyEmpDTO> list = new ArrayList<MyEmpDTO>(); 
	System.out.println("dao요청");
	String sql = "select * from myemp";
	Connection con = null;
	PreparedStatement ptmt = null;
	ResultSet rs = null;
	try {
		con = DBUtil.getConnect();
		ptmt = con.prepareStatement(sql);
		rs = ptmt.executeQuery();
		while(rs.next()) {
			MyEmpDTO emp = new MyEmpDTO(rs.getString(1), rs.getString(2), rs.getString(3), 
            rs.getString(4), rs.getString(5), rs.getInt(6), rs.getString(7)); 
			list.add(emp);
		}
		System.out.print(list.size());
	} catch (SQLException e) {
		e.printStackTrace();
	}finally {
		DBUtil.close(rs, ptmt, con);
	}
	return list;
}

 

 

    1) MVC 패턴 : Model View Controller로 각 역할을 구분하고 분리해서 작업할 수 있도록 개발하는 패턴
                      : 서블릿, jsp를 이용해서 웹을 개발할때 각 역할별로 분리해서 작업.

Model View Controller
DAO Html Servlet

 


    2) 요청재지정 : MVC패턴 적용을 위한 설정.
                       : 최초로 요청된 web appliction파일(서블릿)이 실행된 후 요청받은 서블릿이 응답되지 않고

                         view파일(jsp)이 응답되도록 설정하는 것
                       : 서블릿에서 뷰를 분리.
        ① forward : servlet에서 사용
            1) 문법

RequestDisptcher rd =  request.getRequestDisptcher("요청 재지정할 application의 context명을 뺀 나머지 path");
rd.forward(request객체, response객체);
RequestDisptcher rd =  request.getRequestDisptcher("/basic/result.jsp");
rd.forward(request, response);

            2) 실행흐름
            - 클라이언트가 서블릿을 요청하는 경우 서블릿이 실행되고 forward로 지정한 web application이

            재요청되어 실행.
            - 이때 재지정되는 요청은 새로운 요청이 만들어지면서 요청되는 것이 아니라 서블릿 요청의 연장.
            - 한번의 요청으로 두개의 web application이 실행된다. (서블릿, jsp파일이 실행)

 

        ② include : jsp에서 사용

//servlet
out.print("머리말");
System.out.println("include연습  - include 서블릿 실행");
//1. 데이터 공유
MyEmpDTO user = new MyEmpDTO("003", "이이", null, "", "", 0, "");
request.setAttribute("myuser", user);
//2. 요청 재지정 - include
RequestDispatcher rd = request.getRequestDispatcher("/jspbasic/page.jsp");
rd.include(request, response);
out.print("꼬리말");

        => 머리말 + jsp 실행내용 + 꼬리말로 실행된다.

 

         - jsp

<jsp:include page="../top.jsp"></jsp:include>

 


    3) 데이터 공유
     - 한번의 요청으로 서블릿과 jsp가 실행되어 같은 request객체를 사용하기 때문에 데이터를 공유할 수 있다.
     - 같은 request를 사용

     - 서블릿에서 Request객체에 저장
     - jsp에서 Request객체에서 값을 가져옴
     - 공유되는 데이터를 attribute라한다.
     - 자바에서 사용할 수 있는 모든 객체를 공유할 수 있다.

     - http 프로토콜 특성으로 한번의 요청을 서버에서 처리하면서 저장한 값은 클라이언트에게 응답하는 순간

       메모리에서 없어진다. 즉 상태정보가 유지 되지않는다.

        ① 데이터 저장 : 서블릿에서 처리

request객체.setAttribute("저장할 attribute의 이름", 저장할 객체);
out.print("servlet 출력"); // forward 사용 시 실행은 되나 출력되지않음.
//1. 데이터 공유
MyEmpDTO user = new MyEmpDTO("003", "이이", null, "", "", 0, ""); // 공유할 객체
request.setAttribute("myuser", user); // 데이터 공유
//2. 요청 재지정 - forward
RequestDispatcher rd = request.getRequestDispatcher("/jspbasic/page.jsp");
rd.forward(request, response);

 

        ② 데이터 가져오기 : jsp에서 처리

Object객체 = (공유객체 타입)request객체.getAttribute("서블릿에서 저장한 attribute의 이름");
//공유 객체로 casting
<%
	MyEmpDTO user = (MyEmpDTO)request.getAttribute("myuser");
%>
<%= user.getName() %>

 

        ③ 데이터 지우기

removeAttribute("name");

 

 

 

    4) JSP : html에서 java code를 사용하기 위한 언어.
             : 이클립스 내부에서 java의 코드를 html문자열로 변환.

 

    * 서버로 인식하는 위치 (context)

    C:\Java\work\webwork\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\serverweb

 

    * jsp 경로

C:\Java\work\webwork\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\serverweb\org\apache\jsp\jsp

    

    * jsp파일은 자동으로 하기와 같이 변환된다.

public void _jspInit() { ... }
public void _jspDestroy() { ... }
public void _jspService(final javax.servlet.http.HttpServletRequest request,
final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException { ... }

 

    [Servlet 동작] 
        1) 요청정보 추출 
        2) 비지니스 메소드 호출 
        3) 데이터를 공유 
        4) 요청재지정 
        5) 서블릿에서 공유한 데이터를 꺼내서 출력하기 [jsp] 

* html 파일 
모든 클라이언트에게 항상 고정된 동일한 화면만 서비스(정적 html문서) 

* jsp파일 
모든 클라이언트의 상황에 따라 다른 화면을 서비스할 수 있다.(동적 html)

 

 

    5) 스크립트 요소
        ① 스크립트릿 ( <% %>)

         - 자바코드를 사용할 수 있는 스크립트 요소.
         - 자바명령문을 정의할 수 있는 곳
         - ; 을 문자의 끝에 추가해야한다.
         - 자바와 동일하게 java.lang패키지는 자동으로 인식하지만 다른 패키지를 사용하는 경우 import한다. 

         - .jsp문서 내에서 선언되는 모든 지역변수를 사용할 수 있다.
         - jsp문서내 자바코드는 지양해야한다.
         - 자바코드는 서블릿이 공유하는 데이터를 꺼내서 출력하기 위한 코드만 정의해야한다.
         - jsp목적이 로직과 뷰를 위한 코드가 혼재되어 있는 부분을 없애기 위해서 만들어진 기술
         - 자바코드를 쓰지 않기 위해서 EL & JSTL(표준태그)

<% 
	// jsp문서에 작성하는 모든 태그나 코드의 작성은_jspService메소드 내부에 만들어진다. 
	out.println("<h2>hello</h2>"); // out 객체는 자동생성된 객체이므로 사용가능하다. 
%> 

        - 자동완성하여 객체 타입 설정시 자동 import된다.

<%@page import="basic.MyEmpDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.Random, java.util.ArrayList"%>

        ② 표현식(<%= %>)

         - 기본형변수, 문자열을 반환하거나 해당 타입으로 선언된 변수를 출력.
          변수의 값을 출력하기 위해서 사용. out.print()메소드의 매개변수로 전달되므로 ;을 쓰지않는다.
           <%= 값 or 값을 리턴하는 메소드 호출문 or 연산식%>
          - 표현식은 jsp가 서블릿으로 변환될때 out.print() 메소드의 매개변수로 전달되는 코드
          - 표현식을 정의할때는 ;을 추가하지않는다. ;을 추가하면 out.print(값;);

          - 표현식은 서블릿에서 발생한 값을 웹페이지에 출력할 목적으로 사용하는 jsp스크립트 요소
          - 사용가능한 타입이 제한
          - 서블릿으로 변환될때 print메소드의 매개변수로 전달되기 때문에
          - 기본형, 스트링으로 변환될 수 있는 변수의 값, 메소드의 호출결과, 연산식등을 사용할 수 있다.

<%
	String str = "hello";
%>
<%= str %>
// out.print(str);로 자동변환된다.
<%= str; %>
// ;사용 시 out.print(str;);로 자동변환된다.

        ③ 선언문

         - 멤버를 선언하기 위해 사용.
         - jps문서의 멤버변수, 메소드를 정의하기 위해서 사용(jsp파일에서 java code를 최소화해야함으로 거의

         사용하지않는다)

<%! int num=100000; %>
<%! public void test(){
		System.out.println("test");
	}
%>


        ④ 지시자 - 컨테이너에게 넘겨줄 정보를 선언.


        ⑤ 주석문

<!-- HTML주석문(클라이언트에 전송) -->
<%-- jps주석문(jsp문법에 해당하는 코드를 주석으로 처리하는  용도 : 클라이언트에 전송 되지않는다. --%>
<%
	//	자바주석문
	/* 
		자바 여러줄 주석문 : 클라이언트에 전송 되지않는다.
	*/
%>

 

'BACK END > Servlet' 카테고리의 다른 글

[Servlet] Servlet 정리6 - EL, JSTL  (0) 2021.01.04
[Servlet] Servlet 정리5 - Ajax  (0) 2021.01.03
[Servlet] Servlet 정리4 - Cookie, Session  (0) 2021.01.02
[Servlet] Servlet 정리2 - JDBC  (0) 2020.12.28
[Servlet] Servlet 정리1  (0) 2020.12.28

+ Recent posts

1