분류 전체보기

반응형

웹 개발을 하다 보면 정적인 테이블 말고 사용자가 버튼을 누른다거나 함수를 호출 했을 때,

<tr><td>가 추가 돼야 하는 일들이 있죠.

 

그런 것들을 jQuery append()를 이용해 "그린다" "그려낸다"라고 표현들을 하시는데요.

 

한번 동적 테이블을 그려보는 대표적인 실전 예제를 알아보겠습니다.

 

문법


방법 1 - 객체 값 꺼내 테이블 추가하기

table_append 버튼 클릭 시 JavaScript 객체에 있는 값들을 하나씩 뽑아서

한번에 <tr><td>에 담아 <tbody>에 그리는 예제

JavaScript

function tableCreate(){

var tc = new Array();
var html = '';
		
tc.push({name : '남궁민수', job : '기관사', age : 50,hobby : '노래듣기' }); 
tc.push({name : '유재석', job : 'MC', age : 40,hobby : '운동' }); 
tc.push({name : '박명수', job : '개그맨', age : 42,hobby : '영어' }); 
tc.push({name : '정준하', job : '엔터테이너', age : 41,hobby : '맛집탐방' }); 
tc.push({name : '정형돈', job : '개그맨', age : 36,hobby : '잠자기' }); 

for(key in tc){
html += '<tr>';
html += '<td>'+tc[key].name+'</td>';
html += '<td>'+tc[key].job+'</td>';
html += '<td>'+tc[key].age+'</td>';
html += '<td>'+tc[key].hobby+'</td>';
html += '</tr>';
}
			
$("#dynamicTbody").empty();
$("#dynamicTbody").append(html);
			
}

HTML

<div>
<table style="border: 1px;" id="dynamicTable">
<thead>
<tr>
<th>이름</th>
<th>직업</th>
<th>나이</th>
<th>취미</th>
</tr>
</thead>
<tbody id="dynamicTbody">
	
</tbody>
</table>
<button onclick="tableCreate()">table_append</button>
</div>

결과

 

방법 2 - 입력받은 데이터 한줄씩 테이블에 추가하기

사용자가 input 창에 값을 넣고 table_append 버튼을 클릭 시 <tr><td> 입력 한 데이터가 한 줄씩 추가 된다. 

JavaScript


function tableCreate(){
var tc = new Array();
var html = '';
			
var name = $("#inName").val();
var job = $("#inJob").val();
var age = $("#inAge").val();
var hobby = $("#inHobby").val();
			
html += '<tr>';
html += '<td>'+name+'</td>';
html += '<td>'+job+'</td>';
html += '<td>'+age+'</td>';
html += '<td>'+hobby+'</td>';
html += '</tr>';
			
$("#dynamicTable").append(html);
			
$("#inName").val('');
$("#inJob").val('');
$("#inAge").val('');
$("#inHobby").val('');
}

HTML

<div>
<table style="border: 1px;" id="dynamicTable">
<thead>
<tr>
<th>이름</th>
<th>직업</th>
<th>나이</th>
<th>취미</th>
</tr>
</thead>
<tbody id="dynamicTbody">
	
</tbody>
</table>
</div>
<div>
<input type="text" placeholder="이름" id="inName">
<input type="text" placeholder="직업" id="inJob"> 
<input type="text" placeholder="나이" id="inAge">
<input type="text" placeholder="취미" id="inHobby">
<button onclick="tableCreate()">table_append</button>
</div>

 

방법 2-1 - 한줄씩 테이블에서 삭제하기

JavaScript

function tableDelete(){
$('#dynamicTable tbody tr:last').remove();
}

HTML

<button onclick="tableDelete()">table_remove</button>

 

방법 3 - ajax 통신 결과(result) 값 테이블에 추가하기

table_append 버튼 클릭 시 ajax 호출을 이용하여 받은 값을 테이블에 그려낸다.(방법 1과 유사)

JavaScript

function tableCreate(){
			
$.ajax({
			
url : "/jquery/tableCreate.do",
success:function(data){
var html = '';	
				
for(key in data){
html += '<tr>';
html += '<td>'+data[key].name+'</td>';
html += '<td>'+data[key].job+'</td>';
html += '<td>'+data[key].age+'</td>';
html += '<td>'+data[key].hobby+'</td>';
html += '</tr>';	
}
					
$("#dynamicTbody").empty();
$("#dynamicTbody").append(html);
				
}			
})
}

HTML

<div >
<table style="border: 1px;" id="dynamicTable">
<thead>
<tr>
<th>이름</th>
<th>직업</th>
<th>나이</th>
<th>취미</th>
</tr>
</thead>
<tbody id="dynamicTbody">
	
</tbody>
</table>
</div>
<div>
<button onclick="tableCreate()">table_append</button>
</div>
반응형
반응형

자주 쓰는 날짜 API


CURDATE() : 현재 날짜를 반환


SELECT CURDATE();

결과 : YYYY-MM-DD || YYYYMMDD(시간 반환X)

 

 

CURTIME() : 현재 시간을 반환


SELECT CURTIME();

결과 : HH:MM:SS || HHMMSS 

 

 

SYSDATE() || NOW() : 현재날짜 시간을 반환


SELECT SYSDATE();
SELECT NOW();

결과 : YYYY-MM-DD HH:MM:SS || YYYYMMDDHHMMSS

 

SYSDATE() NOW() 엄연히 다르다. 절때 다르다. 당연히 다르다

SYSDATE() : 함수(쿼리포함) 실행되는 시점의 시각을 바로 리턴

NOW() : 쿼리가 끝난 시점의 시각 리턴

 

예를 들어 SELECT * FROM computer_value 조회하는데 데이터가 많아서 10분이상 혹은 1시간 10시간 걸렸다면

처음 조회한 데이터의 SYSDATE() 20 30분이였다면

중간 조회된 데이터 SYSDATE() 21 20

끝은 22 30 이런식..

 

거기에 FULL-TABLE-SCAN을 하기 때문에 성능상에도 굉장히 좋지 않다.

 

한마디로 NOW() 쓰자.

 

 

UNIX_TIMESTAMP() : '1970-01-01 00:00:00' 부터의 UTC 시간을 초를 반환


SELECT UNIX_TIMESTAMP()

#값을 지정 할 수도 있다.
#그럼 이 시간 기준으로 반환된다.
SELECT UNIX_TIMESTAMP('2019-11-12 17:00');

결과 : 초를 반환하기 때문에 1573545907 이런식

 

 

FROM_UNIXTIME(unix_timestamp) : UTC 시간(timestamp) 날짜 형식으로 변환한다.


SELECT FROM_UNIXTIME(1573545600);

결과 : 2019-11-12 17:00:00

 

 

DATE_FORMAT(date,format) : 날짜를 해당 형식의 문자열로 변환하여 반환.


대표적인 예시

SELECT DATE_FORMAT('2019-11-12 20:23:00', '%H:%i:%s');

결과 : 20:23:00

SELECT DATE_FORMAT('2019-11-12 20:23:00', '%y-%m-%d');

결과 : 19-11-12

SELECT DATE_FORMAT('2019-11-12 20:23:00', '%y-%m-%d %H:%i:%s');

결과 : 19-11-12 20:23:00

FORMAT 양식은 너무 길어서 생략 합니다.

 

 

STR_TO_DATE(str, format) : 문자열 str와 형식 문자열 format을 입력받음


받은 str 문자열을 Date 형식으로 바꿔줍니다.

SELECT STR_TO_DATE('2019-11-12','%y-%m-%d')

결과 : 2019-11-12

SELECT STR_TO_DATE('August 12 2019', '%M %d %Y')

결과 : 2019-08-12

SELECT STR_TO_DATE('Nov 12 2019', '%M %d %Y')

결과 : 2019-11-12

 

주의 : str이랑 format 폼을 동일하게 맞춰야 합니다. 맞지 않을 경우 null 반환

 

 

DATE_SUB(date, INTERVAL) 빼기


현재 시간 - 1시간(DATETIME 값만 가능)

SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);

현재 시간 - 1

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);

현재 시간 - 1

SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);

 

 

DATE_ADD(date, INTERVAL) 더하기


현재 시간 + 1시간(DATETIME 값만 가능)

SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR);

현재 시간 + 1

SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);

현재 시간 + 1

SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);

현재 시간 - 1시간(DATETIME 값만 가능)

SELECT DATE_ADD(NOW(), INTERVAL -1 HOUR);

현재 시간 - 1

SELECT DATE_ADD(NOW(), INTERVAL -1 DAY);

 

 

DATEDIFF(date1,date2) 두 날짜 차이 구하기


두 날짜의 일 차이를 가져오는 것입니다.

앞에 파라미터(date1)를 기준으로 합니다.

select datediff('2019-11-15','2019-11-10')

결과 : 5  (양수)

select datediff('2019-11-10','2019-11-15')

결과 : -5 (음수)

 

 

TIMESTAMPDIFF(unit(단위),date1,date2)


두 날짜의 시간 차이를 가져오는 것입니다.

이것 역시 앞에 파라미터(date1)를 기준으로 합니다.

select TIMESTAMPDIFF(SECOND,'2019-11-10 18:22:30','2019-11-10 18:22:50')

결과 : 20(초)

select TIMESTAMPDIFF(SECOND,'2019-11-10 18:22:50','2019-11-10 18:22:30')

결과 : -20(초)

select TIMESTAMPDIFF(MINUTE,'2019-11-10 18:28:55','2019-11-10 18:40:20')

결과 : 11(분) 

주의 : 왜 12가 아니고 11일까? 바로 초가 모자라서 그렇습니다. 28분 55초-40분 20초 그래서 11분으로 인식됩니다. 조심

 

 

TIMESTAMPDIFF, DATE_SUB, DATE_ADD 있는 포맷


SECOND

MINUTE

HOUR

DAY

MONTH

YEAR

 

 

문법


문법에 들어가기 앞서, 공통 테이블 예시

CREATE TABLE computerValue(

id int,
cpu_value int,
memory_value int,
graphics_card_value int,
time_value datetime

)

날짜 데이터는 많이 들어가 있어야 쿼리 할 때 이해가 더 쉬우니 데모데이터를 넣어봅시다.

DEMO CSV 만들기

https://www.mockaroo.com/

 

Mockaroo - Random Data Generator and API Mocking Tool | JSON / CSV / SQL / Excel

Paste the header row from your CSV, TXT, or Excel file to create multiple fields at once.

www.mockaroo.com

설정

설정을 끝낸 Download Data 누르시면 됩니다.

 

만들어진 CSV 파일 MariaDB에 import 하기

LOAD DATA LOCAL INFILE 'C:/Users/사용자/Desktop/MOCK_DATA.csv'(csv 파일 경로)
REPLACE
INTO TABLE `localtest(DB 이름)`.`computervalue(TABLE 이름)`
COLUMNS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
#CSV 컬럼들
(@id, @name, @cpu_value, @memory_value,@graphics_card_value,@time_value) 
#테이블컬럼 = CSV 컬럼 
SET `id` = @id, `name` = @name, `cpu_value` = @cpu_value, `memory_value` = @memory_value,`graphics_card_value` = @graphics_card_value,`time_value` = @time_value; 

 

주의 - file path 부분


Windows : C:/Users/   "/"(슬래쉬) 사용

Linux : \temp\home\  "\"(역슬래쉬) 사용


 

실전 예제

 

DATE 기준 최근 동향 구하기


최근 3 컴퓨터의 CPU or MEMORY 70% 사용량을 구하기

SELECT DISTINCT id,cpu_value,memory_value,graphics_card_value,time_value
FROM computervalue
WHERE time_value >= DATE_ADD(CURRENT_DATE(), INTERVAL -3 DAY) 
AND (cpu_value >= 70 OR memory_value >= 70);

최근 n일은 DATE_ADD(CURRENT_DATE(), INTERVAL -3 DAY) INTERVAL 뒤에 정수값만 바꿔주시면 됩니다.

 

DATETIME 기준 최근 동향 구하기


최근 3 컴퓨터의 CPU or MEMORY 70% 사용량을 구하기

SELECT DISTINCT id,cpu_value,memory_value,graphics_card_value,time_value
FROM computervalue
WHERE time_value >= DATE_ADD(NOW(), INTERVAL -3 DAY) 
AND (cpu_value >= 70 OR memory_value >= 70);

이럴 경우 DATETIME 경우는 최근 n 사이에 70% 넘은 데이터가 여러 개라면 이름과 아이디가 똑같은 데이터가 여러 나오겠죠? 테이블에 표출하고 싶은데 말이죠

 

2(컴퓨터ID) 사용량 사용량 2019-11-12 19:05

2(컴퓨터ID) 사용량 사용량 2019-11-12 21:35 처럼요.

 

DATETIME 기준 최근 동향 구하기


최근 3 1컴퓨터당 1개의 데이터만 사용량이 제일 높았던  구하기

SELECT id,cpu_value,memory_value,graphics_card_value,time_value
FROM computervalue
WHERE time_value >= DATE_ADD(NOW(), INTERVAL -1 DAY) and (cpu_value > 70 or memory_value > 70)
GROUP BY name,id

 

실시간 사용량 TOP5 구하기

SELECT *
FROM computervalue
where `time_value` IN (SELECT MAX(time_value) FROM computervalue) 
order by cpu_value desc, memory_value desc,graphics_card_value desc limit 5;

CPU -> MEMORY -> GRAPHIC 기준입니다.

우선순위를 바꾸시려면 order by 컬럼위치를 바꾸시면 됩니다.

 

DATE : 2019-11-10 처럼 날짜만 나오는 데이터.

DATETIME : 2019-11-10 15:35처럼 날짜+시간이 같이 나오는 데이터

 

 

추가 실전 예제는 제가 프로젝트를 진행하면서 남들도 어렵다고 생각하겠다 OR 제가 삽질했던거 OR 자주 쓰는데 계속 까먹는 위주로 올립니다

글은 계속 업데이트 예정입니다.

 

예제 파일 제공


[MariaDB] date API+date query.sql
0.00MB

반응형
반응형

 

서브쿼리(Subquery)

 

 

개념


하나의 SQL 문 안에 포함되어 있는 또 다른 SQL문을 말한다. 

서브쿼리는 메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.

 

이제부터 앞에 있는 쿼리 select * from ex 메인 쿼리

(select * from sub_ex) 괄호()안에 있는 쿼리를 서브 쿼리라 칭합니다.

 

서브쿼리(자식쿼리) - 메인쿼리 컬럼 사용 가능

메인쿼리(부모쿼리) - 서브쿼리 컬럼 사용 불가

Java의 상속과 똑같은 개념입니다.

 

종류


중첩 서브쿼리( Nested Subquery ) - WHERE 문에 나타나는 서브쿼리

1.단일

2.복수(다중)

3.다중 컬럼

 

인라인 (Inline View) - FROM 문에 나타나는 서브쿼리

 

스칼라 서브쿼리( Scalar Subquery ) - SELECT 문에 나타나는 서브쿼리

 

 

 

이 세개의 종류는 그냥 외워주세요.


WHERE 중첩 서브쿼리

FROM 인라인 뷰

SELECT 스칼라 서브쿼리 


 

실행 순서


서브쿼리 실행 -> 메인(부모) 쿼리 실행

 

 

사용 이유


예를 들어 회사원 테이블에 김동식 대리보다 급여를 많이 받는 사람을 구하시오.

 

위와 같은 상황이 주어지면 서브쿼리가 없을 경우 우리는 일단

김대리의 급여가 얼만지 모르니까

select salary from employee where name = '김대리' 김대리의 정보를 구한다음

정보를 저장했다가

select name,salary from employee where salary > 김대리 급여 저장한 정보

벌써 피곤합니다.

 

하지만 서브 쿼리를 쓴다면

select name,salary from employee where salary > (select salary from employee where name = '김대리')

한줄로 *깰끔하게 정리가 됩니다.

 

이것은 예시일 뿐입니다. 값을 구할 무조건 PK_id로….

 

*깰끔 : 깔끔의 인터넷 용어

 

한마디로

여러번의 쿼리를 수행해야만 얻을 수 있는 결과를 

하나의 중첩된 SQL문장으로 간편하게 결과를 얻을 수 있게 해줍니다.

 

조건


서브쿼리는 SELECT문으로만 작성 할 수 있다.

(SELECT 쿼리밖에 사용 없는것 이다. SELECT문에만 사용 하는 것이 아니라)

 

반드시 괄호()안에 존재하여야 한다.

 

괄호가 끝나고 끝에 ;(세미콜론) 쓰지 않는다.

 

ORDER BY를 사용 할 수 없다.

 

 

사용 가능


SELECT

FROM

WHERE

HAVING

ORDER BY

INSERT문의 VALUES

UPDATE문의 SET

 

서브쿼리도 별칭(alias) 사용이 가능하다.

 

 

문법


문법에 들어가기 앞서, 공통 테이블 예시

CREATE TABLE employee (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64),
salary INT,
office_worker VARCHAR(64),
)

INSERT INTO employee VALUES(1,'허사장',20000000,'사장');

INSERT INTO employee (name,salary,office_worker) VALUES('유부장',10000000,'부장');
INSERT INTO employee (name,salary,office_worker) VALUES('박차장',5000000,'차장');
INSERT INTO employee (name,salary,office_worker) VALUES('정과장',4000000,'과장');
INSERT INTO employee (name,salary,office_worker) VALUES('정대리',3895000,'대리');
INSERT INTO employee (name,salary,office_worker) VALUES('노사원',2500000,'사원');
INSERT INTO employee (name,salary,office_worker) VALUES('하사원',2000000,'사원');
INSERT INTO employee (name,salary,office_worker) VALUES('길인턴',1000000,'인턴');

SELECT * FROM employee

회사원 정보 테이블

 

서브쿼리는 무조건! 괄호() 감싼 사용해야 한다.

(SELECT ~ 서브쿼리 내용)

 

중첩 서브쿼리 - 단일

#Nested Subquery - 단일 행 
#정대리라는 사람의 직급을 구하시오.
SELECT office_worker
FROM employee
WHERE office_worker = (SELECT office_worker FROM employee WHERE name = '정대리')

 

중첩 서브쿼리 - 복수(다중)

-IN, ANY, ALL, EXISTS 등의 연산자로 얻은 서브쿼리 결과 여러개의 행을 반환.

#Nested Subquery - 복수(다중) 행 
#정대리보다 급여가 높은 사람들을 구하시오.
SELECT *
FROM employee
WHERE salary > (
SELECT salary
FROM employee
WHERE NAME = '정대리')

#직급이 사원인 사람들을 구하시오.
SELECT *
FROM employee
WHERE office_worker IN (
SELECT office_worker
FROM employee
WHERE office_worker = '사원')

 

인라인 (Inline View)

#인라인 뷰(Inline View)
#잘못된 구문 - 꼭 파생 테이블엔 별칭을 정해줘야 합니다.
SELECT * FROM (SELECT * FROM employee WHERE office_worker='사원') (X)
/* SQL 오류 (1248): Every derived table must have its own alias */
#인라인 뷰(Inline View)
#직급이 사원인 사람들의 이름과 급여를 구하시오.
SELECT EX1.name,EX1.salary
FROM (
SELECT *
FROM employee AS Ii
WHERE Ii.office_worker='사원') EX1;

 

스칼라 서브쿼리(Scalar Subquery)

#스칼라 서브쿼리(Scalar Subquery)
#정대리 급여와 테이블 전체 평균 급여를 구하시오.
SELECT name,salary,(
SELECT ROUND(AVG(salary),-1)
FROM employee) AS '평균급여'
FROM employee
WHERE name = '정대리';

 

INSERT  서브쿼리(INSERT Subquery)

#테이블2의 정보를 뽑아서 그 데이터를 테이블1에 넣어준다.
INSERT INTO table1 (SELECT * FROM table2);

 

DELETE 서브쿼리(DELETE Subquery)

#인턴의 정보를 구해와서 삭제한다.
DELETE FROM employee WHERE id = (SELECT id FROM employee where office_worker = '인턴' );

 

UPDATE 문 서브쿼리(UPDATE Subquery)

#인턴에 정보를 구해와서 급여를 10만원 인상한다.
UPDATE employee SET salary=(salary+100000)
WHERE id = (SELECT id FROM employee where office_worker = '인턴' );

 

실컷 설명하고 찬물 끼얹는 말이지만,

MySQL 기준

in 함수와 subquery 성능이 좋지 않으므로 쓰지 않는다.

 

IN ()은 INNER JOIN 혹은 EXISTS로 변환(대체) 가능

NOT IN()은 LEFT OUTER JOIN 혹은 NOT EXISTS로 변환가능하다

 

예제 파일 제공


[MariaDB] Subquery.sql
0.00MB

반응형
반응형

이클립스 IDE 사용하다 보면 메소드를 상속 받을 ,

// TODO Auto-generated method stub

자동으로 이런 주석이 달리죠 매번 지우기 번거롭기 때문에

 

위의 주석을 제거하는 방법을 알아 보겠습니다.

 

Eclipse -> Window -> Preferences

 

Java -> Code Style -> Code Templates -> Code -> Method body

Pattern: 박스 안에 // ${todo} Auto-generated method stub 부분을 지우시면 됩니다.

readonly 되어있어서 당황하지 마세요. 위에 Edit.. 버튼을 누르셔야 됩니다.

 

Edit... -> // ${todo} Auto-generated method stub 주석 제거 -> OK -> Apply and Close

 

이미 감 잡으신 분들도 있겠지만

Code 하위에 Method body 말고도 어노테이션이나 게터, 세터 등..

다른 것들도 자동으로 달리는 주석을 제거하실 수 있습니다.

반응형
반응형

AUTO_INCREMENT

 

 

개념


특정 데이터는 구분자가 되기위해 PK(Primary key) 설정을 한다.

PK 특징은 고유성(유니크) 가져야하기 때문에 똑같은 데이터를 넣을  없다.

 

그래서 보통 PK int 타입으로 겹치지않게 인덱스(정수값) 계속 올린다.

그때  인덱스(정수값) 체크해 자동으로 올려주는 옵션 바로 AUTO_INCREMENT이다.

자동으로 올려주는 옵션

자동으로 올려주는 옵션

 

한번 설정 해두면 Insert into   마다 자동으로 값을 올려준다.

 

 

조건


기본키(Primary Key)에만 옵션 부여가 가능하다.

 

 

 

문법


테이블 생성시 옵션 부여

CREATE TABLE auto_test(
id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64));

 

이미 생성한 테이블에 옵션 추가 - Command

ALTER TABLE auto_test MODIFY id INT NOT NULL AUTO_INCREMENT;

이미 생성한 테이블에 옵션 추가 - GUI (HeidiSQL 10.2.0.5599 version)

라디오 버튼 체크하고 밑에 저장을 눌러주면 된다.

 

 

AUTO_INCREMENT 초기화

 

개념


AUTO_INCREMENT 사용하다가 1~5번까지의 데이터를 넣어뒀다가

2~5 데이터를 지우고 데이터를 다시 생성(insert)해보면 다시 2~5 키의 데이터가 생성되는게 아니라

5~8번의 키를 가진 데이터가 생성된다.

 

값을 다시 2~5 데이터로 넣고 싶을 초기화를 해줘야한다.

 

문법


ALTER TABLE [TABLE] AUTO_INCREMENT = [시작 값];

주의 : 테이블에 새로 시작할 값보다 높은 값이 있으면 안됩니다. 

 

 

AUTO_INCREMENT 값을 초기화 후, 테이블 안의 모든 데이터의 ID값을 재조정 하기


무슨 말이냐 하면, 데이터 1000개가 존재하는데 많이 삭제됬다가 다시 생성되고 해서 첫번 데이터가 2000 or 10000 이런식으로 높게 존재할 경우

다시 1000개의 데이터를 1~1000번의 키를 가질 있게 하는 방법이다.

 

문법


ALTER TABLE tableName AUTO_INCREMENT=1;
SET @COUNT = 0;
UPDATE tableName SET auto_id(auto 설정한 컬럼) = @COUNT:=@COUNT+1;

 

 

반응형
반응형

오늘은 Mysql || MariaDB JOIN  (개념)  (문법  예시) 시작하겠습니다.

JOIN

개념


JOIN 연산은 두 테이블을 결합하는 연산입니다.

 

즉, 테이블은 각자에 맞는 데이터를 저장하고 있는데, 서로 다른 테이블에서 데이터를 가져오려면 JOIN 연산을 해야 합니다.

 

종류


Inner JOIN

 

Cross JOIN || 카티전 조인 || 상호 조인

 

OUTER JOIN || External JOIN

1.LEFT OUTER

2.RIGHT OUTER

3.FULL OUTER JOIN

 

 

문법에 들어가기 앞서, 공통 테이블 예시

CREATE TABLE people (

id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64),
age INT

)

CREATE TABLE card_company(

id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64),
amount_of_payment INT,
payment_location VARCHAR(64),
paymentdate DATETIME,
people_id INT 
)

INSERT INTO people VALUES(1,'김사원',24);

INSERT INTO people (NAME,age) VALUES('구대리',28);

INSERT INTO people (NAME,age) VALUES('허차장',42);

INSERT INTO people (NAME,age) VALUES('차부장',45);

INSERT INTO people (NAME,age) VALUES('홍임원',54);


insert into card_company VALUES(1,'NH',30000,'배달서비스','2019-11-09 23:02',1);

insert into card_company (name,amount_of_payment,payment_location,paymentdate,people_id) VALUES('shinhan',7700,'편의점','2019-11-09 10:10',1);
insert into card_company (name,amount_of_payment,payment_location,paymentdate,people_id) VALUES('KB',4500,'편의점','2019-11-09 15:21',1);
insert into card_company (name,amount_of_payment,payment_location,paymentdate,people_id) VALUES('KB',8550,'당구장','2019-11-09 19:35',1);
insert into card_company (name,amount_of_payment,payment_location,paymentdate,people_id) VALUES('shinhan',330000,'명품신발','2019-11-09 05:00',2);
insert into card_company (name,amount_of_payment,payment_location,paymentdate,people_id) VALUES('shinhan',4500000,'명품옷','2019-11-09 07:00',2);
insert into card_company (name,amount_of_payment,payment_location,paymentdate,people_id) VALUES('NH',400000,'돈 인출','2019-11-09 11:00',3);
insert into card_company (name,amount_of_payment,payment_location,paymentdate,people_id) VALUES('NH',1300000,'사성냉장고','2019-11-09 15:00',3);
insert into card_company (name,amount_of_payment,payment_location,paymentdate,people_id) VALUES('NH',10000000,'골프','2019-11-09 17:00',4);
insert into card_company (name,amount_of_payment,payment_location,paymentdate,people_id) VALUES('NH',15000000,'유흥','2019-11-09 03:00',4);
insert into card_company (name,amount_of_payment,payment_location,paymentdate,people_id) VALUES('NH',500,'문방구','2019-11-09 04:00',6);

people table (사람 정보 테이블)

card_company (카드 지출내역 테이블)

INNER JOIN

 

개념


두 테이블에 *교집합 이라고 생각을 하면 된다. 두 테이블에 공통된 값이 있으면 출력

INNER JOIN은 조인하는 테이블의 ON 절의 조건이 일치하는 결과만 출력됩니다.

 

*교집합 : 집합론에서, 두 집합 A와 B의 교집합 A ∩ B는 그 두 집합이 공통으로 포함하는 원소로 이루어진 집합이다.

 

 

문법


#inner join
SELECT * FROM people JOIN card_company ON people.id = card_company.people_id

간단 설명


ON people.id = card_company.people_id

사람테이블 id와 카드 테이블의 사람_id 맞는 정보만 가져왔다.

그 이유로 홍임원은 지출이 없어서 결과에 나오지 않았음. 

 

LEFT OUTER JOIN

 

개념

 


두 테이블 중에서 오른쪽 테이블에 조인시킬 컬럼의 값이 없는 경우에 사용을 하게 됩니다. 왼쪽 테이블 (Table A)의 값은 모두 다 나오지만 오른쪽 테이블 (Table B)의 값은 매칭이 되는게 없으면 출력이 되지 않음.

말 그대로 왼쪽 테이블 정보는 무조건 다 나옴

왼쪽 테이블 정보는 무조건 다 나옴

왼쪽 테이블 정보는 무조건 다 나옴

 

문법


#LEFT OUTER join
SELECT * FROM people LEFT OUTER JOIN card_company ON people.id = card_company.people_id

간단 설명


위에서 3번 강조한 것처럼 왼쪽!! 테이블정보가 다 출력되어서 홍임원은 지출내역이 없지만 출력된 모습.

 

RIGHT OUTER JOIN

 

개념


두 테이블 중에서 오른쪽 테이블에 조인시킬 컬럼의 값이 없는 경우에 사용을 하게 됩니다. 오른쪽 테이블 (Table B)의 값은 모두 다 나오지만 왼쪽 테이블 (Table A)의 값은 매칭이 되는게 없으면 출력이 되지 않음.

말 그대로 오른쪽 테이블 정보는 무조건 다 나옴

오른쪽 테이블 정보는 무조건 다 나옴

오른쪽 테이블 정보는 무조건 다 나옴

 

문법


#RIGHT OUTER JOIN
SELECT * FROM people RIGHT OUTER JOIN card_company ON people.id = card_company.people_id

간단 설명


위에서 3번 강조한 것처럼 오른쪽!! 테이블정보가 다 출력되어서 people 테이블에 6번이라는 id를 가진 사람은 없지만 출력이 된 모습.

제가 일부러 안맞는 데이터를 하나씩 넣어두었습니다.

 

 

CROSS JOIN(상호 조인,카티전 조인)

 

개념


한 쪽 테이블의 모든 행들과 다른 테이블의 모든 행을 조인시키는 기능

 

모든 경우의 수, 즉 A 테이블 row 개수 X B 테이블 row 개수 만큼의 row를 가진 테이블이 출력

*Cartesian Product, 곱집합 이용

 

 

문법


#CROSS JOIN
SELECT * FROM people CROSS JOIN card_company

..데이터 중간 생략

간단 설명


people row 5개

card_company 11개

5X11=55개의 ROW 출력됨.

 

사용 이유


cross join은 사용이유가 궁금하니 이것만 특별하게 사용 이유를 알아보자.

대개 테스트로 사용할 대용량의 테이블을 생성할 경우에 사용된다.

예를 들어, 각 1 만건과 10 만건의 테이블을 CROSS JOIN 하면 10억건의 데이터를 생성시킬 수 있다.

 

 

SELF JOIN

 

개념


별도의 구문이 있는 것이 아니라, 자기 자신과 자기 자신이 조인한다는 의미

SELECT * FROM people SELF JOIN card_company 같은 문법이 있는게 아니라

그대로 자기 자신의 테이블 컬럼끼리 조인을 한다고 보면 된다.

 

문법


SELF JOIN을 위한 예시 테이블

CREATE table ugaga_tribes (
id INT AUTO_INCREMENT PRIMARY KEY ,
name VARCHAR(64),
classes_id INT
)

insert into ugaga_tribes VALUES(1,'족장_우가콜라',null);

insert into ugaga_tribes (name,classes_id) VALUES('부족장_우가펩시',1);
insert into ugaga_tribes (name,classes_id) VALUES('부하1_우가팔일오',2);
insert into ugaga_tribes (name,classes_id) VALUES('부하2_우가우간다',3);
insert into ugaga_tribes (name,classes_id) VALUES('부하3_우가막내',4);

 

SELF JOIN-INNER JOIN 사용

#Self join-Inner join
SELECT ut_a.id,ut_a.name AS 부하 ,ut_b.name AS 상관
FROM ugaga_tribes ut_a 
JOIN ugaga_tribes ut_b 
ON ut_a.classes_id = ut_b.id;

간단 설명


 

ON ut_a.classes_id = ut_b.id; - inner join의 특징은 서로 일치하는 값을 표현하는것이라고 위에서 말했다.

상관의 ID(ut_a.classes_id) 부하의 ID(ut_b.id)가 일치하는 값만 출력하기 때문에 위와 같은 결과가 나왔다.

 

상관이 없는 부족들까지 출력하기.

SELF JOIN-LEFT JOIN 사용

#Self join-Left join
SELECT ut_a.id,ut_a.name,ut_b.name 
FROM ugaga_tribes ut_a 
LEFT JOIN ugaga_tribes ut_b 
ON ut_a.classes_id = ut_b.id;

간단 설명


ugaga_tribes ut_a  LEFT JOIN ugaga_tribes ut_b , 즉 같은 테이블이긴 하지만 위에 LEFT JOIN처럼 왼쪽!! 테이블 정보가 모두 출력되어 저 결과을 출력 할 수 있다.

 

 

JOIN 조건 걸기


JOIN을 사용하다 보면 굉장히 복잡한 쿼리문이 탄생하는데요,

실무에 투입되면 분명 JOIN에 조건을 걸어야 할 일이 생깁니다.

 

바로 알아보겠습니다.

위에 SELF JOIN-LEFT JOIN 사용 예제에 조건을 달아보겠습니다.

 

ut_b에 id가 2 이상인 데이터만 출력하기

SELECT ut_a.id,ut_a.name,ut_b.name 
FROM ugaga_tribes ut_a 
LEFT JOIN ugaga_tribes ut_b 
ON ut_a.classes_id = ut_b.id AND ut_b.id > 2;

ut_b에 name이 '부족'이 포함된 데이터만 출력하기

SELECT ut_a.id,ut_a.name,ut_b.name 
FROM ugaga_tribes ut_a 
LEFT JOIN ugaga_tribes ut_b 
ON ut_a.classes_id = ut_b.id AND ut_b.name LIKE '%부족%';

 

JOIN에 조건을 주고 싶을 땐, on절에 and를 이용하여 값을 추가하면 됩니다. 

 

 

예제 파일 제공


[MariaDB] JOIN.sql
0.00MB

반응형
반응형

resultType

 


문법 예시

<select id="getUser" resultType="string">
쿼리 내용...
</select>

<select id="getCompany" resultType="hashmap">
쿼리 내용...
</select>

<select id="getService" resultType="DTOclass">
쿼리 내용...
</select>

 

 

별칭(alias)

데이터 형태(data type)

string

String

date

Date

map

Map

hashmap

HashMap

list

List

arraylist

ArrayList

decimal

BigDecimal

bigdecimal

BigDecimal

biginteger

BigInteger

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

_byte[]

byte[]

_long[]

long[]

_short[]

short[]

_int[]

int[]

_integer[]

int[]

_double[]

double[]

_float[]

float[]

_boolean[]

boolean[]

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

byte[]

Byte[]

long[]

Long[]

short[]

Short[]

int[]

Integer[]

integer[]

Integer[]

double[]

Double[]

float[]

Float[]

boolean[]

Boolean[]

object

Object

date[]

Date[]

decimal[]

BigDecimal[]

bigdecimal[]

BigDecimal[]

biginteger[]

BigInteger[]

object[]

Object[]

collection

Collection

iterator

Iterator

ResultSet

ResultSet

※주의 : 원시형의 경우는 언더스코어(_)를 앞에 붙인다. 붙이지 않는 경우 *래퍼(Wrapper) 클래스로 변환된다.

 

*래퍼(Wrapper) 클래스 : 포장 클래스

이 글 참고

 

[Java]기본형(primitive type)과 참조형(reference type) (feat.Integer와 int 차이점)

오늘은 Java 기본형(primitive type)과 참조형(reference type) 종류 및 특징,사용 이유에 대해 시작하겠습니다. 자바는 크게 기본형(primitive type), Wrapper Class 참조형(reference type)으로 나눠진다. Primi..

java119.tistory.com

 

반응형
반응형

이 글을 본 사람은 다 이해하진 못해도 자기가 코딩을 하다 예외가 떨어지면

아 오류 났네, 에러 났네 하지 말고 아 예외 떨어졌네. 익셉션 떨어졌네.라고 해줍시다.

그리고 제에발! 제발!!!!!!!!!

제목 : "어떤 기능 개발 중 에러 ㅠㅠ" 하면서 커뮤니티에 100 줄 넘는 예외 코드 올리지 말고

무슨 예외 났는지부터 봅시다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

오류(Error 에러)

 

개념


에러(Error)란 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램에 이상이 생겼거나 JVM 실행에 문제가 생겼을 경우 발생하는 것

따라서 개발자가 미리 예측하여 처리할 수 없기 때문에, 애플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 된다.

 

오류(Error 에러)- 시스템 레벨에서 발생

 

 

종류


Throwable 하위

Error 하위

VirtualMachineError 하위

OutOfMemoryError

StackOverflowError (보자마자 사이트가 생각나는 엄청난 파급력..)

.. 외에 여러 것들이 있다

 

 

Exception(예외) 

 

개념


사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류.

 

예외가 발생하면 프로그램이 종료가 된다는 것은 에러와 동일하지만 예외는 예외처리(Exception Handling)를 통해 프로그램을 종료되지 않고 정상적으로 작동되게 만들어줄 수 있습니다. 자바에서 예외처리는 Try Catch문을 통해 해 줄 수 있습니다.

 

예외(Exception)- 개발자가 구현한 로직에서 발생

 

즉,

예외는 발생할 상황을 미리 예측하여 처리할 수 있다

 

있 기 문 에

있 기 문 에

있 기 문 에

 

예외의 개념을 확실히 알고 다음 글인 예외처리를 확실히 하자.

 

 

종류


Checked Exception과 Unchecked Exception

 

 

Checked Exception

 

특징


반드시 예외 처리 해야함.

반드시 예외 처리 해야함.

반드시 예외 처리 해야함.

 

확인 : 컴파일 단계

 

예외 발생시 트랜잭션 처리 : *roll-back 하지 않음

 

*roll-back : 롤백(rollback)은 데이터베이스에서 업데이트에 오류가 발생할 때, 이전 상태로 되돌리는 것을 말한다.

 

대표 예외

RuntimeException 제외한 모든 예외

IOException

SQLException  지금은 없다.

 

Unchecked Exception

 

특징


예외 처리를 반드시 하지 않아도 .

예외 처리를 반드시 하지 않아도 .

예외 처리를 반드시 하지 않아도 .

 

확인 : 실행단계 확인

 

예외 발생시 트랜잭션 처리 : *roll-back 진행됨.

 

*roll-back : 롤백(rollback)은 데이터베이스에서 업데이트에 오류가 발생할 때, 이전 상태로 되돌리는 것을 말한다.

 

대표 예외

RuntimeException 하위 예외

NullPointException

IllegalArgumentException

IndexOutOfBoundException

SystemException

 

자주 보는 대표 예외들


java.xxx. ~ Exception

 

ArithmeticException

정수를 0으로 나눌경우 발생 

int c = 4 / 0;

 

ArrayIndexOutOfBoundsExcetion

배열의 범위를 벗어난 index를 접근할 시 발생

int[] a = {1, 2, 3};
System.out.println(a[3]);

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at Test.main(Test.java:17)

a [3] 있지 않냐? 배열은 0부터 시작 ^^..

 

FileNotFoundException

파일을 못 찾을 때 발생

BufferedReader br = new BufferedReader(new FileReader("emptyfile.txt"));
br.readLine();
br.close();

Exception in thread "main" java.io.FileNotFoundException: emptyfile.txt (지정된 파일을 찾을 수 없습니다) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream. <init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileReader. <init>(Unknown Source)...

 

ClassCastExcetion

변환할 수 없는 타입으로 객체를 반환 시 발생 

Integer.parseInt(Object)

심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer] with root cause

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

참고 글.

 

[Java] java.lang.ClassCastException

예외 상황1 원인 심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.Long..

java119.tistory.com

 

NullPointException (저랑은 이미 절친인 Exception ^^)

존재하지 않는 레퍼런스를 참조할 때 발생 

(거의 대부분은 객체가 제대로 생성되지 않은 경우 발생). 

String a = null; 
    if (a.equals("비교값")) { 
        System.out.println("equals");
    } else {
        System.out.println("!equals");
    }
    
//Spring 예시
@RequestMapping("menu/menuTest001.do")
	public ModelAndView workflowConfig() {
		ModelAndView mav = new ModelAndView();
		return mav;
	}
//menuTest001 이라는 jsp가 존재하지 않을 때.

 

IllegalArgumentException

잘못된 인자를 전달할 때 발생 

public String print(String x) throws Exception;

<select id="prints" statementType="CALLABLE" parameterType="String" resultType="String">
</select>

//dao - print 호출 MyBatis - prints

java.lang.IllegalArgumentException: Mapped Statements collection does not contain value xxx.xxx.xxx.xxx

 

IllegalArgumentException MyBatis 절친이다.

MyBatis 쓰다가 예외가 발생했다면 주 원인

1.mapper id가 틀린 경우

2.Parameter와 bean의 field명이  틀린 경우

3.sql.xml에서 정의된 namespace와 DAO에서 호출하는 namespace가 다를 경우

4.mapper가 정의가 되어 있지 않거나 Spelling이 틀린 경우

5.mapper에 정의된 namespace 명칭이 같은 Application 내에 중복될 경우

참고 글.

 

[MyBatis] 관련 오류(예외)시 꼭! 확인해야 될 사항

오키에 어떤 멋진 선배님이 덧글로 남긴 거 퍼옵니다. 이 사항들만 잘 지켜도 오류(예외) 해결 됩니다. 하나하나 다시 되돌아보시기 바랍니다. 1. 에러 출력되는 부분은 없습니까? 2. 디비 설정이 디비명, 테이블..

java119.tistory.com

IOException

입출력 동작 실패 또는 인터럽트 시 발생

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int age=0;
age = Integer.parseInt(in.readLine());

//IOException을 강제로 써야하지만 안쓰고 바로 Run을 실행한 상태.

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 

Unhandled exception type IOException

 

BufferedReader, InputStreamReader 파일 I/O 관련 함수를 쓰려면

강제로 try/catch 하거나 throws IOException

(Checked Exception 특징 하나가 반드시 예외를 처리해야함 이라고 나와있었죠)

 

OutOfMemoryException

메모리가 부족한 경우 발생  

Exception in thread “main”: java.lang.OutOfMemoryError: Java heap spac
Heap size의 부족으로 Java Object를 Heap에 할당하지 못하는 경우.

Exception in thread “main”: java.lang.OutOfMemoryError: PermGen space
Class나 Method 객체를 PermGen space에 할당하지 못하는 경우 발생

애플리케이션에서 너무 많은 class를 로드할 때 발생한다.
주로 잘못된 설계/구현에 의해 발생한다.
-XX:PermSize, -XX:MaxPermSize Option을 이용하여 오류를 수정하기도 한다.

Exception in thread “main”: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
사용할 배열의 사이즈가 VM에서 정의될 사이즈를 초과할 때 발생한다.

Exception in thread “main”: java.lang.OutOfMemoryError: request bytes for . Out of swap space?
Java는 런타임시 물리적 메모리를 초과한 경우 가상메모리를 확장해 사용하게 되는데 가용한 가상메모리가 없을 경우 발생한다.

Exception in thread “main”: java.lang.OutOfMemoryError: (Native method)
JVM에 설정된 것 보다 큰 native메모리가 호출 될 때 발생한다.

코드는 아니지만 길어서 코드 블록에 가둔다.

 

NumberFormatException

문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환시 발생

String str = "OO7oO";
System.out.println(Integer.parseInt(str));

00700 아닌 영문 O 섞인 OO7OO

Exception in thread "main" java.lang.NumberFormatException: For input string: "OO7OO"

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at com.java119.test.JavaNFE.main(JavaNFE.java:5)

 

아니면 parseInt()인데 받는 값이 int 맥스인 2147483647를 넘는 경우에도 발생한다.

int a = Integer.parseInt(2147483648);

 

NoClassDefFoundException 

Exception in thread "main" java.lang.NoClassDefFoundError: Hello

‘Hello라는 클래스를 찾을 수 없다.’는 뜻이다. 클래스의 ‘Hello'의 철자, 특히 대소문자를 확인해보고 이상이 없으면 클래스 파일(*. class)이 생성되었는지 확인한다.

 예를 들어 ‘Hello.java’가 정상적으로 컴파일되었다면 클래스 파일 ‘Hello.class’가 있어야 한다. 클래스 파일이 존재하는데도 동일한 메시지가 반복해서 나타난다면

클래스 패스(classpath)의 설정이 바르게 되었는지 다시 확인해보자.

 

ClassNotFoundException

java.lang.ClassNotFoundException

컴파일된 java class 파일을 찾을 없다.

 

해당 경로에 분명 파일이 있음에도, 두개의 익셉션이 뜬다면?

참고 글.

 

[Eclipse] 잘되던 프로젝트가 갑자기 안될때(feat.HTTP 404)

이 글은 이클립스(IDE) 기반으로 설명합니다. 어제까지 잘되던 프로젝트가 내일 출근하고 보니 맛(?)이 갈 때가 있습니다. 바아로 따라해봅시다 1.Project 2.Clean… 1.Servers 탭 2.Tomcat version Server..

java119.tistory.com

NoSuchMethodException 

Exception in thread "main" java.lang.NoSuchMethodError: main

public static void mains(String []s args

‘main메서드를 찾을 수 없다.’는 뜻인데 실제로 클래스 내에 main메서드가 존재하지 않거나 메서드의 선언부(public static void main(String [] args))에 오타가 존재하는 경우에 발생한다.

 

Spring 관련 예외


BadSqlGrammarException

org.springframework.jdbc.BadSqlGrammarException:

컬럼명을 잘못 기술했을 경우 나타나는 예외

<select id="get~" resultType="DTO">
select from table
</select>
// select * from table *(아스타)가 빠짐.
// 외에 DB 컬럼명과 다르게 호출 할 경우 발생. id - ids

 


어디서 한 번씩은 본거 같은 Java 예외 리스트


java.io

  • IOException
  • CharConversionException
  • EOFException
  • FileNotFoundException
  • InterruptedIOException
  • ObjectStreamException
    • InvalidClassException
    • InvalidObjectException
    • NotActiveException
    • NotSerializableException
    • OptionalDataException
    • StreamCorruptedException
    • WriteAbortedException
  • SyncFailedException
  • UnsupportedEncodingException
  • UTFDataFormatException
  • UncheckedIOException

java.lang

  • ReflectiveOperationException
  • ClassNotFoundException
  • InstantiationException
  • IllegalAccessException
  • InvocationTargetException
  • NoSuchFieldException
  • NoSuchMethodException
  • CloneNotSupportedException
  • InterruptedException
  • 산술 예외
  • IndexOutOfBoundsException
  • ArrayIndexOutOfBoundsException
  • StringIndexOutOfBoundsException
  • ArrayStoreException
  • ClassCastException
  • EnumConstantNotPresentException
  • IllegalArgumentException
  • IllegalThreadStateException
  • NumberFormatException
  • IllegalMonitorStateException
  • IllegalStateException
  • NegativeArraySizeException
  • NullPointerException
  • SecurityException
  • TypeNotPresentException
  • UnsupportedOperationException

java.net

  • HttpRetryException
  • SocketTimeoutException
  • MalformedURLException
  • ProtocolException
  • SocketException
  • BindException
  • ConnectException
  • NoRouteToHostException
  • PortUnreachableException
  • UnknownHostException
  • UnknownServiceException
  • URISyntaxException

java.text

  • ParseException

 

java.time

  • DateTimeException

 

java.time.zone

  • ZoneRulesException

더욱더 자세한 Java Exception 보고 싶은 변태 멋진 분들은 여기 링크 남깁니다.

https://programming.guide/java/list-of-java-exceptions.html

 

더욱더 자세한 Spring Exception 보고 싶은 변태 멋진 분들은 여기 링크 남깁니다.

https://stackoverflow.com/questions/7561550/list-of-spring-runtime-exceptions

 

 

글은 제가 새로운 Exception 만날 때마다 수정/추가 될 예정입니다.

 

다음은 try catch 정확한 사용법을 알아보겠습니다. 개념 문법 위주

반응형

+ Recent posts