CREATE user 'ureca'@'%' identified by 'ureca';GRANT ALL privileges on *.* to 'ureca'@'%' with grant option;use ureka; -- 어떤 테이블을 사용할 것인가
CREATE TABLE product(
name varchar(50),
price int
);
CREATE TABLE persons (
personID int,
lastName varchar(255),
firstName varchar(255),
address varchar(255),
city varchar(255)
);
password는 암호화하여 저장하기 때문에 실제 길이가 매우 길다.
DROP TABLE : 테이블 삭제
TRUNCATE TABLE : 테이블 내용물 모두 삭제. 테이블은 남음. 속도가 더 빠르다 ROLLBACK이 불가능한 명령어이다.
테이블을 수정.
컬럼 추가
ALTER TABLE table_name
ADD column_name datatype;
ALTER TABLE Customers
ADD Email varchar(255);
-- 컬럼 삭제
ALTER TABLE table_name
DROP COLUMN column_name;
ALTER TABLE Customers
DROP COLUMN Email;
테이블에 새 record(행)을 추가한다.
INSERT INTO member(id, name) -- 순서대로 데이터를 입력하면 괄호 생략 가능
VALUES (23, '홍길동');
트랜잭션을 가동하면, 명령어를 잘못 쳤을 경우 작업을 되돌릴 수 있다.
START TRANSACTION; -- 트랜잭션 가동
DELETE FROM member; -- 전부 삭제
ROLLBACK; -- 되돌리기
COMMIT; -- 작업 확정: 모든 데이터 변경사항을 영구적으로 적용. 현재 트랜잭션 종료.
JDBC(Java Database Connectivity)는 Java 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트하거나, 데이터베이스에 저장된 데이터를 Java에서 사용할 수 있도록 하는 자바 API이다.
JDBC는 Java 애플리케이션에서 데이터베이스에 접근하기 위해 JDBC API를 사용하여 데이터베이스에 연동할 수 있으며, 데이터베이스에서 자료를 쿼리(Query)하거나 업데이트하는 방법을 제공한다.
import java.sql.*;
public class SelectTest {
public static void main(String[] args) {
// JDBC 6단계
try {
// 1. Driver 등록
Class.forName("com.mysql.cj.jdbc.Driver"); // 대표 드라이버 클래스 이름으로 작성
// 2. Connection
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/ureca", "ureca", "ureca"); // url, user, pw
// 3. Statement 생성
Statement stmt = con.createStatement();
// 4. SQL 전송
ResultSet rs = stmt.executeQuery("select * from member");
System.out.println(rs);
// 5. 결과 얻기
while (rs.next()) {
String id = rs.getString("id");
String pw = rs.getString("pw");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(id + ":" + pw + ":" + name + ":" + age);
}
// 6. 자원 종료 (연 순서의 반대 순서로 닫아줌)
rs.close();
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
-- customers 테이블에서 country(국가)를 중복 제거한 후 개수를 구함
SELECT COUNT(DISTINCT country) FROM customers;
-- 이중 쿼리를 사용하여 country를 중복 제거한 후 개수를 구함
SELECT COUNT(*) AS distinctan
FROM (SELECT DISTINCT country FROM customers) c;
-- country가 'Mexico'인 고객 정보를 조회
SELECT * FROM customers WHERE country = 'Mexico';
-- products 테이블을 price 기준으로 오름차순 정렬하여 조회
SELECT * FROM products ORDER BY price;
-- products 테이블을 price 기준으로 내림차순 정렬하여 조회
SELECT * FROM products ORDER BY price DESC;
-- customers 테이블을 pric오름차순 정렬 후 customername 내림차순 정렬하여 조회
SELECT * FROM customers ORDER BY price ASC, CustomerName DESC;
-- 고객 이름이 'A'로 시작하는 고객 정보를 조회
SELECT * FROM customers WHERE customername LIKE 'A%';
-- city(도시) 값이 'L_nd__' 패턴과 일치하는 고객 정보 조회
-- 언더바(_)는 한 글자를 의미하며, 예를 들어 'London'이 매칭될 수 있음
SELECT * FROM customers WHERE city LIKE 'L_nd__';
-- 고객 이름에 'a'가 포함된 고객 정보를 조회
SELECT * FROM customers WHERE customername LIKE '%a%';
-- 고객 이름이 'z'로 끝나는 고객 정보를 조회
SELECT * FROM customers WHERE customername LIKE '%z';
-- customers 테이블에서 처음 10개의 행만 조회
SELECT * FROM customers LIMIT 10;
-- 각 categoryId별로 가장 낮은 price를 조회
SELECT MIN(price) AS smallprice, categoryId
FROM products
GROUP BY categoryId;
-- orders 테이블과 customers 테이블을 customerid 기준으로 내부 조인
-- 주문 ID(orderid), 주문 날짜(orderdate), 고객 ID(orders.customerid), 고객 이름(customername) 조회
SELECT orderid, orderdate, orders.customerid, customername
FROM orders
INNER JOIN customers ON orders.customerid = customers.customerid;
-- table에 product가 있을 시 삭제
drop table if exists product;
--
//데이터데이브 설정
use ureca;
//변경된 내용을 모두 영구 저장한다. COMMIT 수행하면, 하나의 트랜젝션 과정을 종료하게 된다.
commit;

-- 내부 조인 --
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
(INNER) JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
-- 왼쪽 외부 조인 --
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
LEFT (OUTER) JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
-- 오른쪽 외부 조인 --
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
RIGHT (OUTER) JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
-- 전체 외부 조인 --
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
CROSS JOIN Customers ON Orders.CustomerID=Customers.CustomerID; -- MySQL 문법

그림을 설명하자면 사용자가 데이터를 호출(요청)하여 >>방향으로 진행하여 DB까지 진입한뒤
반대로 사용자가 호출(요청)했던 값을 다시 리턴 과정을 반복하여 역순으로 데이터를
전달해주는 것 입니다.
좀 더 자세히 말하자면
Controller 는 사용자의 요청을 먼저 처리해주는 역할을하며 요청에따라 Service를 호출합니다.
Service 는 비지니스 로직을 수행하여 데이터베이스에 접근하기위해 DAO를 이용하여 Controller가 요청한 결과값을 받아오는 역할을 수행합니다.
DAO는 비지니스 로직(service 가 요청) 실행에 필요한 각각의 로직의 DB CRUD를 실행하는 역할
DB 는 DAO에서 받은 호출(요청)에 따른 코드를 실행하고 결과값을 다시 DAO에게 반환하여 DAO는
다시역순으로 반환하여 사용자에게 최종적으로 리턴됩니다.
@CrossOrigin(origins = "http://localhost:5500")
Controller 클래스에 crossOrigin을 설정하여 서버에서 성공적으로 응답을 하지만, 헤더에 CORS가 허용되어 있지 않으면 브라우저에서 응답을 막는 것을 해결해줌.
DI이란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 런타임에 동적으로 두 객체의 관계를 정의해주는 것을 말한다.
ProductController는 ProductService, ProductService는 ProductDao의 생성자를 호출한다. 즉, ProductController 클래스는 ProductService 클래스에 의존하고, ProductService 클래스는 ProductDao 클래스에 의존한다. 두 클래스가 강하게 결합되어 있으면 유연성이 떨어진다. 이를 해결하기 위해 런타임 시에 클래스가 아닌 객체 간에 의존성을 주입하여 클래스의 결합도를 낮추고 유연성을 높인다.
application.properties 파일에 원하는 포트번호 server.port=8888 입력