[TIL]20250307

김민석·2025년 3월 8일
post-thumbnail

오늘 목표

  • 수업전 7시 기상 후 운동(O)
  • 수업내용 정리 및 모르는 내용 복습(O)
  • 프로그래머스 문제 풀기(O)
  • js프로젝트에 배운내용 적용해보기(O)
  • 주말동안 DB내용 복습 및 정리해보기(O)

공부 내용

MySQL 사용자 생성 & 권한 부여

  1. 모든 호스트에서 사용하는 ureca라는 사용자 생성. 비밀번호?는 ‘ureca’.
    CREATE user 'ureca'@'%' identified by 'ureca';
  2. 1번에서 생성한 ureca에게 모든 권한 설정
    GRANT ALL privileges on *.* to 'ureca'@'%' with grant option;
  3. 실제로 권한 부여
    FLUSH privileges; -- 실제로 부여

Create Table

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

DROP TABLE : 테이블 삭제
TRUNCATE TABLE : 테이블 내용물 모두 삭제. 테이블은 남음. 속도가 더 빠르다 ROLLBACK이 불가능한 명령어이다.

Alter Table

테이블을 수정.

컬럼 추가
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;
  • 수정한 테이블이 기존 데이터와 맞지 않으면 테이블이 수정되지 않음!

Insert

테이블에 새 record(행)을 추가한다.

INSERT INTO member(id, name) -- 순서대로 데이터를 입력하면 괄호 생략 가능
VALUES (23, '홍길동');

트랜잭션 Transaciton

트랜잭션을 가동하면, 명령어를 잘못 쳤을 경우 작업을 되돌릴 수 있다.

START TRANSACTION; -- 트랜잭션 가동
DELETE FROM member; -- 전부 삭제
ROLLBACK; -- 되돌리기
COMMIT; -- 작업 확정: 모든 데이터 변경사항을 영구적으로 적용. 현재 트랜잭션 종료.

JDBC

JDBC(Java Database Connectivity)는 Java 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트하거나, 데이터베이스에 저장된 데이터를 Java에서 사용할 수 있도록 하는 자바 API이다.
JDBC는 Java 애플리케이션에서 데이터베이스에 접근하기 위해 JDBC API를 사용하여 데이터베이스에 연동할 수 있으며, 데이터베이스에서 자료를 쿼리(Query)하거나 업데이트하는 방법을 제공한다.

DB 연동 과정

  1. 드라이버 등록 jdbc 드라이버)
  2. 연결
  3. statment 생성
  4. SQL 전송
  5. 결과 얻기
  6. 자원 종료

MySQL에서 Java 프로젝트로 데이터 받아오기

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();
		}

	}

}

SQL

-- 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 문법

DTO,DAO,Controller,Service

그림을 설명하자면 사용자가 데이터를 호출(요청)하여 >>방향으로 진행하여 DB까지 진입한뒤
반대로 사용자가 호출(요청)했던 값을 다시 리턴 과정을 반복하여 역순으로 데이터를
전달해주는 것 입니다.

좀 더 자세히 말하자면
Controller 는 사용자의 요청을 먼저 처리해주는 역할을하며 요청에따라 Service를 호출합니다.
Service 는 비지니스 로직을 수행하여 데이터베이스에 접근하기위해 DAO를 이용하여 Controller가 요청한 결과값을 받아오는 역할을 수행합니다.
DAO는 비지니스 로직(service 가 요청) 실행에 필요한 각각의 로직의 DB CRUD를 실행하는 역할
DB 는 DAO에서 받은 호출(요청)에 따른 코드를 실행하고 결과값을 다시 DAO에게 반환하여 DAO는
다시역순으로 반환하여 사용자에게 최종적으로 리턴됩니다.

CORS 에러 해결하기

@CrossOrigin(origins = "http://localhost:5500")
Controller 클래스에 crossOrigin을 설정하여 서버에서 성공적으로 응답을 하지만, 헤더에 CORS가 허용되어 있지 않으면 브라우저에서 응답을 막는 것을 해결해줌.

의존성 주입 (DI)

DI이란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 런타임에 동적으로 두 객체의 관계를 정의해주는 것을 말한다.
ProductController는 ProductService, ProductService는 ProductDao의 생성자를 호출한다. 즉, ProductController 클래스는 ProductService 클래스에 의존하고, ProductService 클래스는 ProductDao 클래스에 의존한다. 두 클래스가 강하게 결합되어 있으면 유연성이 떨어진다. 이를 해결하기 위해 런타임 시에 클래스가 아닌 객체 간에 의존성을 주입하여 클래스의 결합도를 낮추고 유연성을 높인다.

포트 번호를 바꾸기

application.properties 파일에 원하는 포트번호 server.port=8888 입력

profile
나만의 기록장

0개의 댓글