[내일배움캠프] 1월 9일 월요일 TIL 회고록
선발대 강의
예외 처리 : 애플리케이션을 만드는데 매우 중요한 부분을 차지한다.
오류는 시스템에 비정상적인 상황이 생겼을 때 발생
예외는 개발자가 구현한 로직에서 발생
에러
발생 위치 : 시스템 레벨에서 발생
익셉션
발생 위치 : 개발자가 구현한 로직에서 발생
예외가 필요한 이유
예외로 발생할 상황을 미리 예측해서 처리할 수 있다.
예외를 개발자가 처리할 수 있게 구분하고 그에 따른 처리 방법을 명확히 알고 적용할 수 있다.
예외를 통해 사용자에게 오류 발생을 알려야한다. 안내를 위해 + 개발자에게도 알려야 한다. 오류 수정을 위해
Java 익셉션 에러 출력
e.getMessage() : 에러의 원인을 간단하게 출력한다.
e.toString() : 에러의 익셉션 내용과 원인을 출력한다.
e.printStackTrace() : 에러의 발생근원지를 찾아서 단계별로 에러를 출력한다.
2. 익셉션의 종류
1. 예외 클래스
Trowable을 상속받는 클래스는 Error와 Exception이 있다.
Error는 시스템 레벨의 심각한 수준의 에러이기 때문에 시스템에 변화를 주어 문제를 처리해야 하는 경우가 일반적
Exception은 개발자가 로직을 추가하여 처리할 수 있다.
Checked Exception : 처리 여부 : 반드시 예외를 처리해야 함 확인 시점 : 컴파일 단계 , 예외 발생시 트랜잭션 처리 : roll-back 하지 않음
Unchecked Exception: 처리 여부 : 명시적인 처리를 강제하지 않음, 확인 단계 : 실행 단계, 예외 발생시 트랜잭션 처리 : roll-back 함
Checked Exception과 Unchecked Exception의 명확한 구분 기준은 '꼭 처리를 해야 하느냐' 이다.
예외 복구
예외 복구의 핵심은 예외가 발생하여도 애플리케이션은 정상적은 흐름으로 진행된다는 것
예외처리 회피 : 처리를 하지 않고 호출한 쪽으로 던져버리는 방법
예외 전환 : 호출한 쪽으로 던질 때 명호가한 의미를 전달하기 위해 다른 예외로 전환하여 던지는 방법
MySQL 배운 것 복습
0. 사용 할 데이터 베이스를 지정하는 법
USE 데이터베이스_이름;
SELETE 문의 기본 형식
SELECT select_expr
[FROM table_references]
[WHERE where_condision]
[GROUP BY {col_name | expr | position}]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
1. SELECT ~ FROM 문
SELECT 열_이름 FROM 테이블_이름
강의에서 준 데이터베이스를 이용해 member 테이블에서 member_name을 가져오려면 이렇게 코드를 입력하면 된다.
member 테이블에서 mam_name 열의 값을 가져왔다.
SELECT mem_name
FROM member
실행 결과
만약 열을 전부 가지고 오고 싶다면 * 을 사용하면 전부 출력이 가능하다.
SELECT *
FROM member;
실행하면 모든 열을 전부 가져온다.
여러개의 열을 가져오고 싶으면 , (콤마)를 이용하면 된다. 만약 mem_id와 mem_name, addr 을 가져오고 싶으면 SELECT에 mem_id, mem_name, addr을 적으면 된다.
SELECT mem_id,mem_name,addr
FROM member;
실행 결과
만약 출력될때 mem_name, addr 을 그룹이름, 주소로 나타내고 하고싶으면 mem_name '그룹이름' , addr '주소' 라고 적은 후 실행하면 이름이 변경되어 출력된다.
SELECT mem_id,mem_name '그룹이름' ,addr '주소'
FROM member;
실행 결과
2. SELECT ~ FROM ~ WHERE 문
2-1 : 기본적인 양식
SELECT 열_이름 FROM 테이블_이름 WHERE 조건식;
만약 전체 데이터 중 우주소녀의 데이터를 가져오고 싶으면 SELECT에 *, FROM에 member, WHERE에 mem_name = '우주소녀' 를 입력하면 된다.
SELECT *
FROM member
WHERE mem_name = '우주소녀'
실행 결과
2-2 관계연산자, 논리연산자
- 관계연산자: > < >= <= =
- 논리연산자: AND OR
문제 1 : 평균 키 (height) 가 164 이상인 회원들을 검색하기
풀이: 1. 먼저 보기 편하게 mem_id와 mem_name 열을 넣었고, height 열도 넣었다.
2. 당연히 member 테이블에서 가져와야하고
3. height 가 164 이상인 멤버만 검색하게 만들었다.
SELECT mem_id,mem_name,height
FROM member
WHERE height >= 164;
실행 결과
문제 2 : 평균 키가 165 이상이면서 인원 (mem_number) 이 6명 초과한 회원 찾기
풀이 :
1. mem_id, mem_name , height, mem_number 열을 넣었다.
2. member 테이블에서 검색하고,
3. height(키)가 165인 사람과 AND 연산자를 사용해서 mem_number(인원) 이 6명 초과한 사람들만 검색하게 만들었다.
SELECT mem_id,mem_name,height,mem_number
FROM member
WHERE height >= 165 AND mem_number > 6;
실행 결과
문제 3. 평균 키가 163 이상 165 이하인 회원 검색 ( Between 사용 )
Between : 숫자의 범위를 조건식에서 사용할 때 편리하다.
풀이 :
1. 전체 검색을 하고싶어서 * 로 넣었다.
2. member 테이블에서 검색하고
3. BETWEEN을 이용해서 height가 163 이상, 165 이하인 회원을 검색하게 만들었다.
SELECT *
FROM member
WHERE height BETWEEN 163 AND 165;
실행 결과
문제 4. : 주소가 경기/전남/경남 인 사람을 검색하기 ( IN() 사용 )
IN() : 문자로 표현되는 조건식을 조합할 때 편하다.
4-1 : IN() 사용 안하고 검색하는 코드
SELECT mem_id,mem_name,addr
FROM member
WHERE addr = '경기' or addr = '전남' or addr = '경남';
4-2 IN() 사용해서 검색하는 코드
SELECT mem_id,mem_name,addr
FROM member
WHERE addr IN('경기','전남','경남')
실행 결과
문제 5-1 : 이름 (mem_name) 이 '우' 로 시작하는 회원 검색 (LIKE 사용)
LIKE : 문자열의 일부 문자를 검색할때 편하다
사용법 : '%' : 무엇이든 허용
' _ ' (언더바) : 한글자 매칭 ex ) _ _ 핑크 검색 = 에이핑크, 블랙핑크 출력
SELECT mem_id,mem_name
FROM member
WHERE mem_name LIKE '우%';
문제 5-2 이름 (mem_name) 이 ' _ _ 소녀 ' 인 회원 검색
SELECT mem_id,mem_name
FROM member
WHERE mem_name LIKE '__소녀';
실행 결과
문제 6 : 서브쿼리를 사용하여 이름 (mem_name) 이 '에이핑크' 인 회원의 평균 키 (height) 보다 큰 모든 회원을 검색하기
서브쿼리 : SELECT 안에 또 다른 SELECT
6-1 : 에이핑크의 평균 키 알아오기
SELECT height
FROM member
WHERE mem_name = '에이핑크';
6-2 평균키가 164보다 큰 회원 검색
SELECT mem_name,height
FROM member
WHERE height > 164;
서브쿼리를 사용하면 한개의 쿼리로 구할 수 있다.
SELECT mem_name,height
FROM member
WHERE height >(SELECT height FROM member WHERE mem_name = '에이핑크' )
실행 결과
3. ORDER BY
ORDER BY 절은 결과의 값이나 개수에 대해서는 영향을 미치지 않지만, 결과가 출력되는 순서를 조절한다.
ASC : 오름차순
DESC : 내림차순
기본 값은 ASC (오름차순) 이다.
문제 1 : 데뷔일자가 ( debut_date ) 가 제일 빠른 순서대로 정렬하기
SELECT mem_id,mem_name, debut_date
FROM member ORDER BY debut_date ASC;
실행 결과
문제 2 : 데뷔일자가 ( debut_date ) 가 제일 늦은 순서대로 정렬하기
SELECT mem_id,mem_name, debut_date
FROM member ORDER BY debut_date DESC;
실행 결과
문제 3 : 평균 키가 큰 순으로 정렬
SELECT mem_id,mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC;
실행 결과
자세히 보면 잇지와 트와이스가 평균 키는 같으나 debut_date가 다르다.
만약 이럴 경우에 debut_date (데뷔일자)가 빠른 순서로 정렬하고 싶으면 ORDER BY height DESC에 , 를 붙인 후 debut_date ASC 를 추가하면 된다.
SELECT mem_id,mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC , debut_date ASC;
실행 결과, 트와이스랑 잇지랑 순서가 바뀌었다.
LIMIT
LIMIT : 출력하는 개수를 제한한다.
LIMIT 형식은 LIMIT 시작, 개수이다.
다음과 같이 LIMT 3 만 쓰면 LIMIT 0, 3과 동일하다
또한 LIMIT 시작, 개수 는 LIMIT 개수 OFFSET 시작 이라고 작성한 것과 같다.
LIMIT 3 == LIMIT 0, 3 == LIMIT 3 OFFSET 0
예시
SELECT mem_name, debut_date
FROM member
ORDER BY debut_date
LIMIT 3;
실행 결과
DISTINCT
DISTINCT : 조회 된 결과에서 중복된 데이터 1개만 남긴다.
예시
SELECT addr FROM member;
실행 결과
여기서 DISTINCT를 추가하면?
SELECT DISTINCT addr FROM member;
실행 결과, 중복값이 한개를 제외하고 전부 다 사라졌다.
GROUP BY
출력 결과를 그룹으로 묶어준다. 주로 집계함수와 함께 사용된다.
집계 함수 :
- SUM() : 합계
- AVG() : 평균
- MIN() : 최솟값
- MAX() : 최댓값
- COUNT() : 행의 개수
- COUNT(DISTINCT) : 행의 개수(중복제거)
문제 1 : 구매내역 전부 출력하기
SELECT mem_id, amount
FROM buy ORDER BY mem_id
실행 결과
문제 2 : 각 구입한 회원의 개수(amount)를 합쳐서 출력하기
SUM() 을 이용해서 amount 개수를 합쳤다.
SELECT mem_id, SUM(amount)
FROM buy GROUP BY mem_id
실행 결과
문제 3 : 각 회원이 구매한 금액의 총합 (price * amount)을 출력하기
SELECT mem_id, SUM(price * amount)
FROM buy GROUP BY mem_id
실행 결과
문제 4 : 위의 결과 중에 총 구매액이 1000 이상인 회원을 찾는다면? (HAVING 사용)
HAVING : HAVING은 집계 함수에 대해서 조건을 제한하는 것이라고 생각하면 된다.
HAVING절은 꼭 GROUP BY 절 다음에 나와야 한다.
SELECT mem_id, SUM(price * amount)
FROM buy
GROUP BY mem_id
HAVING SUM(price * amount) > 1000
실행 결과
내일 강의를 듣고 한번 더 복습 해 봐야겠다.