상세 컨텐츠

본문 제목

프로그래머 도전기 53일차

프로그래머가 될거야!

by Choyee 2023. 10. 23. 23:33

본문

오늘은

오늘은 월요일입니다

새로운 한 주가 시작됐다고 힘내야겠다고 한게 

바로 진짜 엊그제 같은데

주말이 순삭되고 또 그새 새로운 한 주가 다시 시작되었군요

게다가 인지하지 못한 새에 50일을 넘겨버렸습니다.. 하하

정말 프로그래머가 되기 위한 인생을 살고있는 느낌입니다

 

 

 

학원 수업

Oracle 기반 sql BD 에서

Mysql 기반 BD로 넘어왔습니다

사용하는데에 크게 다른점은 없는 것 같았습니다

-- 제2정규화(음료, 주문 테이블)

create table drink (
	drink_code    varchar(3) primary key,  -- 음료코드
    drink_name	  varchar(20) not null     -- 음료이름
);

create table cafe_order(
	order_no    int primary key auto_increment,  -- 주문번호
    drink_code  varchar(20) not null,            -- 음료코드
    order_cnt   int not null,                    -- 주문수량
    foreign key(drink_code) references drink(drink_code)
    on delete cascade  -- 부모키의 데이터가 삭제되면 자식 데이터가 자동으로 삭제됨
);

-- drink 자료 추가
insert into drink values ('A01', '아메리카노');
insert into drink values ('B01', '카페라떼');
insert into drink values ('C01', '허브차');

-- cafe_order 자료 추가
insert into cafe_order(drink_code, order_cnt)
values('A01', 3);
insert into cafe_order(drink_code, order_cnt)
values('B01', 1);
insert into cafe_order(drink_code, order_cnt)
values('C01', 2);


select * from drink;

select * from cafe_order;

drop table cafe_order;

-- 음료테이블에 있는 카페라떼 삭제(음료코드'B01')
-- 주문 테이블의 'B01'도 자동 삭제
delete from drink where drink_code = 'B01';
delete from cafe_order where drink_code = 'C01';


-- 주문테이블에 음료 이름을 포함하여 출력하세요
-- 내부조인
select a.drink_name, b.*
from drink a, cafe_order b
where a.drink_code = b.drink_code;

select a.drink_name, b.*
from drink a inner join cafe_order b
using(drink_code);

-- 외부조인 
-- 주문에 관계 없이 주문정보와 음료는 모두 출력
select a.drink_name, b.*
from drink a left outer join cafe_order b
using(drink_code);


-- 주문이 없는 상품을 검색하시오
select a.drink_name "주문이 없는 상품"
from drink a left outer join cafe_order b
on a.drink_code = b.drink_code
where b.order_no is null;

 

게시판 만들기에서도 OracleDB 에서

Mysql로 연동을 옮겨주었습니다

 

* SQL

-- java 게시판 연동 = board 테이블 생성
create table board(
	bno         int primary key auto_increment,
    btitle      varchar(100) not null,
    bcontent    text not null,
    bwriter     varchar(20) not null,
    bdate       timestamp default now()
);

insert into board(btitle, bcontent, bwriter) values('제목', '내용입니다', 'today23');

select * from board;

commit;

* Java - board Class

package board;

import java.io.Serializable;
import java.sql.Timestamp;

public class Board implements Serializable{
	private static final long serialVersionUID = 1000L;
	
	// 필드
	private int bno;
	private String btitle;
	private String bcontent;
	private String bwriter;
	private Timestamp bdate;  // java.sql
	
	// 필드가 private이라 접근이 안되기 때문에 get,set 사용 접근
	public int getBno() {
		return bno;
	}
	public void setBno(int bno) {
		this.bno = bno;
	}
	public String getBtitle() {
		return btitle;
	}
	public void setBtitle(String btitle) {
		this.btitle = btitle;
	}
	public String getBcontent() {
		return bcontent;
	}
	public void setBcontent(String bcontent) {
		this.bcontent = bcontent;
	}
	public String getBwriter() {
		return bwriter;
	}
	public void setBwriter(String bwriter) {
		this.bwriter = bwriter;
	}
	public Timestamp getBdate() {
		return bdate;
	}
	public void setBdate(Timestamp bdate) {
		this.bdate = bdate;
	}
}

 

* Java Main Class

package board;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class BoardMain {

	private Scanner scanner = new Scanner(System.in);
	private Connection conn;
	private PreparedStatement pstmt;

	// db연결 관련 변수
	private String driverClass = "com.mysql.cj.jdbc.Driver";
	private String url = "jdbc:mysql://127.0.0.1:3306/mydb?serverTime=Asia/Seoul";
	private String user = "myuser";
	private String password = "pwmyuser";

	// 생성자
	public BoardMain() {
		try {
			Class.forName(driverClass);
			conn = DriverManager.getConnection(url, user, password);
			// System.out.println("DB연결 성공!" + conn);
		} catch (Exception e) {
			e.printStackTrace();
			exit();
		}
	}
	
	// 게시글 목록
	public void list() {
		System.out.println();
		System.out.println("[게시글 목록]");
		System.out.println("-------------------------------------------------------");
		System.out.printf("%-4s%-12s%-30s%-30s \n", "no", "writer", "date", "title");
		System.out.println("-------------------------------------------------------");

		// db - borad 테이블의 게시글 가져오기
		try {
			String sql = "SELECT* FROM board ORDER BY bno DESC";
			pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()) { // 게시글이 있는 동안 반복(다음 행으로 이동)
				Board board = new Board();
				board.setBno(rs.getInt("bno"));
				board.setBwriter(rs.getString("bwriter"));
				board.setBdate(rs.getTimestamp("bdate"));
				board.setBtitle(rs.getString("btitle"));

				// 게시글 출력
				System.out.printf("%-4s%-12s%-30s%-30s \n",
						board.getBno(),
						board.getBwriter(),
						board.getBdate(),
						board.getBtitle(),
						board.getBcontent()
						);
			} // while 끝
			rs.close();
			pstmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
			exit();
		}

		mainMenu();
	}

	public void mainMenu() {

		System.out.println();
		System.out.println("----------------------------------------------");
		System.out.println("1.Create | 2.Read | 3.Clear | 4.Exit");
		System.out.print("선택 : ");
		String menuNo = scanner.nextLine();
		System.out.println();


		switch (menuNo) {
		case "1":
			create();
			break;
		case "2":
			read();
			break;
		case "3":
			clear();
			break;
		case "4":
			exit();
			break;
		}

	}

	public void create() {
		// System.out.println("create() 매서드 실행됨");
		// board 객체 생성
		Board board = new Board();

		System.out.println("[새 게시물 입력]");

		System.out.print("제목: ");
		String title = scanner.nextLine();
		board.setBtitle(title);

		System.out.print("내용: ");
		String content = scanner.nextLine();
		board.setBcontent(content);

		System.out.print("작성자: ");
		String writer = scanner.nextLine();
		board.setBwriter(writer);

		// db작업 - insert
		try {
			String sql = "INSERT INTO board (btitle, bcontent, bwriter) "
					+ "VALUES (?, ?, ?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, board.getBtitle());   // 콘솔에서 입력한 제목을 db에 저장
			pstmt.setString(2, board.getBcontent());   // 콘솔에서 입력한 제목을 db에 저장
			pstmt.setString(3, board.getBwriter());   // 콘솔에서 입력한 제목을 db에 저장
			// sql 실행
			pstmt.executeUpdate();

			pstmt.close();

			System.out.println("*** 글이 작성되었습니다 ***");

		} catch (SQLException e) {
			e.printStackTrace();
			exit(); // 종료 메서드 호출
		}
		// 목록 메서드 호출
		list(); // while문과 같은 기능
	}

	public void read() {
		// System.out.println("read() 매서드 실행됨");
		System.out.println("[게시물 읽기]");
		System.out.print("글 번호 선택: ");
		int bno = Integer.parseInt(scanner.nextLine());

		// db처리 - 게시글 한개 보기 = select ~ where 절
		try {
			String sql = "SELECT * FROM board WHERE bno = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, bno);
			// 쿼리 실행
			ResultSet rs = pstmt.executeQuery();
			if(rs.next()) {  // 찾는 자료가 있으면
				Board board = new Board();
				board.setBno(rs.getInt("bno"));
				board.setBwriter(rs.getString("bwriter"));
				board.setBdate(rs.getTimestamp("bdate"));
				board.setBtitle(rs.getString("btitle"));
				board.setBcontent(rs.getString("bcontent"));

				System.out.println("****************************************************");

				System.out.println("번호: " + board.getBno());
				System.out.println("제목: " + board.getBtitle());
				System.out.println("내용: " + board.getBcontent());
				System.out.println("작성자: " + board.getBwriter());
				System.out.println("작성일: " + board.getBdate());

				System.out.println("****************************************************");

				// 수정, 삭제 메뉴 만들기
				System.out.println("1.글수정 | 2.글삭제 | 3.글목록");
				System.out.print("선택: ");
				String menuNo = scanner.nextLine();

				if(menuNo.equals("1")) {
					update(board);
				}else if(menuNo.equals("2")) {
					delete(board);
				}
			}
			rs.close();
			pstmt.close();

		} catch (SQLException e) {
			e.printStackTrace();
			exit();
		}
		// 글 목록 메서드 호출
		list();
	}

	public void update(Board board) {   // 이미 작성된 글(board)를 가져와서 수정
		System.out.println("[수정할 내용 입력]");

		System.out.print("제목: ");
		String title = scanner.nextLine();
		board.setBtitle(title);

		System.out.print("내용: ");
		String content = scanner.nextLine();
		board.setBcontent(content);

		System.out.print("작성자: ");
		String writer = scanner.nextLine();
		board.setBwriter(writer);

		// db작업 - update
		try {
			String sql = "UPDATE board SET btitle=?, bcontent=?, bwriter=? "
					+ "WHERE bno=?";
			pstmt = conn.prepareStatement(sql);

			pstmt.setString(1, board.getBtitle()); // 콘솔에서 수정한 제목을 db에 저장
			pstmt.setString(2, board.getBcontent());
			pstmt.setString(3, board.getBwriter());
			pstmt.setInt(4, board.getBno());

			// sql 실행
			pstmt.executeUpdate();
			pstmt.close();

		} catch (SQLException e) {
			e.printStackTrace();
			exit();
		}
	}

	public void delete(Board board) {
		// 확인, 취소 메뉴
		System.out.println("정말로 삭제하시겠습니까?");
		System.out.println("1.OK | 2. Cancel");
		System.out.print("선택: ");

		String menuNo = scanner.nextLine();
		if(menuNo.equals("1")) {
			// db작업 - DELETE
			try {
				String sql = "DELETE FROM board WHERE bno = ?";
				pstmt = conn.prepareStatement(sql);
				pstmt.setInt(1, board.getBno());
				// sql 실행
				pstmt.executeUpdate();
				pstmt.close();
				System.out.println("*** 글이 삭제되었습니다 ***");
			} catch (SQLException e) {
				e.printStackTrace();
				exit();
			}
		}
		list();
	}

	// 테이블은 유지하면서 전체 글 삭제 - sql : TRUNCATE TABLE board;
	public void clear() {
		//System.out.println("clear() 매서드 실행됨");
		System.out.println("[전체 게시글 삭제]");
		System.out.println("============================");
		// 확인, 취소 메뉴
		System.out.println("정말로 삭제하시겠습니까?");
		System.out.println("1.OK | 2. Cancel");
		System.out.print("선택: ");

		String menuNo = scanner.nextLine();
		if(menuNo.equals("1")) {
			// db작업 - TRUNCATE
			try {
				String sql = "TRUNCATE TABLE board";
				pstmt = conn.prepareStatement(sql);
				// sql 실행
				pstmt.executeUpdate();
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
				exit();
			}
		}
		list();
	}

	public void exit() {  // 호출되면 db 연결 종료
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		System.out.println("*** 게시판을 종료합니다 ***");
		System.exit(0); // 즉시 종료
	}

	public static void main(String[] args) {
		BoardMain board1 = new BoardMain();
		board1.list();
	}
}

 

 

 

할 일 목록 만들기

CSS 적용하는 방법이 생각보다 굉장히 헷갈리고 어려웠습니다

하나하나 따로 지정해주는 형식이 말그대로 하나씩만 봤을 때는 어렵지 않아 보였지만

부모태그와 자식태그 간의 개념에 의한 상속과

요소, class, id 간의 특이도에 따라 적용되는 속성들이 달라져서 혼란스러웠지만

전에 정리해 두었던 CSS의 내용들을 참고하면서 다시 복습도 하고

차근차근 코드를 작성해보았습니다

 

html {
	height: 100%;
}

body {
    display: flex;
    flex-wrap: nowrap;
    justify-content: center;
    background-color: rgb(87, 97, 93);
    min-height: 100%;
}

.wrapper {
    justify-content: center;
    margin-top: 3rem;
    min-width: 600px;
}

.title {
    padding: 2rem;
    text-align: center;
    color: rgb(98, 183, 240);
    font-size: 5rem;
}

.middle {
    background-color: white;
    border: 3px;
    border-style: solid;
    border-color: black;

}

.input_box {
    display: flex;
    flex-wrap: nowrap;
    flex-direction: row;
    height: 3rem;
    justify-content: flex-start;
    align-items: center;
    border: 1px;
    border-color: black;
    border-style: solid;
}

button {
    background-color: transparent;
    border: 0;
}

.left_items {
    padding-left: 1rem;
    padding-right: 1rem;
}

.input {
    width: 80%;
    text-align: left;
    border: 0;
    outline: none;
    font-size: 1.3rem;
}

.list {
    background-color: rgb(235, 250, 255);
    margin: 0rem;
    padding: 0rem;
    border-style: solid;
    border-left: 3px;
    border-right: 3px;
}

.item {
    position: relative;
    display: flex;
    flex-wrap: nowrap;
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    height: 3rem;
    border-bottom: 1px;
    border-style: solid;
    border-color: rgb(174, 236, 255);
}

.item:hover .del {
    opacity: 1;
}

.check {
    min-width: none;
    min-height: none;
    width: 1.5rem;
    height: 1.5rem;
    margin: 0.5rem 0.5rem;
    border-radius: 50px;
    border: 1px;
    border-style: solid; 
    border-color: lightgray;
    cursor: pointer;
    text-align: center;
}

.item.checked .check{
    border: 2px;
    border-style: solid;
    border-color: darkgray;
    color: green;
}

.todo {
    font-size: 1.3rem;
    padding: 0 1rem;
    width: 80%;
}

.item.checked .todo{
 font-style: italic;
 text-decoration: line-through;
 color: lightgray;
}

.del {
    opacity: 1;
    width: 3rem;
    height: 3rem;
    font-size: 1rem;
    font-weight: lighter;
    cursor: pointer;
}

.update {
    opacity: 1;
    width: 3rem;
    height: 3rem;
    font-size: 1rem;
    font-weight: lighter;
    cursor: pointer;
}

.bottom {
    height: 3rem;
    display: flex;
    flex-wrap: nowrap;
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    padding: 0 1rem;
}

.button_group{
    flex-direction: row;
    flex-wrap: nowrap;
}

.button_group button {
    border: 1px solid #eee;
    padding: 0.2rem 0.5rem;
    margin: 0 0.5rem;
    border-radius: 8px;
    cursor: pointer;
}

.button_group button.selected {
    border: 2px solid rosybrown;
    padding: 0.2rem 0.5rem;
    margin: 0 0.5rem;
    border-radius: 8px;
}

.del_all_done:hover {
    font-style: italic;
    text-decoration: underline;
    cursor: pointer;
}

.update_input {
    position: absolute;
    left: 0;
    top: 0;
    width: 590px;
    height: 2.8rem;
    margin: 0;
}

 

 

 

 

 

 

2023. 10. 23 (월)

관련글 더보기