[๊ตฌ๋์์นด๋ฐ๋ฏธ IT๊ตญ๋น์ง์] ๊ธฐ๋ณธํค์ ์ธ๋ํค, ์ง๊ณํจ์, HashMap ์ ๋ํด ๋ฐฐ์ฐ๊ณ ์ด๋ฅผ ์ด์ฉํ์ฌ ์นดํ
๊ณ ๋ฆฌ๋ณ ๊ฒ์ํ์ ๊ตฌํํด๋ณด๋ ์๊ฐ์ ๊ฐ์ก๋ค.
๊ธฐ๋ณธ ํค(primary key)๋ ์ฃผ ํค ๋๋ ํ๋ผ์ด๋จธ๋ฆฌ ํค๋ผ๊ณ ํ๋ฉฐ, ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐ(๋ ์ฝ๋)์ ์๋ณ์๋ก ์ด์ฉํ๊ธฐ์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ๊ด๊ณ (ํ ์ด๋ธ)๋ง๋ค ๋จ ํ ์ค๊ณ์์ ์ํด ์ ํ, ์ ์๋ ํ๋ณด ํค๋ฅผ ๋งํ๋ค.
์ถ์ฒ: ์ํค๋ฐฑ๊ณผ
์ธ๋ ํค๋ ์ฐธ์กฐํ๋ ํ ์ด๋ธ์์ 1๊ฐ์ ํค(์์ฑ ๋๋ ์์ฑ์ ์งํฉ)์ ํด๋นํ๊ณ , ์ฐธ์กฐํ๋ ์ธก์ ๊ด๊ณ ๋ณ์๋ ์ฐธ์กฐ๋๋ ์ธก์ ํ ์ด๋ธ์ ํค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ถ์ฒ: ์ํค๋ฐฑ๊ณผ
์ง๋ ์๊ฐ์ ๋ฐ์ดํฐ ํ
์ด๋ธ์ ์ ๊ทํ(๋ฐ์ดํฐ๋ชจ๋ธ๋ง)์ ๋ํด์ ์งง๊ฒ ๋ฐฐ์ ์๋ค. ์ด๋, ๋ค๋ฅธ ํ
์ด๋ธ์ ์ปฌ๋ผ๊ฐ์ด ์กด์ฌํ๋ ์ธ๋ํค(์ฐธ์กฐํค, FK)๋ ์์ ์ ํ
์ด๋ธ์์ ์ค๋ณต๋๋ ํค์ฌ์๋ ์๋๋ค. ์ฆ, ์ธ๋ํค๋ ์์ ์ ํ
์ด๋ธ์์ ๊ธฐ๋ณธํค(ํ๋ผ์ด๋จธ๋ฆฌํค, PK)์ฌ์ผํ๋ ๊ฒ์ด๋ค. ๋ํ ๋ชจ๋ ํ
์ด๋ธ์ ๊ฐ๊ฐ ๊ณ ์ ํ ๊ธฐ๋ณธํค๋ฅผ ๊ฐ์ ธ์ผํ๋ค.
์นดํ
๊ณ ๋ฆฌ๋ณ ๊ฒ์ํ์ ๋ง๋ค๊ธฐ ์ํด ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์๋ก์ด ํ
์ด๋ธ์ ์ถ๊ฐํ๋ค.
๐ local ํ
์ด๋ธ
local ํ
์ด๋ธ์ ๊ธฐ๋ณธํค๋ local_name์ด๋ค. ๋ง์ฝ local ํ
์ด๋ธ์ selectํ ๋ order by๋ฅผ ์๋ตํ๋ค๋ฉด ๊ธฐ๋ณธํค ์์ผ๋ก ์ค๋ฆ์ฐจ์ ์กฐํ๋๋ค. (ํ๊ธ์ด๋ฉด ๊ฐ->๋, ์ซ์๋ฉด 1->2) ๊ทธ๋์ ๋ง์ฝ local ํ
์ด๋ธ์ ๋ฐ์ดํฐ ์์ฑ ์์ผ๋ก ์กฐํํ๊ณ ์ถ๋ค๋ฉด ๊ธฐ๋ณธํค์ธ local_name๊ฐ ์๋๋ผ createdate๋ฅผ ๊ธฐ์ค์ผ๋ก ์กฐํํด์ผ ํ ๊ฒ์ด๋ค.
INSERT INTO local(createdate, local_name, updatedate)
VALUES(NOW(), '๋ถ์ฐ', NOW());
INSERT INTO local
VALUES('๋ถ์ฐ', NOW(), NOW());
insert๋ฌธ์ผ๋ก ๊ด๋ช
,๋๊ตฌ,๋์ ,๋ถ์ฐ,๋ถ์ฒ,์์ธ,์ฑ๋จ,์ธ์ฒ์ ์ถ๊ฐํ๋ค.
์ฃผ์ํ ์ ) insert๋ฌธ ์์ฑ์ ์ปฌ๋ผ๋ช
์ ์๋ตํ๋ ค๋ฉด ๋ฐ๋์ values๊ฐ์ ์์๋๋ก ์์ฑํด์ผ ํ๋ค!
๐ board ํ
์ด๋ธ
board ํ
์ด๋ธ์ ๊ธฐ๋ณธํค๋ board_no์ด๋ค. ๊ธฐ๋ณธ๊ฐ์ผ๋ก AUTO-INCRMENT๋ฅผ ์ค์ ์ค๋ณต๋์ง ์๋ ์ซ์๋ฅผ ๋ถ์ฌํ๋ค. local_name๊ณผ member_id๋ ์ธ๋ํค์ด๋ค. ์ด ์ธ๋ํค๋ค์ ๊ฐ ํ
์ด๋ธ์ ๊ธฐ๋ณธํค์ผ ๊ฒ์ด๋ค.
CREATE TABLE `board` (
`board_no` INT(11) NOT NULL AUTO_INCREMENT,
`local_name` VARCHAR(50) NOT NULL COLLATE 'utf8_general_ci',
`board_title` VARCHAR(200) NOT NULL COLLATE 'utf8_general_ci',
`board_content` TEXT NOT NULL COLLATE 'utf8_general_ci',
`member_id` VARCHAR(50) NOT NULL COLLATE 'utf8_general_ci',
`createdate` DATETIME NOT NULL,
`updatedate` DATETIME NOT NULL,
PRIMARY KEY (`board_no`) USING BTREE,
INDEX `FK_local` (`local_name`) USING BTREE,
INDEX `FK_member` (`member_id`) USING BTREE,
CONSTRAINT `FK_local` FOREIGN KEY (`local_name`) REFERENCES `userboard`.`local` (`local_name`) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT `FK_member` FOREIGN KEY (`member_id`) REFERENCES `userboard`.`member` (`member_id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1001
;
CREATE ์ฝ๋์์ ์์ธํ ์ฟผ๋ฆฌ๋ฅผ ํ์ธํด๋ณผ ์ ์๋ค. (DDL)
๊ธฐ์กด member ํ
์ด๋ธ์ ์ํ๋ฐ์ดํฐ๋ฅผ ์์ฑํด์ ์ถ๊ฐํ๋ค.
์ง๊ณํจ์๋ COUNT, SUM, AVG(ํ๊ท ๊ฐ), MAX, MIN ๋ฑ ๋ง๊ทธ๋๋ก ์ฌ๋ฌ๊ฐ์ ์ ๋ ฅ๊ฐ์ ๋ชจ์์ ํ๋์ ๊ฐ์ ์ถ๋ ฅํ๋ ํจ์๋ฅผ ๋งํ๋ค. ์ด์ค count ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ์์ฑ๋ ๊ฒ์๊ธ์ด ๋ช๊ฐ์ธ์ง ์ฆ, local_name ์นผ๋ผ๋ณ๋ก ์ค๋ณต๋ ๋ฐ์ดํฐ๊ฐ ๋ช๊ฐ์ธ์ง ์ถ๋ ฅํด์ค ์ ์์ ๊ฒ์ด๋ค.
DISTINCT๋ ์ค๋ณต์ ๊ฑฐ ํค์๋์ด๋ค.
SELECT COUNT(DISTINCT local_name) FROM board;
local_name์ ๋ฐ์ดํฐ๊ฐ 8ํ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ณต๋๋ ๊ฐ์ ๋ชจ๋ ์ ๊ฑฐํ ๋ค ์นด์ดํธ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ค๋ณต์ ์ ๊ฑฐํ์ฌ ์นผ๋ผ์ ์ถ๋ ฅํ ์๋ ์์ง๋ง, ์ค๋ณต๋๋ ๊ฐ์ด ๋ช๊ฐ์ฉ์ธ์ง๋ ์ ์๊ฐ ์๋ค.
GROUP BY๋ ๋ง๊ทธ๋๋ก ๊ทธ๋ฃน์ ๋ฌถ์ด ์ปฌ๋ผ๋ณ๋ก ์ง๊ณ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
SELECT local_name, COUNT(local_name) FROM board GROUP BY local_name;
์นผ๋ผ๋ช
์ด ์ค๋ณต๋์ด์ ์ถ๋ ฅ๋์ง ์์๊ณ , ๊ฐ ์นผ๋ผ๋ง๋ค ์ค๋ณต๋๋ ๊ฐ์ด ๋ช๊ฐ์ธ์ง๋ ์ถ๋ ฅ๋์๋ค. ํ์ง๋ง GROUP BY๋ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ธ ๊ฐ์ ์๋ ์ถ๋ ฅํ ์ ์์ง๋ง (๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ง ์์) ์ ์ฒด์ ๊ฐฏ์๋ ์ถ๋ ฅ๋์ง ์๋๋ค.
UNION ALL์ ํฉ์งํฉ์ ๋ปํ๋ค. ์ฆ, ๋ ์ฟผ๋ฆฌ๋ฅผ ์๋ก ํฉ์ณ์ค๋ค. ์ฌ์ฉ์ ์ปฌ๋ผ๋ช ์(AS) ์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ผ๊ฐ๋ค.
SELECT '์ ์ฒด' localName, COUNT(local_name) cnt FROM board
UNION ALL
SELECT local_name, COUNT(local_name) FROM board GROUP BY local_name;
์ด๋ ๊ฒ ์ ์ฒด์ ์๋ ์นด์ดํธํ๋ ์ฟผ๋ฆฌ์ ํฉ์ณ์ฃผ๋ฉด ์ ์ฒด์ ๊ฐฏ์๋ ๊ฐ์ด ์ถ๋ ฅํ ์ ์์ ๊ฒ์ด๋ค. ์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ๊ฐ ์ ์ฒด๋ฅผ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ฒซ๋ฒ์งธ ํ์ ์ถ๋ ฅ๋์๋ค. ์ด๋ ์ฃผ์ํ ์ ์ ์ฟผ๋ฆฌ๋ฅผ ํฉ์น ๋์๋ ๋ ํ
์ด๋ธ์ ๋ชจ์์ด ๊ฐ์์ผํ๋ค. ์ฆ, '์ ์ฒด'๋ผ๋ ์นผ๋ผ๋ช
์ ์ถ๊ฐ๋ก ๋ฃ์ด์ ํ
์ด๋ธ์ ๋ชจ์์ ๋ง์ถฐ์ฃผ์ด์ผ ์๋ฌ๊ฐ ๋์ง ์๋๋ค.
WITH ROLLUP๋ GROUP BY์ ํ์ฅ์ ๋ก GROUP BY๋์ง ์์ ๊ฒฐ๊ณผ(์ฆ, ์ ์ฒด ์ง๊ณํจ์์ ๊ฒฐ๊ณผ)๋ ๊ฐ์ด ์ถ๋ ฅ๋๊ฒ ํ๋ค. ํ์ง๋ง ํ์ค๋ฐฉ๋ฒ์ด ์๋์ด์ DB๋ง๋ค ์ ๊ณต๋์ง ์์ ์๋ ์๋ค.
SELECT local_name, COUNT(local_name) FROM board
GROUP BY local_name WITH ROLLUP;
GROUP BY์ ๋ค์ ๋ถ์ฌ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ํ์ง๋ง ์ปฌ๋ผ๋ช
์ด NULL๊ฐ์ผ๋ก ์ถ๋ ฅ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋ํ, UNION ALL๊ณผ ๋ค๋ฅด๊ฒ ๊ทธ๋ฃน๋์ง ์์ ์ ์ฒด ์ง๊ณํจ์์ ๊ฒฐ๊ณผ๋ ๋งจ ๋ง์ง๋ง ํ์ ์ถ๋ ฅ๋๊ฒ ๋๋ค.
IFNULL(X,Y) ํจ์๋ X์ ๊ฐ์ด NULL๊ฐ์ด๋ฉด Y๋ก ์ถ๋ ฅํ๋ค. WITH ROLLUP ์ฌ์ฉ์์ ๊ฐ์ด ์ฌ์ฉํ๋ค๋ฉด NULL๊ฐ์ด ์๋ ์ง์ ํ ์ปฌ๋ผ๋ช ์ผ๋ก ์ถ๋ ฅํ ์ ์์ ๊ฒ์ด๋ค.
SELECT IFNULL(local_name, '์ ์ฒด'), COUNT(local_name)
FROM board GROUP BY local_name WITH ROLLUP;
NULL๊ฐ์ด์๋ ์นผ๋ผ๋ช
์ด ์ง์ ํ '์ ์ฒด'๋ก ์ถ๋ ฅ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
select์ ์ปฌ๋ผ๊ฐ ์ธ ๋ค๋ฅธ ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด ์ด๋ ๊ฒ ๊ฐ์ ์ถ๊ฐํด์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
SELECT local_name localName, '๋ํ๋ฏผ๊ตญ' conuntry,'๊นํฌ์ง' worker
FROM local
LIMIT 0, 1
ํนํ ์์์ UNION ALL์ ์ฌ์ฉํ์๋ ํ ์ด๋ธ์ ๋ชจ์์ ๋ง์ถ๊ธฐ์ํด ์กด์ฌํ์ง ์๋ '์ ์ฒด'๋ผ๋ ์ปฌ๋ผ์ ์ถ๊ฐํด์ ์์ฑํด์ผํ ๋์ฒ๋ผ ๋ง์ด๋ค.
ํ์ง๋ง ์ด ์ฟผ๋ฆฌ๋ฅผ ์๋ฐ์์ ์ถ๋ ฅํ ๋์๋ ๊ธฐ๋ณธ์ ์ธ vo ํด๋์ค์ ์กด์ฌํ์ง ์๋ ์นผ๋ผ์ด๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ์๋ก์ด vo(์ผํ์ฉ vo)๋ฅผ ๊ณ์ํด์ ๋ง๋ค์ด์ผํ๋๋ฐ, ์ด๋ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค. ๊ทธ๋์ ์ด๋ด ๋ ์ธ ์ ์๋ ์๋ฐ ํ์ ์ค์ ์์ vo์ฒ๋ผ ์ฌ์ฉ๊ฐ๋ฅํ map์ด ์กด์ฌํ๋ค. ๊ทธ ์ค hashmap์ ์ฌ์ฉํด๋ณด์!
HashMap<ํค ์ด๋ฆ์ ํ์
, ๊ฐ์ ํ์
> ์ผ๋ก ์์ฑํ๊ณ , HashMap์ ๋ฐ๋ก vo ํด๋์ค๋ฅผ ๋ง๋ค ํ์ ์์ด ๋ฐ๋ก ํค ์ด๋ฆ์ ์ง์ ํด์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ปฌ๋ผ๊ฐ ์ธ ๋ค๋ฅธ ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ ์ถ๋ ฅํ๊ณ ์ถ์ ๋ ๋งค์ฐ ์ ์ฉํ๋ค! ์ด๋ ๊ฐ์ ํ์
์ Object๋ก ๋ฃ์ผ๋ฉด ๋ชจ๋ ํ์
์ด ๋ค์ด์ฌ ์ ์์ผ๋, ์ถ๋ ฅ์์ ํ๋ณํ์ ํด์ฃผ์ด์ผํ๋ค.
๐ localListByMap.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "java.util.*" %> <!-- Hashmap ์์น -->
<%
//๋๋ผ์ด๋ฒ ๋ก๋ฉ ๋ฐ db ์ ์
String driver = "org.mariadb.jdbc.Driver";
String dburl = "jdbc:mariadb://127.0.0.1:3306/userboard";
String dbuser = "****";
String dbpw = "****";
Class.forName(driver);
Connection conn = DriverManager.getConnection(dburl, dbuser, dbpw);
PreparedStatement stmt = null;
ResultSet rs = null;
// 1) ํ ํ๋ง ์ถ๋ ฅ (limit ์ฌ์ฉ)
// SELECT local_name localName, '๋ํ๋ฏผ๊ตญ' conuntry, '๊นํฌ์ง' worker FROM local LIMIT 0,1
String sql = "SELECT local_name localName, '๋ํ๋ฏผ๊ตญ' conuntry, '๊นํฌ์ง' worker FROM local LIMIT 0,1";
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
// Vo๋์ HachMapํ์
์ ์ฌ์ฉ
HashMap<String, Object> map = null;
if(rs.next()) { // ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด(true) map์ ์ ์ฅ๋ ๊ฒ
// ๋๋ฒ๊น
/* System.out.println(rs.getString("localName"));
System.out.println(rs.getString("conuntry"));
System.out.println(rs.getString("worker")); */
map = new HashMap<String, Object>();
map.put("localName", rs.getString("localName"));
map.put("conuntry", rs.getString("conuntry"));
map.put("worker", rs.getString("worker"));
}
// ๋๋ฒ๊น
System.out.println((String)map.get("localName")); // Objectํ์
์ผ๋ก ์ง์ ํ์ผ๋ฏ๋ก ์ถ๋ ฅ์ Stringํ์
์ผ๋ก ํ๋ณํ
System.out.println((String)map.get("conuntry"));
System.out.println((String)map.get("worker"));
// 2) ์ฌ๋ฌํ์ ์ถ๋ ฅ (limit ์ฌ์ฉx)
PreparedStatement stmt2 = null;
ResultSet rs2 = null;
String sql2 = "SELECT local_name localName, '๋ํ๋ฏผ๊ตญ' conuntry, '๊นํฌ์ง' worker FROM local";
stmt2 = conn.prepareStatement(sql2);
rs2 = stmt2.executeQuery();
// HashMap์ด ์ฌ๋ฌ๊ฐ ํ์ํ๋ฏ๋ก ArrayList๋ฅผ ์ฌ์ฉํ๋ค
ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
// ArrayList๋ฅผ ๋ฐ๋ณต๋ฌธ(while)์ ์ด์ฉํ์ฌ HashMap์ ๊ฐ ๋ฃ๊ธฐ
while(rs2.next()) {
HashMap<String, Object> m = new HashMap<String, Object>();
m.put("localName", rs2.getString("localName"));
m.put("conuntry", rs2.getString("conuntry"));
m.put("worker", rs2.getString("worker"));
list.add(m);
}
// 3) ์นดํ
๊ณ ๋ฆฌ(local) ์ค๋ณต๋๋ ๋ฐ์ดํฐ ์ ํ์ํ๊ธฐ
// SELECT local_name localName, COUNT(local_name) cnt FROM board GROUP by local_name
PreparedStatement stmt3 = null;
ResultSet rs3 = null;
String sql3 = "SELECT local_name localName, COUNT(local_name) cnt FROM board GROUP by local_name";
stmt3 = conn.prepareStatement(sql3);
rs3 = stmt3.executeQuery();
// HashMap์ด ์ฌ๋ฌ๊ฐ ํ์ํ๋ฏ๋ก ArrayList๋ฅผ ์ฌ์ฉํ๋ค
ArrayList<HashMap<String, Object>> list3 = new ArrayList<HashMap<String, Object>>();
// ArrayList๋ฅผ ๋ฐ๋ณต๋ฌธ(while)์ ์ด์ฉํ์ฌ HashMap์ ๊ฐ ๋ฃ๊ธฐ
while(rs3.next()) {
HashMap<String, Object> m = new HashMap<String, Object>();
m.put("localName", rs3.getString("localName"));
m.put("cnt", rs3.getInt("cnt"));
list3.add(m);
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>localListByMap.jsp</title>
</head>
<body>
<div>
<h2>rs1 ๊ฒฐ๊ณผ์
</h2>
<%=map.get("localName")%>
<%=map.get("conuntry")%>
<%=map.get("worker")%>
</div>
<br>
<h2>rs2 ๊ฒฐ๊ณผ์
</h2>
<table>
<tr>
<th>localName</th>
<th>conuntry</th>
<th>worker</th>
</tr>
<%
for(HashMap<String, Object> m : list) {
%>
<tr>
<td><%=m.get("localName")%></td>
<td><%=m.get("conuntry")%></td>
<td><%=m.get("worker")%></td>
</tr>
<%
}
%>
</table>
<br>
<h2>rs3 ๊ฒฐ๊ณผ์
</h2>
<ul>
<li>
<a href="">์ ์ฒด</a>
</li>
<%
for(HashMap<String, Object> m : list3) {
%>
<li>
<a href="">
<%=(String)m.get("localName")%>(<%=(Integer)m.get("cnt")%>)
</a>
</li>
<%
}
%>
</ul>
</body>
</html>
๊ฐ์ ๋ฃ์ ๋์๋ put ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ , ์ด๋ ํค์ด๋ฆ์ ์ง์ ํ ์ ์๋ค.
์ฌ๋ฌํ์ ์ถ๋ ฅํ ๋์๋ VOํ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ArrayList๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Objectํ์ ์ผ๋ก ์ง์ ํ์ผ๋ฏ๋ก ์ถ๋ ฅ์ Stringํ์ ์ผ๋ก ํ๋ณํํด์ผํ๋ ๊ฒ ์์ง๋ง๊ธฐ
๐ ๊ฒฐ๊ณผ
์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ ๋ฒ ์๊ฐ์ ๋ง๋ home.jsp๋ฅผ ์์ ํ์๋ค.
โ ๊ตฌํํด์ผํ ์
๐ ์์ฑ - Board.java
package vo;
public class Board {
public int boardNo;
public String localName;
public String boardTitle;
public String boardContent;
public String memberId;
public String createdate;
public String updatedate;
}
๐ ์์ฑ - home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "java.util.*" %> <!-- HashMap ์ฌ์ฉ -->
<%@ page import = "vo.*" %>
<%
//๋๋ผ์ด๋ฒ ๋ก๋ฉ ๋ฐ db ์ ์
String driver = "org.mariadb.jdbc.Driver";
String dburl = "jdbc:mariadb://127.0.0.1:3306/userboard";
String dbuser = "****";
String dbpw = "****";
Class.forName(driver);
Connection conn = DriverManager.getConnection(dburl, dbuser, dbpw);
PreparedStatement stmt = null;
ResultSet rs = null;
// 1) ์๋ธ๋ฉ๋ด๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ ์ฟผ๋ฆฌ ์์ฑ
// ์ ์ฒด์ ๊ฐ localName์ count๋ฅผ ์กฐํํ๊ธฐ ์ํด ์ฟผ๋ฆฌ๋ฅผ ํฉ์นจ(UNION ALL ์ฌ์ฉ)
/*
SELECT '์ ์ฒด' localName, COUNT(local_name) cnt FROM board
UNION ALL
SELECT local_name, COUNT(local_name) FROM board GROUP BY local_name
*/
String subMenuSql = "SELECT '์ ์ฒด' localName, COUNT(local_name) cnt FROM board UNION ALL SELECT local_name, COUNT(local_name) FROM board GROUP BY local_name";
PreparedStatement subMenuStmt = conn.prepareStatement(subMenuSql);
ResultSet subMenuRs = subMenuStmt.executeQuery();
// HashMap์ ArrayList์ ๋ฃ๊ธฐ
ArrayList<HashMap<String, Object>> subMenuList = new ArrayList<HashMap<String, Object>>();
while(subMenuRs.next()) {
HashMap<String, Object> m = new HashMap<String, Object>();
m.put("localName", subMenuRs.getString("localName"));
m.put("cnt", subMenuRs.getInt("cnt"));
subMenuList.add(m);
}
// 2) ์นดํ
๊ณ ๋ฆฌ ๋ณ ๊ฒ์๊ธ 5๊ฐ์ฉ ์ถ๋ ฅ
// ์์ฒญ๊ฐ ๊ฒ์ฌ
System.out.println(request.getParameter("localName") + " <- home param localName");
String localName = "์ ์ฒด"; // null์ด๋ฉด ์ ์ฒด
if(request.getParameter("localName") != null) {
localName = request.getParameter("localName");
}
System.out.println(localName + " <- home localName");
// ์ฟผ๋ฆฌ ์์ฑ
// ๊ธฐ๋ณธ(์ ์ฒด ์กฐํ) ์ฟผ๋ฆฌ
String sql = "SELECT board_no boardNo, board_title boardTitle, local_name localName FROM board";
// localName ์ ํ ์ ์ถ๊ฐ๋๋ ์ฟผ๋ฆฌ
String localNameSql = " WHERE local_name = ?";
// limit ์ฟผ๋ฆฌ
String limitSql = " LIMIT 0, 5";
if(localName.equals("์ ์ฒด") || localName.equals("")) {
sql = sql + limitSql;
stmt = conn.prepareStatement(sql);
} else {
sql = sql + localNameSql + limitSql;
stmt = conn.prepareStatement(sql);
stmt.setString(1, localName);
}
System.out.println(stmt + " <- home sql");
rs = stmt.executeQuery();
// ์ผ๋ฐ์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝ ArrayList
ArrayList<Board> localNameList = new ArrayList<Board>();
while(rs.next()) {
Board b = new Board();
b.boardNo = rs.getInt("boardNo");
b.localName = rs.getString("localName");
b.boardTitle = rs.getString("boardTitle");
localNameList.add(b);
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>home.jsp</title>
<!-- ๋ถํธ์คํธ๋ฉ5 ์ฌ์ฉ -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div><!-- ๋ฉ์ธ๋ฉ๋ด(๊ฐ๋ก) -->
<jsp:include page="/inc/mainmenu.jsp"></jsp:include>
</div>
<div class="container mt-5">
<!-- ํ๋ด์ฉ : ๋ก๊ทธ์ธํผ(๋ก๊ทธ์ธ ์ํ์๋๋ง), ์นดํ
๊ณ ๋ฆฌ๋ณ ๊ฒ์๊ธ 5๊ฐ์ฉ -->
<div><!-- ๋ก๊ทธ์ธํผ -->
<%
if(session.getAttribute("loginMemberId") == null) { // ์ธ์
์ id๊ฐ์ด null์ด๋ฉด ๋ก๊ทธ์ธ ํผ ์ถ๋ ฅ
%>
<h3 class="mt-4">๋ก๊ทธ์ธ</h3>
<div class="text-danger">
<% // msg ๋ฐ์์ ์ถ๋ ฅ
if(request.getParameter("msg") != null) {
%>
<%=request.getParameter("msg")%>
<%
}
%>
</div>
<form action="<%=request.getContextPath()%>/member/loginAction.jsp" method="post">
<table>
<tr>
<td>์์ด๋</td>
<td>
<input type="text" name="memberId">
</td>
</tr>
<tr>
<td>ํจ์ค์๋</td>
<td>
<input type="password" name="memberPw">
</td>
</tr>
</table>
<button type="submit" class="btn btn-success">๋ก๊ทธ์ธ</button>
</form>
<%
}
%>
</div>
<br>
<div class="row">
<div class="col-sm-4"><!-- ์๋ธ๋ฉ๋ด(์ธ๋ก) subMenuList๋ชจ๋ธ์ ์ถ๋ ฅ -->
<h3 class="mt-4">์นดํ
๊ณ ๋ฆฌ</h3>
<ul class="nav nav-pills flex-column">
<%
for(HashMap<String, Object> m : subMenuList) {
%>
<li class="nav-item">
<a href="<%=request.getContextPath()%>/home.jsp?localName=<%=(String)m.get("localName")%>" class="nav-link">
<%=(String)m.get("localName")%>(<%=(Integer)m.get("cnt")%>)
<!-- ๊ฐํ์
์ด Objectํ์
์ด๋ฏ๋ก ํ๋ณํ -->
</a>
</li>
<%
}
%>
</ul>
</div>
<div class="col-sm-8"><!-- ์นดํ
๊ณ ๋ฆฌ๋ณ ๊ฒ์๊ธ 5๊ฐ์ฉ -->
<h3 class="mt-4">๊ฒ์ํ</h3>
<table class="table">
<thead class="table-success">
<tr>
<th>์นดํ
๊ณ ๋ฆฌ</th>
<th>์ ๋ชฉ</th>
</tr>
</thead>
<tbody>
<%
for(Board b : localNameList) {
%>
<tr>
<td><%=b.localName%></td>
<td><%=b.boardTitle%></td>
</tr>
<%
}
%>
</tbody>
</table>
</div>
</div>
</div>
<br>
<div>
<!-- include ํ์ด์ง : Copyright © ๊ตฌ๋์์นด๋ฐ๋ฏธ -->
<%
// request.getRequestDispatcher(request.getContextPath()+"./inc/copyright.jsp").include(request, response);
// ์์ฃผ ์ฐ์ง๋ง ๋๋ฌด ๊ธธ๋ค. ๊ทธ๋์ ์ก์
ํ๊ทธ๋ฅผ ํ์ฉํ๋ค!
%>
<jsp:include page="/inc/copyright.jsp"></jsp:include> <!-- ์ก์
ํ๊ทธ -->
</div>
</body>
</html>
๐ ์ถ๋ ฅ
์ฒซ ํ๋ฉด์ localName๊ฐ - ์ ์ฒด
์นดํ
๊ณ ๋ฆฌ localName๊ฐ ๋ถ์ฒ ์ ํ์