2024.01.23 HeidiSQL(4)

2024. 2. 18. 02:53SQL_MySQL&Heidi

오늘은 SQL 마지막 학습 시간이다.

내일부터 4일간의 휴식이 주어진다.

설 연휴를 앞두고 오늘도 파이팅 하기로 한다!!

 

첫 시간은 어제 배운 내용의 review로 시작하였다.

웹 페이지 내의 게시판을 만드는 데 있어서

사용자가 마땅히 받아야 할 서비스를

내가 서비스를 이용할 때와 반대의 입장에서 고려해야 한다고 하셨다.

 

나는 그 이야기를 들으면서 만들기 전 "구조도, 순서도"를 구성하고 시작해야

놓치는 부분 없이 제작 할 수 있을 것이라 예상이 되었다.

*어제 배운 내용


인터페이스의 코드로만 작성하기
리스트-리스트 = 뉴 어레이 리스트(리스트로 구현한 객체가 어레이 리스트)
Set set new hashtag
Set set new hashmap

 

자바는 최소한 편의점 수준의 언어

인터페이스를 구현하기 위해 구현객체를 바로 만들어서 DAO 역할을 할 수 있지만
DAO를 만들어서 구현객체가 Oracle 다오에게 정보를 주는 형태

DAO를 만든 후 구현객체하고 DAO랑 연계를 맺어줌 (기능 : 결과를 받아서 넘겨주는 일)


만약 혹시라도 DB에 특화된 특성이 있으면 그것을 조금 살려주고
여러개의 DB를 마음 껏 쓸 수 있는 아주 효율적인 방법입니다.

 

--리뷰--
interface 만들어놨던 것과 DAO와 연계하는 구현객체만 만들었음(어제)

application은 인터페이스에 있는 정의된 메소드를 사용 (MessageService 인터페이스 단)

 

 / DAO / ERD / ENTITY

 

 

 

MessageDAO 단: 2024-02-07 09:24:30 이럴 때
DB 조회 결과 : LocalDateTime.parse(구현객체로 만들고 싶을 때 사용하는 메소드)(“2024-02-07T09:24:30”);
중간에 T를 가져다 붙이기 79번째 줄 (Teacher GitHub)

 

Ex)
Message m = new Message(rs.getInt(1), rs.getString(2),
rs.getString(3), LocalDateTime.parse(rs.getString(4).replace(” “, “T”), 0);

 

 

 

MessageSeriveMySQLImpl 단
구현한 클래스 안에서는 어디서든지 쓸 수 있는 msgDao
mid 변수를 받아서 mid에 변수를 DAO에게 주고 결과를 받아서 결과를 데이터 저장소로 Application에 전달

 

getMessageListAll 몽땅 다 가져오는 것


getMessageListByWriter 작성자가 쓴 글만 가져오는 것


파라메터 없이 들어오는 것도 내가 파라메터 만들어서 데이터를 전달할 수도 있음

 

insert update delete는 받아서 정보를 던져주면 더 이상 할 것이 없음

형식에 맞는 코드를 입력해주면 저렇게 만들어져 있음
그것이 스프링 부트가 하는 일

 

저 방식이 스프링부트에서 구현할 방식이기 때문에 먼저 알고잇는 것이 도움됨
형식맞춰주는 코드 자꾸 보기

 

MessageTest를 DAO를 테스트하는 단
MessageMain은 어플리케이션

구현객체는 메세지 다오에 종속적 == 디펜던트하다


메세지 다오가 바뀌면 구현객체도 바뀌어야합니다.


그런데 나중에는 종속이라고 하는 의존성을 스프링이 자동으로 인셉션 해줍니다.

 

private Message Dao msg Dao = new MessageDao();
나중에는 이 코드가 이렇게 변화 ==> @Autowired private Message msgDao;


객체를 생성하지 않았지만 그런데 이렇게만 써 놓아도 구현객체가 msgDao를 쓸 수 있게됨
스프링이 구현객체를 만들어서 넣어줌


디펜던시 000 의존성 주입???

현상 발생 : MessageService messageService = new MessageServiceMySQLImpl();
앞으로 바뀔 코드 == 앞으로는 메인에서 웹 작업할 일 없음


@Autowired private MessageService messageService;
뒤에 무엇이 오든 코드가 바뀔 일이 없음


내 application은 무엇이 되던지 DB가 무엇이 되든간에 코드를 고칠 일이 없음
모든 DB에 같은 코드를 사용할 수 있게됨
인터페이스에서 알려준 코드를 사용

MessageMain은 바꿀 필요가 없게됨


데이터를 인터넷으로부터 받는 것만 달라짐 _ 어플리케이션이 대단한 것이 아님
DB를 쓸 것인데 CRUD를 어떻게 사용자화면으로 바꿔 줄 것인가가 중요함

 

bcrypt 라는 새로운 것 학습했습니다.

 

암호화(BCrypt)

1) 복원 가능한 암호화

- 평문을 비문으로 바꿀 수 있음, 비문을 평문으로 바꿀 수 있음
위와 같은 것이 복원 가능한 알고리즘임

  • 공개키 알고리즘이라고 부름 (복원이 가능하려면 키를 두개를 가져야함)
  1. 개인키
  2. 공개키
    암호화를 할 때 개인키와 공개키를 가지고 작업을 함
  3. 비복원 암호화
  • 한쪽으로는 가능하나 비문을 평문으로 바꿀 수 없음
    위와 같은 것을 비복원 암호화라고 함
    대표적인 것이 로그인 작업임
    로그인 가능한 패스워드를 입력할 때(암호화할 때) 암호를 설정한 것은 절대로 알 수 없음

평문 -> 비문

plain text cyper text ? cypher text?

-60$2a$10$Q1fxc6wTqDLL1s4YSLEfwOvgTXmvTnjYniZohteGi.rybAI.aM2FW
암호화된 코드는 char(60)

 

Correct id
Imbelled Uid
Incorrect Psw


세 가지의 경우가 있다 == 코드로 나타내면 이하와 같음


public static final int correct_login = 0;
public static final int WRONG_PASSWORD = 1;
public static final int USER_NOT_EXIST= 2;

 

1000건이 있다고 가정 : 3번쨰 페이지 라면;
내가 보아야 할 글자의 갯수는 10개일 때, count per page
offset =2
page = 3
page-1
int offset = page-1 * count per page 작성

 

오늘

CREATE DATABASE bbs; – bbs 파일 생성

 

오늘은 DAO, ERD, ENTITY,  BCrypt, 공개키 알고리즘에 대하여 학습했습니다.

---------------------------------------------------------------------------------------------------------------------------------------------------------

오늘 과제 : 이클립스 사용법 익히기 (유용한 기능)

 

https://www.youtube.com/watch?v=yUru5Mk5mcI&t=2s

--설명 하신 내용--

새션이라는 메모리를 유지-누군가 사용하면
자바스페이스 자바에서 액세스할 수 있는 것 같이 등록되어 있는 것은 session이 가능함
현재 session의 사용자는 누구? (사용자의 이름은 무엇인가?)
기술적으로 보면 로그인이 별게 아님
session을 보고 로그인을 했다 안했다를 판별함
session을 파괴하는 것이 로그아웃임
http 라는 것 : ex 전화걸 때 다이얼링 - 상대가 받으면 -통화 - 통화 종료
메세지 카톡 : 아무 때나 보냄 - 상대가 언제 받을 지 모름 - 확인하면 답장옴
전화거는 것 - connection oriented 연결 위주 - 연결에 기반한 통신 방식
카톡 메세지 - connection list 연결이 없는 http가 connetion oriented 가 아니라 connection list 방식임
로그인 했다 안했다는 session으로 판단함 - 특별한 session의 유무로 가림
목록이 나오면 (erm에서) 게시글 목록이 나올 시 목록에 표시되어야 할 항목 :
아이디(있으나 없으나 상관 없음) , 타이틀[댓글수], 컨텐트X, 이름X 대신 uname(nickname), 조회수
id - title - uname - LocalDate/Time(지금 막 작성한 것) - 조회수
bid - title[replyCount] - uname - modTime - viewCount
+-------+ +----------+
| 검색창▼| | 검색단어 |
+-------+ +----------+
설연휴 끝나고 웹서버를 배우고 난 후 미니프로젝트 4일간의 분량 - 게시판 만들기 or 일정표 만들기

User.java 강의 중 화면

Heidi SQL CODE

-1. insert

INSERT INTO board VALUES
(DEFAULT, '첫번째 글', '첫번째 글입니다.', 'admin', DEFAULT, DEFAULT, DEFAULT, DEFAULT);

SELECT b.*, u.uname FROM board b
JOIN users u ON b.uid=u.uid;

-3. select

SELECT * FROM board b
JOIN users u ON b.
WHERE isDeleted=0
ORDER BY bid DESC
LIMIT 10 OFFSET 0;

// 위의 코드 활용

SELECT * FROM board b
JOIN users u ON b.uid=u.uid
WHERE b.isDeleted=0 AND title LIKE '%'
ORDER BY bid DESC
LIMIT 10 OFFSET 0;

// 조회수 Counting

UPDATE board SET viewCount = viewCount + 1 WHERE bid < 10;
SELECT b.*,u.uname FROM board b
JOIN users u ON b.uid=u.uid
WHERE b.isDeleted=0 AND uname LIKE '%'
ORDER BY bid DESC
LIMIT 10 OFFSET 0;

■ package /

■MySQL

■sec07_bbs

  • ■ package /
    • ■MySQL
    • ■sec07_bbs
      • ■appl
        • ■BoardDaoTest.java
        • ■UserTest.java
      • ■dao
        • ■BoardDao.jav
        • ■ReplyDao.java
        • ■User.java
      • ■entity
        • ■Board.java
        • ■Reply.java
        • ■User.java
      • ■erd
      • ■service
      • mysql.properties

//reply 조회 코드

create database if not exists bbs;
use bbs;

SET SESSION FOREIGN_KEY_CHECKS=0;

/* Drop Tables */

DROP TABLE IF EXISTS reply;
DROP TABLE IF EXISTS board;
DROP TABLE IF EXISTS users;

/* Create Tables */

CREATE TABLE board
(
bid int NOT NULL AUTO_INCREMENT,
title varchar(256) NOT NULL,
content varchar(4000),
uid varchar(12) NOT NULL,
modTime datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
isDeleted int DEFAULT 0,
viewCount int DEFAULT 0,
replyCount int DEFAULT 0,
PRIMARY KEY (bid)
);

CREATE TABLE reply
(
rid int NOT NULL AUTO_INCREMENT,
comment varchar(256) NOT NULL,
regTime datetime DEFAULT CURRENT_TIMESTAMP,
uid varchar(12) NOT NULL,
bid int NOT NULL,
PRIMARY KEY (rid)
);

CREATE TABLE users
(
uid varchar(12) NOT NULL,
pwd char(60) NOT NULL,
uname varchar(16) NOT NULL,
email varchar(32),
regDate date DEFAULT (CURRENT_DATE),
isDeleted int DEFAULT 0,
PRIMARY KEY (uid)
);

/* Create Foreign Keys */

ALTER TABLE reply
ADD FOREIGN KEY (bid)
REFERENCES board (bid)
ON UPDATE RESTRICT
ON DELETE RESTRICT
;

ALTER TABLE board
ADD FOREIGN KEY (uid)
REFERENCES users (uid)
ON UPDATE RESTRICT
ON DELETE RESTRICT
;

ALTER TABLE reply
ADD FOREIGN KEY (uid)
REFERENCES users (uid)
ON UPDATE RESTRICT
ON DELETE RESTRICT
;

--오늘 학습 내용 정리--

새션이라는 메모리를 유지-누군가 사용하면
자바스페이스 자바에서 액세스할 수 있는 것 같이 등록되어 있는 것은 session이 가능함
현재 session의 사용자는 누구? (사용자의 이름은 무엇인가?)
기술적으로 보면 로그인이 별게 아님
session을 보고 로그인을 했다 안했다를 판별함
session을 파괴하는 것이 로그아웃임
http 라는 것 : ex 전화걸 때 다이얼링 - 상대가 받으면 -통화 - 통화 종료
메세지 카톡 : 아무 때나 보냄 - 상대가 언제 받을 지 모름 - 확인하면 답장옴
전화거는 것 - connection oriented 연결 위주 - 연결에 기반한 통신 방식
카톡 메세지 - connection list 연결이 없는 http가 connetion oriented 가 아니라 connection list 방식임
로그인 했다 안했다는 session으로 판단함 - 특별한 session의 유무로 가림
목록이 나오면 (erm에서) 게시글 목록이 나올 시 목록에 표시되어야 할 항목 :
아이디(있으나 없으나 상관 없음) , 타이틀[댓글수], 컨텐트X, 이름X 대신 uname(nickname), 조회수
id - title - uname - LocalDate/Time(지금 막 작성한 것) - 조회수
bid - title[replyCount] - uname - modTime - viewCount
+--------+ +----------+
|검색창 ▼| | 검색단어 |
+--------+ +----------+
설연휴 끝나고 웹서버를 배우고 난 후 미니프로젝트 4일간의 분량 - 게시판 만들기 or 일정표 만들기

몽땅다 생성자
기본 생성자
아이디 생성자 없는 생성자

board를 null;로 해놨으니 정보를 가져와야 함
제일 처음에 가져와야 할 것은 자료형이 int임 = (rs.getInt(1)) == 코드 구현
최종 코드 == board = new Board(rs.getInt(1), rs.getString(2), rs.getString(3),
rs.getString(4), LocalDateTime.palse(rs.getString(5),rs.getInt(6), rs.getInt(7), rs.getInt(8), rs.getInt(9));

다음 주 부터
Java EE perspective 를 사용할 예정

*about spell mistake
보드테이블에 집어넣는 값
title
content
uid

if you spelling miss = won't insert

test == Main

오후에는 reply 강의

package mysql.sec07_bbs.appl;

import mysql.sec07_bbs.dao.ReplyDao;
import mysql.sec07_bbs.entity.Reply;

public class ReplyDaoTest {

public static void main(String[] args) {
    ReplyDao rDao = new ReplyDao();
    String sessionUid = "james";

    Reply r = new Reply();
    r.setComment("댓글 1"); r.setUid(sessionUid); r.setBid(16);

16 이면 veiwCount가 하나 늘어나는 이상한 현상이 발생 ==> 12로 변경 (자신의 사정에 맞게 바꾸기)

--필드나 검색어를 아무것도 넣지 않으면 둘 중에 하나가 걸림--

  1. 필드값이 널이거나
  2. 필드값이 빈스트링

MySQL 강좌 오늘 종료
실전에서는
현재는 작업이 길어졌지만 스프링부트 배운 후에는 Dao 같은 것이 interface로 바뀜
코드작성이 아니라 인터페이스만 작성하면 됨
반복적인 작업은 없어짐
하지만 모르고 작성하면 의미가 없어짐
그러므로 그런 것들을 배우기 위한 시간으로 생각하면 됨

if 풀스텍 이라면 DB를 포함하는 작업이다. 필수!
program은 서로 유기적으로 얽혀있으니 foreign key 에 대한 개념 확립 필요!


--다음주 학습 예고--
localhost:8080/bbs/board?p=1&f=title&q=검색어 : 이런식으로 전달됨 == 페이지 / 필드 / 쿼리
다이나믹 웹 프로젝트
서블릿 : jsp or sublit page
자바에서 기본적으로 다루는 웹의 기술, 웹 화면쪽에서 보여주는 기본적인 기술을 배울 것
미니 프로젝트를 할 수 있도록 메이븐 프로젝트를 설명해 줄것임
둘 다 웹 서버를 사용하게 됩니다
아파치 톰캣을 사용하게 될 것임
화요일에는 아파치 톰캣을 설치 - 이클립스를 자바EE버전으로 change하고 향후 잘하려면 늦지말기

'SQL_MySQL&Heidi' 카테고리의 다른 글

2024.01.23 Heidi SQL(2)  (2) 2024.02.20
2024.01.24 Heidi SQL(3)  (0) 2024.02.19
2024.01.21 Heidi SQL(1)  (0) 2024.02.15