오늘은
오늘은 학원 수업이 끝나고 집에서 책상과 컴퓨터를 옮기고
대청소를 하느라 공부 진도를 많이 나가지 못하였습니다..
HTML을 하루라도 빨리 끝내고 CSS를 배우고 싶은데
마음이 조급해지는 것 같습니다
학원 수업
<<Database>>
개념 모델링
- 개체 관계도 (ER-Diagram)
- 사각형 : 엔티티(Entity), 원형 : 속성(Attrubute), 마름모 : 관계(relation)
- IE(Information Engeering)표기 : 새발(crow foot)
논리 모델링
물리 모델링
- 테이블(Entity), 칼럼(속성), 자료형(byte)
학교 데이터베이스
학과 - 1개(학과명, 전화번호, 사무실위치)
학생 - 여러명(학번, 이름, 나이, 성별, 주소, 학과명)
1대 다(多)
-- 학교 데이터베이스 구축
-- 학과 테이블 생성
CREATE TABLE major(
subject VARCHAR2(20) PRIMARY KEY,
mp VARCHAR2(20) NOT NULL, -- 필수 입력
location VARCHAR2(30) NOT NULL
);
-- 학과 추가
INSERT INTO major(subject, mp, location)
VALUES ('소프트웨어학과', '02-1234-5678', 'B동 3층');
INSERT INTO major(subject, mp, location)
VALUES ('화학공학과', '02-2222-7777', 'B동 4층');
INSERT INTO major(subject, mp, location)
VALUES ('전기전자공학과', '02-3333-8888', 'B동 5층');
-- 오류 : 열에 대한 값이 너무 큼
-- 학과명 자료의 크기 변경
ALTER TABLE major MODIFY subject VARCHAR2(30);
-- 전체 데이터 조회
SELECT * FROM major;
-- 학과명과 전화번호만 출력
-- 레일블 바꾸기 = 별칭 as (as 생략 가능)
SELECT subject AS 학과명, mp AS 전화번호 FROM major;
COMMIT;
-- 학생 테이블 생성
CREATE TABLE student(
snum NUMBER PRIMARY KEY,
sname VARCHAR2(20) NOT NULL,
age NUMBER(2) NOT NULL,
gender VARCHAR2(6) NOT NULL,
address VARCHAR2(50),
subject VARCHAR2(30) NOT NULL,
FOREIGN KEY(subject) REFERENCES major(subject)
);
-- 학생 추가
INSERT INTO student(snum, sname, age, gender, address, subject) -- ( )를 넣지 않는 경우 모두 포함한다는 의미
VALUES(1001, '이강', 22, '여자', '서울시 강서구', '소프트웨어학과');
INSERT INTO student(snum, sname, age, gender, address, subject)
VALUES(1002, '박대양',34, '남자', '인천시 남구', '전기전자공학과');
INSERT INTO student(snum, sname, age, gender, address, subject)
VALUES(1003, '우영우', 31, '여자', '', '화학공학과');
-- 부모키에 없는 데이터는 삽입 이상을 일으킨다
INSERT INTO student(snum, sname, age, gender, address, subject)
VALUES(1003, '김산', 29, '남자', '서울시 동대문구', '회계학과');
-- 전체 학생 조회
SELECT * FROM student;
-- 이름이 이강인 학생 조회
SELECT snum, sname, age FROM student
WHERE sname = '이강';
-- 이름에 '우'가 포함된 학생의 모든 정보 출력
SELECT * FROM student
WHERE sname Like '%우%'; -- %우 = 우로 끝나는, 우% = 우로 시작, %우% = 우 포함
-- 나이가 30세 이상이고, 성별이 남자인 학생의 모든 정보 출력
SELECT * FROM student
WHERE age >= 30 AND gender = '남자';
-- 주소가 없는 학생의 정보 출력
SELECT * FROM student
WHERE address IS NULL;
-- 주소가 데이터가 없는 학생 삭제하기
DELETE FROM student
WHERE address IS NULL;
-- 주소가 없는 학생 삭제하기
DELETE FROM student
WHERE address = ' ';
-- 주소가 null인 데이터에 '수원시 영통구'로 입력
UPDATE student
SET address = '수원시 영통구'
WHERE address IS NULL;
-- 정렬하기(오름차순-ASC, 내림차순-DESC)
-- 학생의 나이가 적은 순으로 정렬하여 출력하시오
SELECT * FROM student
ORDER BY age; -- 생략하면 오름차순
-- 학생의 나이가 많은 순으로 정렬하여 출력하시오
SELECT * FROM student
ORDER BY age DESC;
-- 여자 중에 나이가 많은 순으로 정렬하여 출력하시오
SELECT * FROM student
WHERE gender = '여자'
ORDER BY age DESC; -- 정렬 = 마지막 순서
COMMIT;
-- 트랜잭션(롤백은 커밋하기 전에 실행하면 취소, 복원이 됨)
ROLLBACK;
DROP TABLE student;
'' = null - 데이터 없음
' ' = 공백문자 - 데이터O
조건절 = WHERE
정렬절 = ORDER BY
SQL
1. DDL - CREATE, ALTER, DROP
2. DML - INSERT, SELECT, UPDATE, DELETE
* 삽입
INSERT INTO 칼럼명 VALUES(칼럼값)
* 수정
UPDATE 테이블이름 SET 변경할 칼럼 = 변경할 칼럽값
WHERE 조건절
* 삭제
DELETE FROM 테이블명
WHERE 조건절
* 검색
SELECT 칼럼명 FROM 테이블명
SELECT DISTINCT 칼럼명 FROM 테이블명 => 중복 없이 검색
WHERE 칼럼명 BETWEEN a AND b; => 사이 값 검색
3. 트랜잭션(Transaction) - COMMIT, ROLLBACK
4. DCL - GRANT(권한 부여), REVOKE(권한 뺏기)
계정 - system
mydb로 새 계정 생성
계정 생성 = CREATE USER c##mydb IDENTIFIED BY pw(비번)
세션 생성 권한 부여 = GRANT CREATE SESSION TO c##mydb;
테이블 자원 생성 권한 부여 = GRANT CREATE TABLE, RESOURCE TO c##mydb;
DBA에 접속할 권한 부여 = GRANT CONNECT, DBA TO c##mydb;
-- 새로운 사용자(user) 생성
CREATE USER c##mydb IDENTIFIED BY pwmydb;
-- 세션(저장을 유지)을 생성할 권한 부여
GRANT CREATE SESSION TO c##mydb;
-- 테이블 자원(resource)을 생성할 권한 부여
GRANT CREATE TABLE, RESOURCE TO c##mydb;
-- DBA에 접속(연결)할 권한 부여
GRANT CONNECT, DBA TO c##mydb;
<<JAVA>>
JDBC
데이터베이스 연결
dbconnection 프로젝트
lib폴더 생성 -> Ojdbc11.jar
Connection 클래스
DriverManager
mydb
회원 가입(users) => 클래스화(자료형으로만들기) -> 객체로 사용 (get, set)
= VO(Value Object), DTO(Data Transfer Object)
DAO - CRUD
- userid, username, userpassword, userage, useremail
게시판(boards)
- DB
-- 자바와 연동할 회원 테이블 생성
CREATE TABLE users(
userid VARCHAR2(20) PRIMARY KEY,
username VARCHAR2(30) NOT NULL,
userpassword VARCHAR2(20) NOT NULL,
userage NUMBER NOT NULL,
useremail VARCHAR2(50) NOT NULL
);
-- 회원 추가
INSERT INTO users
VALUES ('today', '고오늘', '12345', 25, 'today@korea.kr');
COMMIT;
SELECT * FROM users
WHERE userid = 'today';
- JAVA
DB Connection
package dbconnection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionTest {
public static void main(String[] args) {
Connection conn = null;
try {
// JDBC 드라이버 등록
Class.forName("oracle.jdbc.OracleDriver");
// 연결하기 - getConnection(url, user, password)
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521/xe",
"c##mydb",
"pwmydb");
System.out.println("연결 성공!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally{ // 반드시 수행되는 구간
if(conn != null) { // 연결이 되어 있다면
try {
conn.close();
System.out.println("연결 끊음");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
USER class
package domain;
// DTO(VO) 클래스 = 자료 전달 객체
public class User {
// 필드
private String userId;
private String userName;
private String userPassword;
private int userAge;
private String userEmail;
// 기본 생성자 생략
public User() {}
// 메서드(getter/setter)
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", userPassword=" + userPassword + ", userAge="
+ userAge + ", userEmail=" + userEmail + "]";
}
}
User Select class
package dbcrud;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import domain.User;
public class UserSelectAllTest {
public static void main(String[] args) {
Connection conn = null; // 네트워크 연결 클래스
PreparedStatement pstmt = null; // sql을 처리해주는 인터페이스
try {
// JDBC 드라이버 등록
Class.forName("oracle.jdbc.OracleDriver");
// 연결하기 - getConnection(url, user, password)
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521/xe",
"c##mydb",
"pwmydb");
System.out.println("연결 성공!");
// db 처리 작업
// 매개변수화된 sql문 작성
String sql = "SELECT * FROM users";
pstmt = conn.prepareStatement(sql);
// sql 실행 - 검색
ResultSet rs = pstmt.executeQuery();
// user를 담을 ArrayList 생성
List<User> userList = new ArrayList<>();
while(rs.next()) {
// db에서 user를 꺼내옴
User user = new User();
user.setUserId(rs.getString("userid")); // userid가 user객체에 들어감
user.setUserName(rs.getString("username"));
user.setUserPassword(rs.getString("userpassword"));
user.setUserAge(rs.getInt("userage"));
user.setUserEmail(rs.getString("useremail"));
// 리스트에 user객체 저장
userList.add(user);
} // while 끝
for(int i = 0; i < userList.size(); i++) {
User user = userList.get(i);
System.out.println("-----------user" + (i+1) + "------------");
System.out.println("userID: " + user.getUserId());
System.out.println("userName: " + user.getUserName());
System.out.println("userPW: " + user.getUserPassword());
System.out.println("userAge: " + user.getUserAge());
System.out.println("userEmail: " + user.getUserEmail());
System.out.println("----------------------------");
System.out.println(" ");
}
// 스택구조이므로 종료 순서는 들어간 순서의 역순으로 닫아준다(rs -> pstmt -> conn)
rs.close();
pstmt.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally{ // 반드시 수행되는 구간
if(conn != null) { // 연결이 되어 있다면
try {
conn.close();
System.out.println("연결 끊음");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
HTML 공부
<<HTML 폼 요소>>
*폼 요소 = 텍스트 입력란이나 비밀번호 입력란, 버튼, 체크 박스 등
여러 개별 컨트롤을 품는 껍데기나 컨테이너에 더 가깝다
개별 컨트롤이나 개별 입력란을 폼으로 묶는다
= 한데 그룹화된 모든 입력을 담는 상자
=> 폼을 제출했을 때 폼 데이터를 어디로 보낼지 지시한다
<action>속성
= 빈 폼을 만들면 빈 컨테이너로 웹에 아무것도 보이지 않지만
-> 폼 안에 action 속성을 넣어서 폼이 제출되었을 때
데이터를 보낼 위치와 시간 등을 지정할 수 있다
-> <form action =" "> </form>
=> 폼을 제출하면 -> HTTP 요청이 전송된다
-> action이라는 속성을 사용 -> 해당 요청이 어디로 가는지 제어한다
-> 어떤 유형의 HTTP 메서드를 사용할지 제어한다
* 폼 액세스 = 입력 내용을 그룹화한 뒤 -> 라벨을 붙여 어떤 지정된 목적지로 함께 제출
<input>요소
= 가장 일반적인 요소이자 폼 컨트롤
닫는 태그가 없는 요소
-> 이를 활용하여 여러개의 다른 입력란을 만들 수 있다
=> <input> 방식으로 작동
=-> type 라는 속성 하나를 변경하는데 이 type이 작동 방식을 크게 바꿔준다
* 기본 입력란 = type 명시 X / type = text
-> <input type = "text">
= 빈 <form>에 <input> 하나 추가 -> type 명시X => 유효한 입력란O = 기본 설정값은 텍스트 입력란
=> type = text로 지정하는것과 같음
* 비밀번호 입력란
-> <input type = "password">
= 내부의 텍스트가 가려지는 입력란
* 색 입력란
-> <input type = "color">
= 색상 선택기를 만들어 준다
* 숫자 입력란
-> <input type = "number">
= 숫자 입력이나 화살표로 숫자의 증가와 감소 조정 가능
* 입력란의 임시 텍스트를 지정하는 속성
-> <input type = "text" placeholder = " ">
= 창에 뭔가를 입력하기 전이라 비어 있을 경우 보이는 텍스트
=> 무엇을 입력해야 하는지 알려준다는 점에서 중요하다
2023. 10. 11 (수)
프로그래머 도전기 44일차 (3) | 2023.10.14 |
---|---|
프로그래머 도전기 43일차 (0) | 2023.10.13 |
프로그래머 도전기 41일차 (0) | 2023.10.11 |
프로그래머 도전기 40일차 (0) | 2023.10.09 |
프로그래머 도전기 39일차 (1) | 2023.10.07 |