Spring

@MVC DB연동 1

wintertreey 2024. 7. 16. 17:47

차례로 DB연동을 시도해보자. 우선 가장 전통적인 방법.

 

문제

직급입력시, 직원목록과 인원수가 출력되게 하시오.

입력칸에 직급입력시,

 

이렇게 출력되게.

 

 

값을 입력받을 수 있도록 칸 생성및 get방식으로 넘겨준다. 

 

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/testdb" method="get">
	직급입력 :
	<input type="text" name="jikwon_jik">
	<input type="submit" value="확인">
</form>
</body>
</html>

 

ListController.java

package pack.controller;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import pack.model.DataDao;
import pack.model.JikwonDto;

@Controller
public class ListController {
	@Autowired
	private DataDao dataDao;
	
	@GetMapping("/testdb")// @리퀘스트파라미터 
	public String listProcess(@RequestParam(value="jik") String jikwon_jik,
			Model model) {
		ArrayList<JikwonDto> list = dataDao.selectData(jikwon_jik);
		model.addAttribute("datas", list);
		return "show";
	}
	
}

직급을 파라미터로 넘겨받아야한다. 

그러기위해 @RequestParameter을 사용했다. 

 

DataDao.java

package pack.model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class DataDao {
	private Connection conn;
	private PreparedStatement pstmt;
	private ResultSet rs;

	@Autowired
	private DataSource dataSource;

	public DataDao() {
		// TODO Auto-generated constructor stub
	}

	public ArrayList<JikwonDto> selectData(String jikwon_jik) {
		ArrayList<JikwonDto> list = new ArrayList<JikwonDto>();
		//int count=0;
		
		try {
			conn = dataSource.getConnection();
			pstmt = conn.prepareStatement("select * from jikwon where jikwon_jik = ?");
			pstmt.setString(1, jikwon_jik);
			rs = pstmt.executeQuery();

			while (rs.next()) {
				JikwonDto dto = new JikwonDto();
				dto.setJikwon_no(rs.getString("jikwon_no"));
				dto.setJikwon_name(rs.getString("jikwon_name"));
				dto.setJikwon_gen(rs.getString("jikwon_gen"));
				dto.setJikwon_pay(rs.getString("jikwon_pay"));
				list.add(dto);
				//count++;
			}
		//System.out.println("인원수 : "+ count);
		} catch (Exception e) {
			System.out.println("selectData err: " + e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
		return list;
	}

}

 

해당 직급에 맞는 직원만 출력해야하기에 ?로 값을 넣어준다. 

주석처리된 부분을 살펴보면 인원수를 카운트하려고 시도했다는 것을 알수 있다. 

그러나 여기는 비즈니스로직부분이고, 결국은 출력하는 화면은 아니기에 의미가 없어서 흔적만 남겨두었다.

 

출력부분 show.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>직원 목록 (@MVC: DB1 전통적방법) </h3>
	<table border="1">
		<tr>
			<th>사번</th>
			<th>직원명</th>
			<th>성별</th>
			<th>연봉</th>
		</tr>
		<tr th:each="data:${datas}">
			<td>[[${data.jikwon_no}]]</td>
			<td>[[${data.jikwon_name}]]</td>
			<td>[[${data.jikwon_gen}]]</td>
			<td>[[${data.jikwon_pay}]]</td>
		</tr>
	</table>
<br>인원수 : [[${datas.size}]] 명
<br>인원수: 
<span th:text="${datas.size}"></span> 명
</body>
</html>

 

타임리프를 이용해 출력하는 모양새가 다양하게 있다 

마지막 부분 인원수부분을 보면, 같은값 다른방법으로 두번 출력해보았다. 

두 방식의 차이점 정리

  [[${datas.size}]] <span th:text="${datas.size}"></span>
용도 텍스트 콘텐츠 출력 HTML 요소의 텍스트 콘텐츠 설정
출력 방식 단순 출력 (텍스트로 렌더링) 텍스트 설정 (HTML 요소의 콘텐츠)
HTML 태그 텍스트로 출력 (태그는 렌더링되지 않음) HTML 요소의 텍스트로 렌더링
HTML 엔티티 자동 인코딩 자동 인코딩
상황 예 텍스트 내용이나 단순 데이터 표시 HTML 요소의 동적 콘텐츠 설정

 

 

 

관련 소스코드는 깃허브의 sprweb8db_legacy, 8_ex를 참고하자.

https://github.com/yoonah0327/spring_source.git

 

GitHub - yoonah0327/spring_source

Contribute to yoonah0327/spring_source development by creating an account on GitHub.

github.com