public class ArticleController extends Controller {
private ArticleService articleService;
public ArticleController(Connection conn, Scanner sc) {
super(sc);
articleService = new ArticleService(conn);
}
public class ArticleService {
private ArticleDao articleDao;
public ArticleService(Connection conn) {
articleDao = new ArticleDao(conn);
}
public class ArticleDao {
private Connection conn;
public ArticleDao(Connection conn) {
this.conn = conn;
}
public void doWrtie() {
System.out.println("== 게시물 작성 ==");
System.out.printf("제목 : ");
String title = sc.nextLine();
System.out.printf("내용 : ");
String body = sc.nextLine();
int id = articleService.doWrite(title, body);
System.out.printf("%d번 게시물이 생성되었습니다.\n", id);
}
public int doWrite(String title, String body) {
return articleDao.doWrite(title,body);
}
public int doWrite(String title, String body) {
SecSql sql = new SecSql();
sql.append("INSERT INTO article");
sql.append(" SET regDate = NOW()");
sql.append(", updateDate = NOW()");
sql.append(", title = ?", title);
sql.append(", `body` = ?", body);
return DBUtil.insert(conn, sql);
}
1. SELECT한 전체 컬럼을 INSERT 하는 방법
INSERT INTO 테이블명
SELECT * FROM 테이블명
2. SELECT한 결과의 일부 컬럼을 INSERT 하는 방법
INSERT INTO 삽입될테이블명(COLUMN1, COLUMN2, COLUMN3)
SELECT COLUMN1, COLUMN2, COLUMN3 FROM 조회한테이블명
WHERE ... [조건도 추가 가능]
※ 주의할 사항으로는 INSERT문에 나열한 컬럼과 SELECT 한 컬럼이 일치해야 한다.
INSERT INTO member (regDate,loginId,loginPw,name)
SELECT NOW(),UUID(),'pw','아무개'
FROM member
SELECT NOW() FROM `member`
SELECT UUID() FROM `member`
regDate에 해당하는 게 NOW() 이므로 regDate의 데이터가 조회됨
UUID() 유니크한 문자열을 만들어 주는함수, 고유한 식별자
SELECT UUID() FROM member 를 실행시키면 기존loginId가 UUID()값으로 나오는거 같음..
EXPLAIN SELECT SQL_NO_CACHE * FROM `member`
WHERE loginId = 'user1';
인덱스(index)는 테이블에서 원하는 데이터를 쉽고 빠르게 찾기 위해 사용
이러한 인덱스는 자주 사용되는 필드 값으로 만들어진 원본 테이블의 사본이라고 생각할 수 있다.
MySQL은 데이터를 검색할 때 첫 번째 필드부터 차례대로 테이블 전체를 검색
따라서 테이블이 크면 클수록 데이터를 탐색하는 시간도 많이 늘어나게 된다.
하지만 인덱스를 사용하면 테이블 전체를 읽지 않아도 되므로, 검색과 질의에 대한 처리가 빠르게 이루어진다.
이러한 인덱스는 사용자가 직접 접근할 수는 없으며, 검색과 질의에 대한 처리에서만 사용
인덱스가 설정된 필드 값을 포함한 데이터의 삽입, 삭제, 수정 작업이 원본 테이블에서 이루어질 경우, 인덱스도 함께 수정되어야 한다.
따라서 인덱스가 설정된 테이블의 처리 속도가 느려질 수 있습니다.
그러므로 인덱스는 수정보다는 검색이 자주 사용되는 테이블에서 사용하는 것이 좋다.
수백만개의 데이터의 데이터 중에 where loginId = '
'의 데이터를 찾으려면member 테이블을 풀스캔해서 찾으므로 시간이 오래 걸린다.
index를 추가하지 않으면 선형적이다.
#loginId 칼럼에 INDEX 걸기
ALTER TABLE `member` ADD UNIQUE INDEX(`loginId`);
ALTER TABLE `member` ADD INDEX(`loginId`);
#loginId 칼럼에 INDEX 삭제
ALTER TABLE `member` DROP INDEX `loginId`;

'EXPLAIN' 을 사용하면 쿼리를 실행하기전에 실행계획을 분석하여 출력한다.
id : 쿼리 안에 있는 각 select 문에 대한 순차 식별자이다. 이순서대로 select문이 실행된다고 생각하면 된다.
select_type : select 문의 유형
table : 참조되는 테이블을 말한다
type : MySQL이 어떤식으로 테이블들을 조인하는지를 나타내는 항목
possible_keys : 테이블에서 row를 매핑시키기 위해 사용 가능한 (사용하지 않더라도) 키를 보여준다.
key : 실제적으로 쿼리 실행에 사용된 key의 목록이다. 이 항목에는 possible_keys 목록에 나타지 않은 인덱스도 포함 될 수 있다.
ref : key column에 지정된 인덱스와 비교되는 column 또는 constants를 보여준다.
rows : 결과 산출에 있어서 접근되는 record의 숫자이다. 조인문이나 서브쿼리 최적화에 있어서 중요한 항목이다.
Extra : 실행계획에 있어서 부가적인 정보를 보여준다.