๐Ÿ“…2024. 01. 11 24์ผ์ฐจ


๐ŸŽฌJDBC_AM ์‹œ์ž‘

๐Ÿ”“ ๊ฒŒ์‹œ๋ฌผ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ==> JDBC ํ™œ์šฉ

๐Ÿ’ก๋ตํ‚นํƒ€์ž„~!

  1. member join ์ฒ˜๋Ÿผ member login ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜์ง€ ์•Š์„๊นŒ??
  2. ID์„ ์ž…๋ ฅ ๋ฐ›๊ฒŒ ํ•˜๊ณ  ๋งŒ๋“ค์–ด์ง„ ID๊ฐ€ ์žˆ๋Š” ์ง€ ํ™•์ธ ํ•ด์•ผ๋จ
  3. ์ด๊ฑฐ?? ํšŒ์›๊ฐ€์ž… ํ•  ๋•Œ ๋งŒ๋“ค์–ด ๋†จ๋Š”๋ฐ?? ๊ทธ๋Ÿผ ๊ฐ€์ ธ์™€๋„ ๋˜์ง€ ์•Š์„๊นŒ?
  4. ์—†์œผ๋ฉด false๋กœ continue ์‹œ์ผœ์„œ ๋‹ค์‹œ while๋ฌธ์œผ๋กœ ์˜ฌ๋ ค๋ฒ„๋ฆฐ๋‹ค.
  5. ์žˆ์œผ๋ฉด true๋กœ ๋„˜๊ธด๋‹ค??
  6. ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ๋„ ์ด๋ฏธ ๋งŒ๋“ค์–ด๋†จ๋Š”๋ฐ? ๊ฐ€์ ธ์™€์„œ ์ˆ˜์ •ํ•˜์ž.
  7. ์œ„์— ID๋ฅผ ์ž…๋ ฅ ํ–ˆ์„ ๋•Œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์ž…๋ ฅํ•œ PW์™€ ID์˜ PW์™€ ์ผ์น˜ํ•œ์ง€ ํ™•์ธํ•ด์•ผ๋˜์ง€ ์•Š์„๊นŒ?

๐Ÿ”‘๋ฌธ์ œํ•ด๊ฒฐ~!

if (cmd.equals("member login")) {
			memberController.login();

public void login() {
		String loginId = null;
		String loginPw = null;

		System.out.println("==๋กœ๊ทธ์ธ==");
		while (true) {
			System.out.print("๋กœ๊ทธ์ธ ์•„์ด๋”” : ");
			loginId = sc.nextLine().trim();

			if (loginId.length() == 0 || loginId.contains(" ")) {
				System.out.println("์•„์ด๋”” ๋˜‘๋ฐ”๋กœ ์ž…๋ ฅํ•ด");
				continue;
			}

			boolean isLoginIdDup = memberService.isLoginIdDup(loginId);

			if (isLoginIdDup == false) {
				System.out.println(loginId + "๋Š”(์€) ์—†๋Š”๋†ˆ์ด์•ผ");
				continue;
			}

			break;
		}

		Member member = memberService.getMemberByLoginId(loginId);

		
		while (true) {
			System.out.print("๋น„๋ฐ€๋ฒˆํ˜ธ : ");
			loginPw = sc.nextLine().trim();

			if (loginPw.length() == 0 || loginPw.contains(" ")) {
				tryCount++;
				System.out.println("๋น„๋ฐ€๋ฒˆํ˜ธ ๋˜‘๋ฐ”๋กœ ์ž…๋ ฅํ•ด");
				continue;
			}

			if (member.getLoginPw().equals(loginPw) == false) {
				tryCount++;
				System.out.println("์ผ์น˜ํ•˜์ง€ ์•Š์•„");
				continue;
			}

			System.out.println(member.getName() + "๋‹˜ ํ™˜์˜");
			break;

		}
	}

    public boolean isLoginIdDup(String loginId) {
		return memberDao.isLoginIdDup(loginId);
	}
    public Member getMemberByLoginId(String loginId) {
		return memberDao.getMemberByLoginId(loginId);
	}

public Member getMemberByLoginId(String loginId) {
		SecSql sql = new SecSql();

		sql.append("SELECT *");
		sql.append("FROM `member`");
		sql.append("WHERE loginId = ?;", loginId);

		Map<String, Object> memberMap = DBUtil.selectRow(conn, sql);

		if (memberMap.isEmpty()) {
			return null;
		}

		return new Member(memberMap);
	}

	public boolean isLoginIdDup(String loginId) {
		SecSql sql = new SecSql();
		sql.append("SELECT COUNT(*) > 0");
		sql.append("FROM `member`");
		sql.append("WHERE loginId = ?;", loginId);

		return DBUtil.selectRowBooleanValue(conn, sql);
	}

๐Ÿ”๋ฌธ์ œ๋ฐœ์ƒ

  • ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ณ„์† ํ‹€๋ ค๋„ ๋ฌดํ•œ๋Œ€๋กœ ๋น„๋ฒˆ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ•ด์ง ํ™œ์šฉ์„ฑ์ด ์—†์Œ.
  • ํšŸ์ˆ˜๋ฅผ ๊ฑธ์–ด๋‘์ž???

๐Ÿ’ก๋ตํ‚นํƒ€์ž„~!

  • tryMaxCount = 3; ๊ฑธ์–ด๋‘๊ณ  tryCount = 0; ๊ฒƒ๋„ ๋งŒ๋“ค์ž
  • ์นด์šดํŠธ๋งฅ์Šค ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์‹œ ๋ช…๋ น ์ž…๋ ฅ์ฐฝ์œผ๋กœ ๋Œ๋ฆฌ์ž.

๐Ÿ”‘๋ฌธ์ œ ํ•ด๊ฒฐ

int tryMaxCount = 3;
		int tryCount = 0;

		while (true) {
			if (tryCount >= tryMaxCount) {
				System.out.println("๋‹ค์‹œ ํ™•์ธํ•˜๊ณ  ์‹œ๋„ํ•ด๋ผ");
				break;
			}

๐Ÿ”“ ๊ฒŒ์‹œ๋ฌผ member profile ๊ตฌํ˜„ ==> JDBC ํ™œ์šฉ

ํ˜„์žฌ ๋กœ๊ทธ์ธ ์ค‘์ธ ํšŒ์›์˜ ์ •๋ณด ๋‚˜์—ด

๐Ÿ”๋ฌธ์ œ๋ฐœ์ƒ

  • ๋กœ๊ทธ์ธ ํ–ˆ๋Š” ์ง€ ์•„๋ฌด๋„ ๋ชจ๋ฆ„ ๊ทธ๋ž˜์„œ ๊ณ„์† ๋กœ๊ทธ์ธ์ด ๋จ, ๋กœ๊ทธ์ธ ๋˜๋ฉด ํ˜„์žฌ ๋กœ๊ทธ์ธ ๋˜ ์žˆ๋Š” ํšŒ์›์˜ ์ •๋ณด ๋‚˜์—ด๋„ ๋‚˜์—ด๋˜๊ณ  ํ•ด์•ผํ•  ๋“ฏ.

๐Ÿ’ก๋ตํ‚นํƒ€์ž„~!

  • ์ผ๋‹จ ๋กœ๊ทธ์ธ ํ–ˆ๋Š” ์ง€ ์•ˆ ํ–ˆ๋Š” ์ง€ ๋ชจ๋ฅธ๋‹ค. ์ด๊ฑฐ ๋จผ์ € ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋“ฏ
  • ๋กœ๊ทธ์ธ ๋˜๋ฉด ํ˜„์žฌ ๋กœ๊ทธ์ธ ๋˜์–ด ์žˆ๋Š” ํšŒ์›์˜ ์ •๋ณด๋ฅผ ๋‚˜์—ด์‹œํ‚ค๋ฉด ๋  ๋“ฏ.

๐Ÿ”‘๋ฌธ์ œํ•ด๊ฒฐ~!

if (cmd.equals("member profile")) {
			memberController.showProfile();

public void showProfile() {
		if (Container.session.isLogined() == false) {
			System.out.println("๋กœ๊ทธ์ธ ํ›„ ์ด์šฉํ•ด์ค˜");
			return;
		}
		System.out.println(Container.session.loginedMember);
	}

public class Session {

	public Member loginedMember;
	public int loginedMemberId;

	public Session() {
		loginedMemberId = -1;
	}
public void login(Member member) {
		loginedMember = member;
		loginedMemberId = member.getId();
	}
  • ์ผ๋‹จ ๋กœ๊ทธ์ธ ์ƒํƒœ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์คฌ๋‹ค.
  • ๋กœ๊ทธ์ธ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉด return ์‹œํ‚ค๊ณ  ๋กœ๊ทธ์ธ ์ƒํƒœ์ด๋ฉด ํšŒ์› ์ •๋ณด ๋‚˜์—ด์‹œํ‚ค๊ฒŒ ํ–ˆ๋‹ค.

๐Ÿ”๋ฌธ์ œ๋ฐœ์ƒ

  • ๋กœ๊ทธ์ธ์ด ๊ณ„์† ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ

๐Ÿ”‘๋ฌธ์ œํ•ด๊ฒฐ~!

  • login ํ•˜๊ธฐ ์ „์— ๋งŒ์•ฝ ๋กœ๊ทธ์ธ ๋˜ ์žˆ์œผ๋ฉด ๋กœ๊ทธ์•„์›ƒ ํ•˜๊ณ  ์จ ํ•˜๊ณ  ๋ฆฌํ„ด์‹œ์ผœ์คฌ๋‹ค.
if (Container.session.isLogined()) {
			System.out.println("๋กœ๊ทธ์•„์›ƒ ํ•˜๊ณ  ์จ");
			return;
		}

๐Ÿ”“ ๊ฒŒ์‹œ๋ฌผ member logout ๊ตฌํ˜„ ==> JDBC ํ™œ์šฉ

๊ตฌํ˜„ ๋ฐฉ๋ฒ•~!

if (cmd.equals("member logout")) {
			memberController.logout();

public void logout() {
		if (Container.session.isLogined() == false) {
			System.out.println("๋กœ๊ทธ์ธ ํ›„ ์ด์šฉํ•ด์ค˜");
			return;
		}
		Container.session.logout();
	}

public void logout() {
		loginedMember = null;
		loginedMemberId = -1;
		System.out.println("๋กœ๊ทธ์•„์›ƒ ๋จ");
	}

	public boolean isLogined() {
		return loginedMemberId != -1;
	}

}

๐Ÿ”๋ฌธ์ œ๋ฐœ์ƒ

  • ์ž‘์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ๋ฅผ ๋กœ๊ทธ์ธ ์ƒํƒœ์—์„œ๋งŒ ๋˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์–ด~~

๐Ÿ”‘๋ฌธ์ œํ•ด๊ฒฐ~!

if (Container.session.isLogined() == false) {
			System.out.println("๋กœ๊ทธ์ธ ํ›„ ์ด์šฉํ•ด์ค˜");
			return;
		}
  • ์ž‘์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ์— ๋กœ๊ทธ์ธ ํ•˜๊ณ  ์“ฐ๊ฒŒ ๋” ๋งŒ๋“ค์—ˆ๋‹ค.

๐Ÿ”จarticle list ์ˆ˜์ •

  • article list์—์„œ ์ž‘์„ฑ์ž์˜ ์ด๋ฆ„์ด ๋‚˜์˜ค๋„๋ก ํ•˜๊ณ  ์‹ถ์–ด~~

๐Ÿ’ก๋ตํ‚นํƒ€์ž„~!

  • article ์ด๋ž‘ member๋ž‘ ์กฐ์ธํ•ด์„œ ๋‹ค ๊ฐ€์ ธ ์˜จ ๋‹ค์Œ์—
    ์•Œ์•„์„œ ๋ณด์—ฌ์ฃผ๊ฒŒ ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?
SELECT *
FROM article
INNER JOIN `member`
ON article.id = `member`.id
ORDER BY article.id DESC;
  • ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ž˜ ๋‚˜์˜จ๋‹ค.
  • but writํ•˜๊ณ  list ๋ถˆ๋Ÿฌ์˜ค๋ฉด ์•ˆ ๋ถˆ๋Ÿฌ์™€ ์ง„๋‹ค

๐Ÿ””๋‹ค์‹œ ์ƒ๊ฐํ•˜์ž

  • ๊ทธ๋Ÿผ ์ž‘์„ฑํ•  ๋•Œ memberId์„ ๊ฐ™์ด ๋‚จ๊ฒจ์•ผ๊ฒ ๋Š”๋ฐ?
  • memberId์„ ๋‚จ๊ธฐ๊ณ  ๋‚˜์ค‘์— table joinํ•ด์„œ name์„ ๊ฐ€์ ธ์˜ค์ž

๐Ÿ”‘๋ฌธ์ œํ•ด๊ฒฐ~!

  • ์ž‘์„ฑํ•  ๋•Œ memberId์„ ๋‚จ๊ธฐ๊ฒŒ ํ•˜๊ณ  article table์˜ memberId์™€ member table์˜ id์™€ joinํ•œ ํ›„ name์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•œ๋‹ค.
sql.append("SELECT A.*, M.name AS extra__writer");
		sql.append("FROM article AS A");
		sql.append("INNER JOIN `member` AS M");
		sql.append("ON A.memberId = M.id");
		sql.append("ORDER BY id DESC;");

๐Ÿ“–mysql ์˜ค๋Š˜์˜ ๊ฐœ๋…

์•„์ด๋”” ์ฐพ๊ธฐ ์‹œ๊ฐ„ ๋‹จ์ถ•!!

๊ฒ€์ƒ‰ ์†๋„ ํ™•์ธ

SELECT SQL_NO_CACHE *
FROM `member`
WHERE loginId = 'test1';

ํ˜„์žฌ ๋ฌธ์ œ์ 

  • loginId์— unique์„ ์•ˆ ๊ฑธ์–ด์„œ ์•„์ด๋”” ์ค‘๋ณต ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ๊ทธ๋ž˜์„œ ์ค‘๋ณต ID๋ฅผ ์ฐพ์•„๋„ ๋ฐ”๋กœ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋๊นŒ์ง€ ์„œ์นญํ•จ ๊ทธ๋ž˜์„œ ๋А๋ฆฐ๊ฑฐ์ž„

๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•??

  • ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋ฅผ loginId ์ปฌ๋Ÿผ์— ๊ฑธ๊ธฐ
  • ์šฉ๋Ÿ‰์€ ๋Š˜์–ด๋‚จ, add index ์‹œ๊ฐ„ ๋Š˜์–ด๋‚จ
  • ์šฉ๋Ÿ‰์€ ๋ˆ์ด๋‹ค!! ๊ตณ์ด ํ•„์š” ์—†๋Š” ๊ฒƒ์€ index ์ถ”๊ฐ€ ํ•  ํ•„์š”์—†๋‹ค.
ALTER TABLE `member` ADD INDEX('loginId');

์ธ๋ฑ์Šค ์“ฐ๋Š” ์ง€ ํ™•์ธ

EXPLAIN SELECT SQL_NO_CACHE *
FROM `member`
WHERE loginId = 'test1';

๐Ÿ”” TODO

  • ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ๋ณต์Šต
  • ๊ฒŒ์‹œ๋ฌผ ์ˆ˜์ •, ์‚ญ์ œ ๋ณต์Šต

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