[๊ตฌ๋””์•„์นด๋ฐ๋ฏธ 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 ํ™œ์šฉํ•˜๊ธฐ

์ง‘๊ณ„ํ•จ์ˆ˜๋Š” COUNT, SUM, AVG(ํ‰๊ท ๊ฐ’), MAX, MIN ๋“ฑ ๋ง๊ทธ๋Œ€๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž…๋ ฅ๊ฐ’์„ ๋ชจ์•„์„œ ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ์ด์ค‘ count ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ์ž‘์„ฑ๋œ ๊ฒŒ์‹œ๊ธ€์ด ๋ช‡๊ฐœ์ธ์ง€ ์ฆ‰, local_name ์นผ๋Ÿผ๋ณ„๋กœ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡๊ฐœ์ธ์ง€ ์ถœ๋ ฅํ•ด์ค„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

โœ” DISTINCT

DISTINCT๋Š” ์ค‘๋ณต์ œ๊ฑฐ ํ‚ค์›Œ๋“œ์ด๋‹ค.

SELECT COUNT(DISTINCT local_name) FROM board;

local_name์˜ ๋ฐ์ดํ„ฐ๊ฐ€ 8ํ–‰์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต๋˜๋Š” ๊ฐ’์€ ๋ชจ๋‘ ์ œ๊ฑฐํ•œ ๋’ค ์นด์šดํŠธ๋œ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ค‘๋ณต์€ ์ œ๊ฑฐํ•˜์—ฌ ์นผ๋Ÿผ์„ ์ถœ๋ ฅํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์ค‘๋ณต๋˜๋Š” ๊ฐ’์ด ๋ช‡๊ฐœ์”ฉ์ธ์ง€๋Š” ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค.

โœ” GROUP BY

GROUP BY๋Š” ๋ง๊ทธ๋Œ€๋กœ ๊ทธ๋ฃน์„ ๋ฌถ์–ด ์ปฌ๋Ÿผ๋ณ„๋กœ ์ง‘๊ณ„๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

SELECT local_name, COUNT(local_name) FROM board GROUP BY local_name;


์นผ๋Ÿผ๋ช…์ด ์ค‘๋ณต๋˜์–ด์„œ ์ถœ๋ ฅ๋˜์ง€ ์•Š์•˜๊ณ , ๊ฐ ์นผ๋Ÿผ๋งˆ๋‹ค ์ค‘๋ณต๋˜๋Š” ๊ฐ’์ด ๋ช‡๊ฐœ์ธ์ง€๋„ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ GROUP BY๋Š” ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์ธ ๊ฐ’์˜ ์ˆ˜๋Š” ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ (๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์ด์ง€ ์•Š์€) ์ „์ฒด์˜ ๊ฐฏ์ˆ˜๋Š” ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

โœ” UNION ALL

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

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

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๊ฐ’์ด์—ˆ๋˜ ์นผ๋Ÿผ๋ช…์ด ์ง€์ •ํ•œ '์ „์ฒด'๋กœ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ’ก HashMap

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๋ฅผ ์ˆ˜์ •ํ•˜์˜€๋‹ค.

โœ” ๊ตฌํ˜„ํ•ด์•ผํ•  ์ 

  • ์นดํ…Œ๊ณ ๋ฆฌ(์ „์ฒด ํฌํ•จ) ๋ณ„๋กœ ๋“ฑ๋ก๋œ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜ ํ‘œ์‹œํ•˜๊ธฐ -> ์„œ๋ธŒ๋ฉ”๋‰ด
    (UNION ALL๊ณผ GROUP BY์ ˆ ์ด์šฉ, HashMap ํ™œ์šฉ)
  • ์นดํ…Œ๊ณ ๋ฆฌ ํด๋ฆญ ์‹œ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๊ฒŒ์‹œ๊ธ€(localName,boardTitle) 5๊ฐœ์”ฉ ์ถœ๋ ฅํ•˜๊ธฐ, ์ฒซํ™”๋ฉด์€ ์ „์ฒด ๊ฒŒ์‹œ๊ธ€ 5๊ฐœ
    (๋™์ ์ฟผ๋ฆฌ ์ž‘์„ฑํ•ด์„œ WHERE์ ˆ ๋ถ„๊ธฐํ•˜๊ธฐ)
  • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์œผ๋กœ CSSํ•˜๊ธฐ

๐Ÿ“ ์ž‘์„ฑ - 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 &copy; ๊ตฌ๋””์•„์นด๋ฐ๋ฏธ -->
		<%
			// request.getRequestDispatcher(request.getContextPath()+"./inc/copyright.jsp").include(request, response);
			// ์ž์ฃผ ์“ฐ์ง€๋งŒ ๋„ˆ๋ฌด ๊ธธ๋‹ค. ๊ทธ๋ž˜์„œ ์•ก์…˜ํƒœ๊ทธ๋ฅผ ํ™œ์šฉํ•œ๋‹ค!
		%> 
		<jsp:include page="/inc/copyright.jsp"></jsp:include> <!-- ์•ก์…˜ํƒœ๊ทธ -->
	</div>
</body>
</html>

๐Ÿ“ ์ถœ๋ ฅ

์ฒซ ํ™”๋ฉด์‹œ localName๊ฐ’ - ์ „์ฒด

์นดํ…Œ๊ณ ๋ฆฌ localName๊ฐ’ ๋ถ€์ฒœ ์„ ํƒ์‹œ


profile
ํ•˜๋ฃจ ํ•œ๊ฑธ์Œ์”ฉ๐Ÿ’ช ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ ๐ŸŒฑ๐Ÿ’ป

0๊ฐœ์˜ ๋Œ“๊ธ€