2020/09/16 - [개발자/Java] - Java (자바) Controller, DB 파일 받아와서 만들기, C태그 사용, jsp 파일 내 자바 코드 에서 이어진다.

 

1. 객체 생성

객체 안에 DB 디렉토리랑 테이블 이름을 넣는다.

Memo.java

package com.kopo.memo;

public class Memo {
	public int idx;
	public String title;
	public String memo;
	public String created;
	public String updated;
	
	public final String DB_FILE_NAME = ".../memo2.db";
	public final String TABLE_NAME = "memo";
	
	public Memo() {
		
	}
	
	public Memo(String title, String memo) {
		this.title = title;
		this.memo = memo;
	}
	
	public Memo(int idx, String title, String memo) {
		this.idx = idx;
		this.title = title;
		this.memo = memo;
	}
	
	public String toHtmlString() {
		StringBuffer htmlString = new StringBuffer();
		htmlString.append("<tr>");
		htmlString.append("<td>" + this.idx + "</td>");
		htmlString.append("<td>" + this.title + "</td>");
		htmlString.append("<td>" + this.memo + "</td>");
		htmlString.append("<td>" + "<a href=u1?idx=" + this.idx + ">상세보기</a>" + "</td>");
		htmlString.append("</tr>");
		
		return htmlString.toString();
	}

	public int getIdx() {
		return idx;
	}

	public void setIdx(int idx) {
		this.idx = idx;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getMemo() {
		return memo;
	}

	public void setMemo(String memo) {
		this.memo = memo;
	}

	public String getCreated() {
		return created;
	}

	public void setCreated(String created) {
		this.created = created;
	}

	public String getUpdated() {
		return updated;
	}

	public void setUpdated(String updated) {
		this.updated = updated;
	}
	
}

 

People.java

package com.kopo.memo;

public class People {
	public int idx;
	public String name;
	public String phone;
	public String created;
	public String updated;
	
	public final String DB_FILE_NAME = ".../memo2.db";
	public final String TABLE_NAME = "people";

}

 

 

2. 그리고 HomeController의 일부를 CommonController로 옮겨보자

기존 HomeController

@RequestMapping(value = "/create", method = RequestMethod.GET)
public String create(Locale locale, Model model) {
	DB db = new DB<Memo>(".../memo.db", "memo");
	
	if (db.open()) {
		if (db.createTable(new Memo())) {
			model.addAttribute("message", "테이블이 생성되었습니다.");
		} else {
			model.addAttribute("message", "테이블 생성에 실패하였습니다.");
		}
		db.close();
	} else {
		model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
	}
	
	return "message";
}

// insert
@RequestMapping(value = "/insert", method = RequestMethod.GET)
public String insert(Locale locale, Model model, HttpServletRequest request) {
	try {
		request.setCharacterEncoding("UTF-8");
	} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	}
	
	DB db = new DB<Memo>(".../memo.db", "memo");
	
	if (db.open()) {
		if (request.getParameter("title") != null
				&& request.getParameter("memo") != null
				&& db.insertData(new Memo(request.getParameter("title"), request.getParameter("memo")))) {				
			model.addAttribute("message", "새 데이터를 추가했습니다.");
		} else {
			model.addAttribute("message", "데이터 추가에 실패했습니다.");
		}
		db.close();
	} else {
		model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
	}
	
	return "message";
}

@RequestMapping(value = "/update", method = RequestMethod.GET)
public String update(Locale locale, Model model, HttpServletRequest request) {
	try {
		request.setCharacterEncoding("UTF-8");
	} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	}

	DB db = new DB<Memo>(".../memo.db", "memo");
	
	if (db.open()) {
		if (request.getParameter("idx") != null && DB.isIntegerString(request.getParameter("idx"))
				&& request.getParameter("title") != null
				&& request.getParameter("memo") != null
				&& db.updateData(new Memo(Integer.parseInt(request.getParameter("idx"))
						, request.getParameter("title"), request.getParameter("memo")))) {				
			model.addAttribute("message", "데이터를 수정했습니다.");
		} else {
			model.addAttribute("message", "데이터 수정에 실패했습니다.");
		}
		db.close();
	} else {
		model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
	}
	
	return "message";
}	

 

CommonController

DB db = new DB(new Memo());
DB db2 = new DB(new People());

// create table
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String create(Locale locale, Model model) {		
	if (db.open()) {
		if (db.createTable()) {
			model.addAttribute("message", "테이블이 생성되었습니다.");
		} else {
			model.addAttribute("message", "테이블 생성에 실패하였습니다.");
		}
		db.close();
	} else {
		model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
	}
	
	return "message";
}

// 이런식으로 DB를 2개 만들어 2개 이상의 테이블을 사용할 수 있다.
@RequestMapping(value = "/create2", method = RequestMethod.GET)
public String create2(Locale locale, Model model) {		
	if (db2.open()) {
		if (db2.createTable()) {
			model.addAttribute("message", "테이블이 생성되었습니다.");
		} else {
			model.addAttribute("message", "테이블 생성에 실패하였습니다.");
		}
		db2.close();
	} else {
		model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
	}
	
	return "message";
}

// insert
@RequestMapping(value = "/insert", method = RequestMethod.GET)
public String insert(Locale locale, Model model, HttpServletRequest request) {
	try {
		request.setCharacterEncoding("UTF-8");
	} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	}
	
	if (db.open()) {
		if (db.insertData(request)) {				
			model.addAttribute("message", "새 데이터를 추가했습니다.");
		} else {
			model.addAttribute("message", "데이터 추가에 실패했습니다.");
		}
		db.close();
	} else {
		model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
	}
	
	return "message";
}

//update
@RequestMapping(value = "/update", method = RequestMethod.GET)
public String update(Locale locale, Model model, HttpServletRequest request) {
	try {
		request.setCharacterEncoding("UTF-8");
	} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	}
	
	if (db.open()) {
		if (db.updateData(request)) {				
			model.addAttribute("message", "데이터를 수정했습니다.");
		} else {
			model.addAttribute("message", "데이터 수정에 실패했습니다.");
		}
		db.close();
	} else {
		model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
	}
	
	return "message";
}

DB db = new DB(new Memo());
DB db2 = new DB(new People());

전역 변수로 빼놓고, DB 객체에 있는 DB 파일 디렉토리와 테이블 명을 사용할거다.

 

3. 이에 맞춰 DB 클래스 파일도 수정한다

기존 DB

// create table
public boolean createTable(T t) {
	Class<?> dataClass = t.getClass();
	Field[] dataClassFields = dataClass.getDeclaredFields();
	
	String fieldString = "";
	
	for (Field field: dataClassFields) {
		String fieldName = field.getName();
		String fieldType = field.getType().toString();
        
        if (!fieldString.isEmpty()) {
			fieldString = fieldString + ",";
		}
		fieldString = fieldString + fieldName;
		if (fieldName.matches("idx")) {
			fieldString = fieldString + " INTEGER PRIMARY KEY AUTOINCREMENT";
		} else if (fieldType.matches("(int|long|short)")) {
			fieldString = fieldString + " INTEGER";
		} else if (fieldType.matches("(float|double)")) {
			fieldString = fieldString + " REAL";
		} else if (fieldType.matches(".*String")) {
			fieldString = fieldString + " TEXT";
		}
	}
	
	String query = "CREATE TABLE " + this.tableName + " (" + fieldString + ")";
	try {
		Statement statement = this.connection.createStatement();
		statement.executeUpdate(query);
		statement.close();
		return true;
	} catch (SQLException e) {
		e.printStackTrace();
	}
	return false;
}

 

새 DB

// 파라미터 없는 생성자 추가
public DB() {
	
}

// dbfileName이랑 tableName을 HomeController가 new Memo()만 넣어서 보내면 Memo 객체 내에 입력된 정보를 사용하도록 변경.
public DB(T t) {
	this.t = t;

	Class<?> dataClass = t.getClass();
	Field[] dataClassFields = dataClass.getDeclaredFields();

	for (Field field : dataClassFields) {
		String fieldName = field.getName();
		String fieldType = field.getType().toString();
		try {
			if (fieldName.matches("DB_FILE_NAME")) {
			this.dbFileName = field.get(t).toString();
		} else if (fieldName.matches("TABLE_NAME")) {
				this.tableName = field.get(t).toString();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

// create table
public boolean createTable() {
	Class<?> dataClass = t.getClass();
	Field[] dataClassFields = dataClass.getDeclaredFields();
	
	String fieldString = "";
	String dbFileName = "";
	String tableName = "";
	
	for (Field field: dataClassFields) {
		String fieldName = field.getName();
		String fieldType = field.getType().toString();

		try {
			if (fieldName.matches("DB_FILE_NAME")) {
				dbFileName = field.get(t).toString();
				continue;
			} else if (fieldName.matches("TABLE_NAME")) {
				tableName = field.get(t).toString();
				continue;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		
		if (!fieldString.isEmpty()) {
			fieldString = fieldString + ",";
		}			
		fieldString = fieldString + fieldName;
		if (fieldName.matches("idx")) {
			fieldString = fieldString + " INTEGER PRIMARY KEY AUTOINCREMENT";
		} else if (fieldType.matches("(int|long)")) {
			fieldString = fieldString + " INTEGER";
		} else if (fieldType.matches("(float|double)")) {
			fieldString = fieldString + " REAL";
		} else if (fieldType.matches(".*String")) {
			fieldString = fieldString + " TEXT";
		}
	}
	
	String query = "CREATE TABLE " + tableName + " (" + fieldString + ")";
	try {
		this.open(dbFileName);
		Statement statement = this.connection.createStatement();
		statement.executeUpdate(query);
		statement.close();
		this.close();
		return true;
	} catch (SQLException e) {
		e.printStackTrace();
		this.close();
	}
	return false;
}

생성자가 2개 추가되었고(객체에서 직접 DB 파일 디렉토리와 테이블 명을 읽어오기 위해서), 

각 쿼리 실행 메소드 안에

String dbFileName = "";
String tableName = "";

변수를 생성하고, DB파일과 테이블 정보를 추가하기 위해 for each문 안에 다음 로직이 추가되었다.

try {
	if (fieldName.matches("DB_FILE_NAME")) {
		dbFileName = field.get(t).toString();
		continue;
	} else if (fieldName.matches("TABLE_NAME")) {
		tableName = field.get(t).toString();
		continue;
	}
} catch (Exception e) {
	e.printStackTrace();
	return false;
}

 

insert와 update도 아래와 같이 수정해준다.

public boolean insertData(HttpServletRequest request) {
	Class<?> dataClass = t.getClass();
	Field[] dataClassFields = dataClass.getDeclaredFields();
	
	String fieldString = "";
	String valueString = "";
	
	ArrayList<Object> preparedValue = new ArrayList<Object>();
	
	for (Field field: dataClassFields) {
		String fieldName = field.getName();
		String fieldType = field.getType().toString();
		
		if (fieldName.matches("idx")) {
			continue;
		}
		
		// 입력된 데이터가 비어있고(null), fieldName이 created, update가 아니라면 다음 for문으로 넘어가라.
		// 입력된 데이터가 비어있지 않거나, 비어 있더라도 fieldName이 created 또는 updated면 아래 로직을 계속 실행하라.
		if (request.getParameter(fieldName) == null && !fieldName.matches("(created|updated)")) {
			continue;
		}
		// 기존에 HomeController에서 했던 숫자 데이터 체크를 request를 그대로 받아 이곳에서 한다.
		if (fieldType.matches("(int|long|short)") && !this.isIntegerString(request.getParameter(fieldName))) {
			return false;
		} else if (fieldType.matches("(float|double)") && !this.isFloatString(fieldName)) {
			return false;
		}
		
		// 2번째 for문 돌 때부터 ','를 추가
		if (!fieldString.isEmpty()) {
			fieldString = fieldString + ",";
		}
		if (!valueString.isEmpty()) {
			valueString = valueString + ",";
		}
		fieldString = fieldString + fieldName;
		valueString = valueString + "?";
		
		if (fieldName.matches("created")) {	// DB 컬럼명이 'created'일 때
			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Date date = new Date(System.currentTimeMillis());	// java.util.Date;
			preparedValue.add(formatter.format(date));
		} else if (fieldName.matches("updated")) {	// DB 컬럼명이 'updated'일 때
			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Date date = new Date(System.currentTimeMillis());	// java.util.Date;
			preparedValue.add(formatter.format(date));
		} else {
			preparedValue.add(request.getParameter(fieldName));
		}
	}
	
	String query = "INSERT INTO " + this.tableName + " (" + fieldString + ") VALUES(" + valueString + ")";
	try {
		this.open();
		PreparedStatement statement = this.connection.prepareStatement(query);
		for (int i = 0; i < preparedValue.size(); i++) {
			statement.setObject(i + 1, preparedValue.get(i));
		}
		statement.executeUpdate();
		statement.close();
		this.close();
		return true;
	} catch (SQLException e) {
		e.printStackTrace();
		this.close();
	}
	return false;
}


public boolean updateData(HttpServletRequest request) {
	Class<?> dataClass = t.getClass();
	Field[] dataClassFields = dataClass.getDeclaredFields();
	String setString = "";
	String whereString = "";
	
	ArrayList<Object> preparedValue = new ArrayList<Object>();
	
	for (Field field : dataClassFields) {
		String fieldName = field.getName();
		String fieldType = field.getType().toString();
		
		// 입력된 데이터가 비어있고(null), fieldName이 created, update가 아니라면 다음 for문으로 넘어가라.
					// 입력된 데이터가 비어있지 않거나, 비어 있더라도 fieldName이 updated면 아래 로직을 계속 실행하라.
		if (request.getParameter(fieldName) == null && !fieldName.matches("(updated)")) {
			continue;
		}
		// 기존에 HomeController에서 했던 숫자 데이터 체크를 request를 그대로 받아 이곳에서 한다.
		if (fieldType.matches("(int|long|short)") && !this.isIntegerString(request.getParameter(fieldName))) {
			return false;
		} else if (fieldType.matches("(float|double)") && !this.isFloatString(fieldName)) {
			return false;
		}
		
		if (!setString.isEmpty()) {
			setString = setString + ",";
		}
	
		try {
			if (fieldName.matches("idx")) {
				whereString = "idx=" + request.getParameter("idx");
				continue;
			} else if (fieldName.matches("updated")) {	// DB 컬럼명이 'updated'일 때
				SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date date = new Date(System.currentTimeMillis());	// java.util.Date;
				preparedValue.add(formatter.format(date));
			} else {
				preparedValue.add(request.getParameter(fieldName));
			}
			setString = setString + fieldName + "=?";
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	String query = "UPDATE " + this.tableName + " SET " + setString + " WHERE " + whereString;
	try {
		this.open();
		PreparedStatement statement = this.connection.prepareStatement(query);
		for (int i = 0; i < preparedValue.size(); i++) {
			statement.setObject(i + 1, preparedValue.get(i));
		}
		statement.executeUpdate();
		statement.close();
		this.close();
		return true;
	} catch (SQLException e) {
		e.printStackTrace();
		this.close();
	}
	return false;
}

 

위 수정한 로직 중에서 

// 입력된 데이터가 비어있고(null), fieldName이 created, update가 아니라면 다음 for문으로 넘어가라.
// 입력된 데이터가 비어있지 않거나, 비어 있더라도 fieldName이 created 또는 updated면 아래 로직을 계속 실행하라.
if (request.getParameter(fieldName) == null && !fieldName.matches("(created|updated)")) {
	continue;
}

// update에서는 create는 아래 조건에서 빼도록 한다.
if (request.getParameter(fieldName) == null && !fieldName.matches("(updated)")) {
	continue;
}

// 기존에 HomeController에서 했던 숫자 데이터 체크를 request를 그대로 받아 이곳에서 한다.
if (fieldType.matches("(int|long|short)") && !this.isIntegerString(request.getParameter(fieldName))) {
	return false;
} else if (fieldType.matches("(float|double)") && !this.isFloatString(fieldName)) {
	return false;
}

created, updated 컬럼 데이터를 처리하기 위한 로직과, 기존에 HomeController에서 했던 숫자 컬럼에 들어온 데이터 값이 숫자형식이 맞는지 체크하는 로직을 이곳으로 옮긴 것에 주목한다.

만약 저기에 memo를 null값 허용으로 처리하게 된다면, title은 필수로 들어와야하지만 memo는 null값이어도 쿼리를 정상 수행하겠다는의미다.

 

insert 테스트 URL

http://localhost:8099/memo/insert?title=안녕하세요&memo=
http://localhost:8099/memo/insert?title=또만났군요&memo=새롭게 바뀌었습니다.
http://localhost:8099/memo/insert?title=&memo=null값 허용도 됩니다.

update 테스트 URL

http://localhost:8099/memo/update?title=수정이&memo=잘됩니다&idx=3

 

 

 

전체 코드

더보기

HomeController.java

package com.kopo.memo;

import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.swing.text.html.HTMLDocument.HTMLReader.IsindexAction;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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);
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		DB db = new DB<Memo>("/Users/saebyul/SqliteDB/0916memo.db", "memo");
		
		model.addAttribute("test", new Memo());	// jsp파일. 즉, HTML에서 객체를 사용하기 위해 test라는 변수에 담아 넘겨준다.
		
//		Memo memo = new Memo();
//	    memo.setIdx(10);
//	    System.out.println(memo.getIdx());
		
		if (db.open()) {
			ArrayList<Memo> list = db.selectData(new Memo());
			model.addAttribute("list", list);
			db.close();
		}
		return "home";
	}
	
//	@RequestMapping(value = "/create", method = RequestMethod.GET)
//	public String create(Locale locale, Model model) {
//		DB db = new DB<Memo>("/Users/saebyul/SqliteDB/0916memo.db", "memo");
//		
//		if (db.open()) {
//			if (db.createTable(new Memo())) {
//				model.addAttribute("message", "테이블이 생성되었습니다.");
//			} else {
//				model.addAttribute("message", "테이블 생성에 실패하였습니다.");
//			}
//			db.close();
//		} else {
//			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
//		}
//		
//		return "message";
//	}

	// insert를 위해 사용
	@RequestMapping(value = "/i1", method = RequestMethod.GET)
	public String i1(Locale locale, Model model) {
		return "i1";
	}
	// insert
//	@RequestMapping(value = "/insert", method = RequestMethod.GET)
//	public String insert(Locale locale, Model model, HttpServletRequest request) {
//		try {
//			request.setCharacterEncoding("UTF-8");
//		} catch (UnsupportedEncodingException e) {
//			e.printStackTrace();
//		}
//		
//		DB db = new DB<Memo>("/Users/saebyul/SqliteDB/0916memo.db", "memo");
//		
//		if (db.open()) {
//			if (request.getParameter("title") != null
//					&& request.getParameter("memo") != null
//					&& db.insertData(new Memo(request.getParameter("title"), request.getParameter("memo")))) {				
//				model.addAttribute("message", "새 데이터를 추가했습니다.");
//			} else {
//				model.addAttribute("message", "데이터 추가에 실패했습니다.");
//			}
//			db.close();
//		} else {
//			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
//		}
//		
//		return "message";
//	}
	
	// select
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String select(Locale locale, Model model) {
		DB db = new DB<Memo>("/Users/saebyul/SqliteDB/0916memo.db", "memo");
		
		if (db.open()) {
			String htmlString = db.selectStringData(new Memo());
			model.addAttribute("list", htmlString);
			db.close();
		}
		
		return "list";
	}
	
	// update를 위해 사용
	@RequestMapping(value = "/u1", method = RequestMethod.GET)
	public String u1(Locale locale, Model model, HttpServletRequest request) {
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		DB db = new DB<Memo>("/Users/saebyul/SqliteDB/0916memo.db", "memo");
		
		if (db.open()) {
			if (request.getParameter("idx") != null && DB.isIntegerString(request.getParameter("idx"))) {
				Memo memo = (Memo) db.selectData(Integer.parseInt(request.getParameter("idx")), new Memo());
				model.addAttribute("idx", memo.idx);
				model.addAttribute("title", memo.title);
				model.addAttribute("memo", memo.memo);
			} else {
				model.addAttribute("message", "데이터 추가에 실패했습니다.");
			}
			db.close();
		} else {
			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
		}
		return "u1";
	}
	
	//update
//	@RequestMapping(value = "/update", method = RequestMethod.GET)
//	public String update(Locale locale, Model model, HttpServletRequest request) {
//		try {
//			request.setCharacterEncoding("UTF-8");
//		} catch (UnsupportedEncodingException e) {
//			e.printStackTrace();
//		}
//		
////			if (request.getParameter("idx") == null) {
////				model.addAttribute("message", "입력 데이터가 잘못 되었습니다.");
////				return "message";
////			}
//		
//		DB db = new DB<Memo>("/Users/saebyul/SqliteDB/0916memo.db", "memo");
//		
//		if (db.open()) {
//			if (request.getParameter("idx") != null && DB.isIntegerString(request.getParameter("idx"))
//					&& request.getParameter("title") != null
//					&& request.getParameter("memo") != null
//					&& db.updateData(new Memo(Integer.parseInt(request.getParameter("idx"))
//							, request.getParameter("title"), request.getParameter("memo")))) {				
//				model.addAttribute("message", "데이터를 수정했습니다.");
//			} else {
//				model.addAttribute("message", "데이터 수정에 실패했습니다.");
//			}
//			db.close();
//		} else {
//			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
//		}
//		
//		return "message";
//	}	
}

 

CommonController.java

package com.kopo.memo;

import java.io.UnsupportedEncodingException;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

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

@Controller
public class CommonController {
	
	DB db = new DB(new Memo());
	DB db2 = new DB(new People());
	
	// create table
	@RequestMapping(value = "/create", method = RequestMethod.GET)
	public String create(Locale locale, Model model) {		
		if (db.open()) {
			if (db.createTable()) {
				model.addAttribute("message", "테이블이 생성되었습니다.");
			} else {
				model.addAttribute("message", "테이블 생성에 실패하였습니다.");
			}
			db.close();
		} else {
			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
		}
		
		return "message";
	}
	
	// 이런식으로 DB를 2개 만들어 2개 이상의 테이블을 사용할 수 있다.
	@RequestMapping(value = "/create2", method = RequestMethod.GET)
	public String create2(Locale locale, Model model) {		
		if (db2.open()) {
			if (db2.createTable()) {
				model.addAttribute("message", "테이블이 생성되었습니다.");
			} else {
				model.addAttribute("message", "테이블 생성에 실패하였습니다.");
			}
			db2.close();
		} else {
			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
		}
		
		return "message";
	}
	
	// insert
	@RequestMapping(value = "/insert", method = RequestMethod.GET)
	public String insert(Locale locale, Model model, HttpServletRequest request) {
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		if (db.open()) {
			if (db.insertData(request)) {				
				model.addAttribute("message", "새 데이터를 추가했습니다.");
			} else {
				model.addAttribute("message", "데이터 추가에 실패했습니다.");
			}
			db.close();
		} else {
			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
		}
		
		return "message";
	}
	
	// update
	@RequestMapping(value = "/update", method = RequestMethod.GET)
	public String update(Locale locale, Model model, HttpServletRequest request) {
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
	//		if (request.getParameter("idx") == null) {
	//			model.addAttribute("message", "입력 데이터가 잘못 되었습니다.");
	//			return "message";
	//		}
		
		if (db.open()) {
			if (db.updateData(request)) {				
				model.addAttribute("message", "데이터를 수정했습니다.");
			} else {
				model.addAttribute("message", "데이터 수정에 실패했습니다.");
			}
			db.close();
		} else {
			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
		}
		
		return "message";
	}
}

 

DB.java

package com.kopo.memo;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.sqlite.SQLiteConfig;

public class DB<T> {
	private String dbFileName;
	private String tableName;
	private Connection connection;
	private T t;
	static {
		try {
			Class.forName("org.sqlite.JDBC");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	// 파라미터 없는 생성자 추가
	public DB() {
		
	}
	
	// dbfileName이랑 tableName을 HomeController가 new Memo()만 넣어서 보내면 Memo 객체 내에 입력된 정보를 사용하도록 변경.
	public DB(T t) {
		this.t = t;
	
		Class<?> dataClass = t.getClass();
		Field[] dataClassFields = dataClass.getDeclaredFields();
	
		for (Field field : dataClassFields) {
			String fieldName = field.getName();
			String fieldType = field.getType().toString();
			try {
				if (fieldName.matches("DB_FILE_NAME")) {
				this.dbFileName = field.get(t).toString();
			} else if (fieldName.matches("TABLE_NAME")) {
					this.tableName = field.get(t).toString();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public DB(String dbFileName, String tableName) {
		this.dbFileName = dbFileName;
		this.tableName = tableName;
	}

	public boolean open() {
		SQLiteConfig config = new SQLiteConfig();
		try {
			this.connection = DriverManager.getConnection("jdbc:sqlite:/" + this.dbFileName, config.toProperties());
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}
	
	// 파라미터를 받아서 open하는거 생성
	public boolean open(String dbFileName) {
		SQLiteConfig config = new SQLiteConfig();
		try {
			this.connection = DriverManager.getConnection("jdbc:sqlite:/" + this.dbFileName, config.toProperties());
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}
	
	public void close() {
		if (this.connection != null) {
			try {
				this.connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
//	public void createTable() {
//		String fieldString = "";
//		fieldString = fieldString + "idx INT PRIMARY KEY AUTOINCREMENT";
//		fieldString = fieldString + ", name TEXT";
//		fieldString = fieldString + ", middleScore INT";
//		fieldString = fieldString + ", finalScore INT";
//		String query = "CREATE TABLE " + this.tableName + " (" + fieldString + ")";
//		try {
//			Statement statement = this.connection.createStatement();
//			statement.executeUpdate(query);
//			statement.close();
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//	}
	
//	public boolean createTable(T t) {
//		Class<?> dataClass = t.getClass();
//		Field[] dataClassFields = dataClass.getDeclaredFields();
//		
//		String fieldString = "";
//		
//		for (Field field: dataClassFields) {
//			if (!fieldString.isEmpty()) {
//				fieldString = fieldString + ",";
//			}
//			String fieldName = field.getName();
//			String fieldType = field.getType().toString();
//			fieldString = fieldString + fieldName;
//			if (fieldName.matches("idx")) {
//				fieldString = fieldString + " INTEGER PRIMARY KEY AUTOINCREMENT";
//			} else if (fieldType.matches("(int|long|short)")) {
//				fieldString = fieldString + " INTEGER";
//			} else if (fieldType.matches("(float|double)")) {
//				fieldString = fieldString + " REAL";
//			} else if (fieldType.matches(".*String")) {
//				fieldString = fieldString + " TEXT";
//			}
//		}
//		
//		String query = "CREATE TABLE " + this.tableName + " (" + fieldString + ")";
//		try {
//			Statement statement = this.connection.createStatement();
//			statement.executeUpdate(query);
//			statement.close();
//			return true;
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		return false;
//	}
	
	// 여기도 변경
//	public boolean createTable(T t) {
//		Class<?> dataClass = t.getClass();
//		Field[] dataClassFields = dataClass.getDeclaredFields();
//		
//		String fieldString = "";
//		String dbFileName = "";
//		String tableName = "";
//		
//		for (Field field: dataClassFields) {
//			String fieldName = field.getName();
//			String fieldType = field.getType().toString();
//			try {
//				if (fieldType.matches("DB_FILE_NAME")) {
//					dbFileName = field.get(t).toString();
//					continue;
//				} else if (fieldType.matches("TABLE_NAME")) {
//					tableName = field.get(t).toString();
//					continue;
//				}
//			} catch (Exception e) {
//				e.printStackTrace();
//				return false;
//			}
//			
//			if (!fieldString.isEmpty()) {
//				fieldString = fieldString + ",";
//			}			
//			fieldString = fieldString + fieldName;
//			if (fieldName.matches("idx")) {
//				fieldString = fieldString + " INTEGER PRIMARY KEY AUTOINCREMENT";
//			} else if (fieldType.matches("(int|long)")) {
//				fieldString = fieldString + " INTEGER";
//			} else if (fieldType.matches("(float|double)")) {
//				fieldString = fieldString + " REAL";
//			} else if (fieldType.matches(".*String")) {
//				fieldString = fieldString + " TEXT";
//			}
//		}
//		
//		String query = "CREATE TABLE " + tableName + " (" + fieldString + ")";
//		try {
//			this.open(dbFileName);
//			Statement statement = this.connection.createStatement();
//			statement.executeUpdate(query);
//			statement.close();
//			this.close();
//			return true;
//		} catch (SQLException e) {
//			e.printStackTrace();
//			this.close();
//		}
//		return false;
//	}
	
	public boolean createTable() {
		Class<?> dataClass = t.getClass();
		Field[] dataClassFields = dataClass.getDeclaredFields();
		
		String fieldString = "";
		String dbFileName = "";
		String tableName = "";
		
		for (Field field: dataClassFields) {
			String fieldName = field.getName();
			String fieldType = field.getType().toString();
	
			try {
				if (fieldName.matches("DB_FILE_NAME")) {
					dbFileName = field.get(t).toString();
					continue;
				} else if (fieldName.matches("TABLE_NAME")) {
					tableName = field.get(t).toString();
					continue;
				}
			} catch (Exception e) {
				e.printStackTrace();
				return false;
			}
			
			if (!fieldString.isEmpty()) {
				fieldString = fieldString + ",";
			}			
			fieldString = fieldString + fieldName;
			if (fieldName.matches("idx")) {
				fieldString = fieldString + " INTEGER PRIMARY KEY AUTOINCREMENT";
			} else if (fieldType.matches("(int|long)")) {
				fieldString = fieldString + " INTEGER";
			} else if (fieldType.matches("(float|double)")) {
				fieldString = fieldString + " REAL";
			} else if (fieldType.matches(".*String")) {
				fieldString = fieldString + " TEXT";
			}
		}
		
		String query = "CREATE TABLE " + tableName + " (" + fieldString + ")";
		try {
			this.open(dbFileName);
			Statement statement = this.connection.createStatement();
			statement.executeUpdate(query);
			statement.close();
			this.close();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			this.close();
		}
		return false;
	}
	
//	public void insertData(Student student) {
//		String fieldString = "";
//		fieldString = fieldString + "name";
//		fieldString = fieldString + ", middleScore";
//		fieldString = fieldString + ", finalScore";
//		String valueString = "";
//		valueString = valueString + "'" + student.name + "'";
//		valueString = valueString + ", " + student.middleScore;
//		valueString = valueString + ", " + student.finalScore;
//		String query = "INSERT INTO " + this.tableName + " (" + fieldString + ") VALUES(" + valueString + ")";
//		try {
//			Statement statement = this.connection.createStatement();
//			statement.executeUpdate(query);
//			statement.close();
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//	}
	
//	public boolean insertData(T t) {
//		Class<?> dataClass = t.getClass();
//		Field[] dataClassFields = dataClass.getDeclaredFields();
//		
//		String fieldString = "";
//		String valueString = "";
//
//		for (Field field: dataClassFields) {
//			String fieldName = field.getName();
//			String fieldType = field.getType().toString();
//			if (fieldName.matches("idx")) {
//				continue;
//			}
//			if (!fieldString.isEmpty()) {
//				fieldString = fieldString + ",";
//			}
//			if (!valueString.isEmpty()) {
//				valueString = valueString + ",";
//			}
//			fieldString = fieldString + fieldName;
//			try {
//				if (fieldType.matches(".*String")) {
//					valueString = valueString + "'" + field.get(t) + "'";
//				} else {
//					valueString = valueString + field.get(t);
//				}
//			} catch (IllegalArgumentException e) {
//				e.printStackTrace();
//			} catch (IllegalAccessException e) {
//				e.printStackTrace();
//			}
//		}
//		
//		String query = "INSERT INTO " + this.tableName + " (" + fieldString + ") VALUES(" + valueString + ")";
//		try {
//			Statement statement = this.connection.createStatement();
//			statement.executeUpdate(query);
//			statement.close();
//			return true;
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		return false;
//	}
	
	public boolean insertData(HttpServletRequest request) {
		Class<?> dataClass = t.getClass();
		Field[] dataClassFields = dataClass.getDeclaredFields();
		
		String fieldString = "";
		String valueString = "";
		
		ArrayList<Object> preparedValue = new ArrayList<Object>();
		
		for (Field field: dataClassFields) {
			String fieldName = field.getName();
			String fieldType = field.getType().toString();
			
			if (fieldName.matches("idx")) {
				continue;
			}
			
			// 입력된 데이터가 비어있고(null), fieldName이 created, update가 아니라면 다음 for문으로 넘어가라.
			// 입력된 데이터가 비어있지 않거나, 비어 있더라도 fieldName이 created 또는 updated면 아래 로직을 계속 실행하라.
			if (request.getParameter(fieldName) == null && !fieldName.matches("(created|updated)")) {
				continue;
			}
			// 기존에 HomeController에서 했던 숫자 데이터 체크를 request를 그대로 받아 이곳에서 한다.
			if (fieldType.matches("(int|long|short)") && !this.isIntegerString(request.getParameter(fieldName))) {
				return false;
			} else if (fieldType.matches("(float|double)") && !this.isFloatString(fieldName)) {
				return false;
			}
			
			// 2번째 for문 돌 때부터 ','를 추가
			if (!fieldString.isEmpty()) {
				fieldString = fieldString + ",";
			}
			if (!valueString.isEmpty()) {
				valueString = valueString + ",";
			}
			fieldString = fieldString + fieldName;
			valueString = valueString + "?";
			
			if (fieldName.matches("created")) {	// DB 컬럼명이 'created'일 때
				SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date date = new Date(System.currentTimeMillis());	// java.util.Date;
				preparedValue.add(formatter.format(date));
			} else if (fieldName.matches("updated")) {	// DB 컬럼명이 'updated'일 때
				SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date date = new Date(System.currentTimeMillis());	// java.util.Date;
				preparedValue.add(formatter.format(date));
			} else {
				preparedValue.add(request.getParameter(fieldName));
			}
		}
		
		String query = "INSERT INTO " + this.tableName + " (" + fieldString + ") VALUES(" + valueString + ")";
		try {
			this.open();
			PreparedStatement statement = this.connection.prepareStatement(query);
			for (int i = 0; i < preparedValue.size(); i++) {
				statement.setObject(i + 1, preparedValue.get(i));
			}
			statement.executeUpdate();
			statement.close();
			this.close();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			this.close();
		}
		return false;
	}

//	public void updateData(int idx, String memo) {
//		String setString = "memo='" + memo + "'";
//		String whereString = "idx=" + idx;
//		String query = "UPDATE " + this.tableName + " SET " + setString + " WHERE " + whereString;
//		try {
//			Statement statement = this.connection.createStatement();
//			statement.executeUpdate(query);
//			statement.close();
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//	}
	
//	public boolean updateData(T t) {
//		Class<?> dataClass = t.getClass();
//		Field[] dataClassFields = dataClass.getDeclaredFields();
//		String setString = "";
//		String whereString = "";
//		for (Field field : dataClassFields) {
//			if (!setString.isEmpty()) {
//				setString = setString + ",";
//			}
//			String fieldName = field.getName();
//			String fieldType = field.getType().toString();
//			try {
//				if (fieldName.matches("idx")) {
//					whereString = "idx=" + field.get(t);
//				} else if (fieldType.matches(".*String")) {
//					setString = setString + fieldName + "=" + "'" + field.get(t) + "'";
//				} else {
//					setString = setString + fieldName + "=" + field.get(t);
//				}
//			} catch (IllegalArgumentException e) {
//				e.printStackTrace();
//			} catch (IllegalAccessException e) {
//				e.printStackTrace();
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
//		}
//		
//		String query = "UPDATE " + this.tableName + " SET " + setString + " WHERE " + whereString;
//		try {
//			Statement statement = this.connection.createStatement();
//			statement.executeUpdate(query);
//			statement.close();
//			return true;
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		return false;
//	}

	public boolean updateData(HttpServletRequest request) {
		Class<?> dataClass = t.getClass();
		Field[] dataClassFields = dataClass.getDeclaredFields();
		String setString = "";
		String whereString = "";
		
		ArrayList<Object> preparedValue = new ArrayList<Object>();
		
		for (Field field : dataClassFields) {
			String fieldName = field.getName();
			String fieldType = field.getType().toString();
			
			// 입력된 데이터가 비어있고(null), fieldName이 created, update가 아니라면 다음 for문으로 넘어가라.
						// 입력된 데이터가 비어있지 않거나, 비어 있더라도 fieldName이 updated면 아래 로직을 계속 실행하라.
			if (request.getParameter(fieldName) == null && !fieldName.matches("(updated)")) {
				continue;
			}
			// 기존에 HomeController에서 했던 숫자 데이터 체크를 request를 그대로 받아 이곳에서 한다.
			if (fieldType.matches("(int|long|short)") && !this.isIntegerString(request.getParameter(fieldName))) {
				return false;
			} else if (fieldType.matches("(float|double)") && !this.isFloatString(fieldName)) {
				return false;
			}
			
			if (!setString.isEmpty()) {
				setString = setString + ",";
			}
		
			try {
				if (fieldName.matches("idx")) {
					whereString = "idx=" + request.getParameter("idx");
					continue;
				} else if (fieldName.matches("updated")) {	// DB 컬럼명이 'updated'일 때
					SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
					Date date = new Date(System.currentTimeMillis());	// java.util.Date;
					preparedValue.add(formatter.format(date));
				} else {
					preparedValue.add(request.getParameter(fieldName));
				}
				setString = setString + fieldName + "=?";
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		String query = "UPDATE " + this.tableName + " SET " + setString + " WHERE " + whereString;
		try {
			this.open();
			PreparedStatement statement = this.connection.prepareStatement(query);
			for (int i = 0; i < preparedValue.size(); i++) {
				statement.setObject(i + 1, preparedValue.get(i));
			}
			statement.executeUpdate();
			statement.close();
			this.close();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			this.close();
		}
		return false;
	}
	
//	public String selectData() {
//		String query = "SELECT * FROM " + this.tableName;
//		String htmlTxt = "";
//		try {
//			Statement statement = this.connection.createStatement();
//			ResultSet result = statement.executeQuery(query);
//			while(result.next()) {
//				htmlTxt = htmlTxt + "<tr>";
//				htmlTxt = htmlTxt + "<td>" + result.getInt("idx") + "</td>";
//				htmlTxt = htmlTxt + "<td>" + result.getString("name") + "</td>";
//				htmlTxt = htmlTxt + "<td>" + result.getInt("middleScore") + "</td>";
//				htmlTxt = htmlTxt + "<td>" + result.getInt("finalScore") + "</td>";
//				htmlTxt = htmlTxt + "</tr>";
//			}
//			result.close();
//			statement.close();
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		return htmlTxt;
//	}
	
	public String selectStringData(T t) {
		Class<?> dataClass = t.getClass();
		Field[] dataClassFields = dataClass.getDeclaredFields();

		String query = "SELECT * FROM " + this.tableName;
		ArrayList<T> resultDataSet = new ArrayList<T>(); 
		try {
			Statement statement = this.connection.createStatement();
			ResultSet result = statement.executeQuery(query);
			while(result.next()) {
				T rowData = (T)dataClass.getDeclaredConstructor().newInstance();

				for(Field field : dataClassFields) {
					String fieldName = field.getName();
					String fieldType = field.getType().toString();
						
					if (fieldType.matches("(int)")) {
						field.setInt(rowData, result.getInt(fieldName));
					} else if (fieldType.matches("(long)")) {
						field.setLong(rowData, result.getLong(fieldName));
					} else if (fieldType.matches("(float|double)")) {
						field.setDouble(rowData, result.getDouble(fieldName));
					} else if (fieldType.matches(".*String")) {
						field.set(rowData, result.getString(fieldName));
					}
				}
				resultDataSet.add(rowData);
			}
			result.close();
			statement.close();

			Method toHtmlStringMethod = dataClass.getDeclaredMethod("toHtmlString");
			StringBuffer htmlString = new StringBuffer();
			for (T row : resultDataSet) {
				htmlString.append((String) toHtmlStringMethod.invoke(row));
			}
			return htmlString.toString();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	
	public ArrayList<T> selectData(T t) {
		Class<?> dataClass = t.getClass();
		Field[] dataClassFields = dataClass.getDeclaredFields();

		String query = "SELECT * FROM " + this.tableName;
		ArrayList<T> resultDataSet = new ArrayList<T>(); 
		try {
			Statement statement = this.connection.createStatement();
			ResultSet result = statement.executeQuery(query);
			while(result.next()) {
				T rowData = (T)dataClass.getDeclaredConstructor().newInstance();

				for(Field field : dataClassFields) {
					String fieldName = field.getName();
					String fieldType = field.getType().toString();
						
					if (fieldType.matches("(int)")) {
						field.setInt(rowData, result.getInt(fieldName));
					} else if (fieldType.matches("(long)")) {
						field.setLong(rowData, result.getLong(fieldName));
					} else if (fieldType.matches("(float|double)")) {
						field.setDouble(rowData, result.getDouble(fieldName));
					} else if (fieldType.matches(".*String")) {
						field.set(rowData, result.getString(fieldName));
					}
				}
				resultDataSet.add(rowData);
			}
			result.close();
			statement.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return resultDataSet;
	}
	
	public T selectData(int idx, T t) {
		Class<?> dataClass = t.getClass();
		Field[] dataClassFields = dataClass.getDeclaredFields();

		String query = "SELECT * FROM " + this.tableName + " WHERE idx=" + idx;
		try {
			Statement statement = this.connection.createStatement();
			ResultSet result = statement.executeQuery(query);
			T rowData = (T)dataClass.getDeclaredConstructor().newInstance();
			if(result.next()) {
				for(Field field : dataClassFields) {
					String fieldName = field.getName();
					String fieldType = field.getType().toString();
						
					if (fieldType.matches("(int)")) {
						field.setInt(rowData, result.getInt(fieldName));
					} else if (fieldType.matches("(long)")) {
						field.setLong(rowData, result.getLong(fieldName));
					} else if (fieldType.matches("(float|double)")) {
						field.setDouble(rowData, result.getDouble(fieldName));
					} else if (fieldType.matches(".*String")) {
						field.set(rowData, result.getString(fieldName));
					}
				}
			}
			result.close();
			statement.close();
			
			return rowData;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return (T)(new Object());
	}
	
	
	
	public static boolean isIntegerString(String numericString) {
		try {
			int result = Integer.parseInt(numericString);
			return true;
		} catch (Exception e) {
		}
		return false;
	}

	public static boolean isFloatString(String numericString) {
		try {
			double result = Double.parseDouble(numericString);
			return true;
		} catch (Exception e) {
		}
		return false;
	}
}

 

Memo.java

package com.kopo.memo;

public class Memo {
	public int idx;
	public String title;
	public String memo;
	public String created;
	public String updated;
	
	public final String DB_FILE_NAME = "/Users/saebyul/SqliteDB/0916memo2.db";
	public final String TABLE_NAME = "memo";
	
	public Memo() {
		
	}
	
	public Memo(String title, String memo) {
		this.title = title;
		this.memo = memo;
	}
	
	public Memo(int idx, String title, String memo) {
		this.idx = idx;
		this.title = title;
		this.memo = memo;
	}
	
	public String toHtmlString() {
		StringBuffer htmlString = new StringBuffer();
		htmlString.append("<tr>");
		htmlString.append("<td>" + this.idx + "</td>");
		htmlString.append("<td>" + this.title + "</td>");
		htmlString.append("<td>" + this.memo + "</td>");
		htmlString.append("<td>" + "<a href=u1?idx=" + this.idx + ">상세보기</a>" + "</td>");
		htmlString.append("</tr>");
		
		return htmlString.toString();
	}

	public int getIdx() {
		return idx;
	}

	public void setIdx(int idx) {
		this.idx = idx;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getMemo() {
		return memo;
	}

	public void setMemo(String memo) {
		this.memo = memo;
	}

	public String getCreated() {
		return created;
	}

	public void setCreated(String created) {
		this.created = created;
	}

	public String getUpdated() {
		return updated;
	}

	public void setUpdated(String updated) {
		this.updated = updated;
	}
}

 

People.java

package com.kopo.memo;

public class People {
	public int idx;
	public String name;
	public String phone;
	public String created;
	public String updated;
	
	public final String DB_FILE_NAME = "/Users/saebyul/SqliteDB/0916memo2.db";
	public final String TABLE_NAME = "people";

}

 

home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>

<!DOCTYPE html>
  <head>
	<title>Home</title>
  </head>
  <body>
    <h1>
	  Hello world!  
    </h1>
    <%
    int a = 10;
    int b = 5;
    int c = a + b;
    
    
    // jsp 안에 java코드 사용(이제는 하지 말 것)
    // jstl : jsp에서 태그 <> 형태로 제공하는 기능 (jsp 기반)(한국은 아직 여기...)
    // thymeleaf (<html> 기반) (spring boot 기본 방식 가장 최신이고 표준이다.)
    
    %>
    <P> axb+c=<%=a*b+c %>. </P> <!-- 대문자로 써도 되긴 하지만 html 표준은 태그를 소문자로 사용한다. <p> 이런식으로 사용 -->
    
    <!-- test라는 변수가 HomeController에게 Memo라는 객체를 넘겨 받아 그 객체의 title, memo 안에 원하는 value를 넣는다. -->
    <c:set target="${test }" property="title" value="야호호호"></c:set>
    <c:set target="${test }" property="memo" value="코로나야끝나라아아아"></c:set>
    <p> title :  <c:out value="${test.title }"></c:out> </p>
    <p> memo :  <c:out value="${test.memo }"></c:out> </p>
    
     <table style="width: 100%;">
      <tbody>
        <c:forEach var="each" items="${list }">
          <tr>
            <td>${each.getIdx() }</td>                        <!-- getter를 쓸 수도 있고, -->
            <td>${each.title }</td>                           <!-- c:out 태그를 생략하고 사용할 수도 있다. (편리!) -->
            <td><c:out value="${each.memo }"></c:out></td>    <!-- Full로 쓰면 c:out 태그를 넣어야 한다. -->
            <td><a href="u1?idx=${each.idx }">수정하기</a>
          </tr>
        </c:forEach>
      </tbody>
    </table>
        
  </body>
</html>

  

i1.jsp

<%@ 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>
    <form action="insert">
      <input type="text" placeholder="title" name="title" />
      <textarea name="memo" style="width: 100%;"></textarea>
      <input type="submit" value="입력 완료" />
    </form>
    <br /><br />
    <a href="list" style="padding: 10px 20px; background: #eee;">리스트로</a>
  </body>
</html>

  

list.jsp

<%@ 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>
    <table style="width: 100%;">
      <thead>
        <tr>
        <th>idx</th>
        <th>title</th>
        <th>memo</th>
        <th></th>
      </thead>
      ${list }
    </table>
    <a href="i1" style="padding: 10px 20px; background: #eee;">글쓰기</a>
  </body>
</html>

 

message.jsp

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

<head>
	<title>Message</title>
</head>
<body>

<P>${message}</P>
</body>
</html>

 

u1.jsp

<%@ 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>
    <form action="update">
      <input type="hidden" name="idx" value="${idx }" />
      <input type="text" placeholder="title" name="title" value="${title }"/>
      <textarea name="memo" style="width: 100%;">${memo }</textarea>
      <input type="submit" value="수정 완료" />
    </form>
    <br /><br />
    <a href="list" style="padding: 10px 20px; background: #eee;">리스트로</a>
  </body>
</html>

  

 

 

+ Recent posts