[자바 JDBC 게시판] 6일차

김정현·2022년 8월 16일

JDBC게시판

목록 보기
6/9

구조

App → articleController → articleService → articleDao → DB

실질적으로 DB에 접근하는 Dao에 conn객체 전달 과정

public class ArticleController extends Controller {
	private ArticleService articleService;
public ArticleController(Connection conn, Scanner sc) {
	super(sc);
	articleService = new ArticleService(conn);
}
  • Controller에서 conn을 service의 생성자를 통하여 전달하고
public class ArticleService {
	private ArticleDao articleDao;
public ArticleService(Connection conn) {
	articleDao = new ArticleDao(conn);
}
  • Service는 Controller로 전달받은 conn을 Dao의 생성자를 통해 전달한다.
public class ArticleDao {
	private Connection conn;
public ArticleDao(Connection conn) {
	this.conn = conn;
}
  • Dao에서 conn을 이용해 쿼리문 실행

insert MVC 구조

1. articleController.doWrite( )

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);
}
  • title과 body를 articleService.doWrite(title, body);에 인자로 넘겨주고

2. articleService.doWrite(title,body)

public int doWrite(String title, String body) {
		return articleDao.doWrite(title,body);
	}
  • articleService.doWrite(title, body)에서는 title, body(인자) 를 articleDao.doWrtie(title,body)에 전달한다.

3. 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);
	}
  • 실질적으로 articleDao에서 DB에 insert하게 한다.
  • 인자를 이용해 articleControll에서 service로 service에서 dao로 인자를 전달하는 방식으로 dao에서 인자를 통해 요청받은것 처리
  • 즉, articleController에서 articleService에게 요청을하고 articleService는 articleDao에게 DB의 데이터를 수정, 추가, 삭제, 조회 등을 요청한다.
    나머지 modify, delete, detail, list도 매개변수와 리턴타입만 다를뿐 비슷한 내용이다.

SELECT한 결과를 INSERT

1. SELECT한 전체 컬럼을 INSERT 하는 방법

INSERT INTO 테이블명
SELECT * FROM 테이블명

2. SELECT한 결과의 일부 컬럼을 INSERT 하는 방법

INSERT INTO 삽입될테이블명(COLUMN1, COLUMN2, COLUMN3)
SELECT COLUMN1, COLUMN2, COLUMN3 FROM 조회한테이블명
WHERE ... [조건도 추가 가능]

주의할 사항으로는 INSERT문에 나열한 컬럼과 SELECT 한 컬럼이 일치해야 한다.

UUID()

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()값으로 나오는거 같음..

SQL_NO_CACHE

EXPLAIN SELECT SQL_NO_CACHE * FROM `member`
WHERE loginId = 'user1';
  • SQL_NO_CACHE 쿼리를 실행할때 남아있는 캐시를 없앰
  • SQL 실행속도를 체크할때 쿼리를 여러번 실행하게 되면 남아있는 캐시로 인해 체크가 정확하지가 않음
  • SQL_NO_CAHCE를 지정하면 과거 캐시가 리셋되어 정확하게 속도 등 체크할 수 있음.

인덱스(index)

  • 인덱스(index)는 테이블에서 원하는 데이터를 쉽고 빠르게 찾기 위해 사용

  • 이러한 인덱스는 자주 사용되는 필드 값으로 만들어진 원본 테이블의 사본이라고 생각할 수 있다.

  • MySQL은 데이터를 검색할 때 첫 번째 필드부터 차례대로 테이블 전체를 검색

  • 따라서 테이블이 크면 클수록 데이터를 탐색하는 시간도 많이 늘어나게 된다.

  • 하지만 인덱스를 사용하면 테이블 전체를 읽지 않아도 되므로, 검색과 질의에 대한 처리가 빠르게 이루어진다.

  • 이러한 인덱스는 사용자가 직접 접근할 수는 없으며, 검색과 질의에 대한 처리에서만 사용

  • 인덱스가 설정된 필드 값을 포함한 데이터의 삽입, 삭제, 수정 작업이 원본 테이블에서 이루어질 경우, 인덱스도 함께 수정되어야 한다.

  • 따라서 인덱스가 설정된 테이블의 처리 속도가 느려질 수 있습니다.

  • 그러므로 인덱스는 수정보다는 검색이 자주 사용되는 테이블에서 사용하는 것이 좋다.

수백만개의 데이터의 데이터 중에 where loginId = ''의 데이터를 찾으려면

member 테이블을 풀스캔해서 찾으므로 시간이 오래 걸린다.

index를 추가하지 않으면 선형적이다.

UNIQUE INDEX 와 INDEX

#loginId 칼럼에 INDEX 걸기 
ALTER TABLE `member` ADD UNIQUE INDEX(`loginId`);
ALTER TABLE `member` ADD INDEX(`loginId`);
#loginId 칼럼에 INDEX 삭제 
ALTER TABLE `member` DROP INDEX `loginId`;
  • index는 중복이 될수있는데 unique index는 중복이 없으므로 unique index가 더 빠르게 조회할수있다. (중복값이없어 스캔도중 원하는 데이터를 찾으면 나머지 데이터를 풀스캔 하지 않아도 된다.)

EXPLAIN

  • '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 : 실행계획에 있어서 부가적인 정보를 보여준다.

암호화,복호화

  • 비밀번호를 CHAR(100) 으로 크게만드는 이유
    암호화 과정을 거쳐서 전달되므로 전달받는 쪽에서는 복호화 과정을 거치게 된다.

0개의 댓글