데브코스 13일차 TIL

Heesu Song·2025년 3월 20일

데브코스 - 백엔드

목록 보기
9/32
post-thumbnail

오늘 느낀점
이론과 실무는 정말 다른 것 같다..! 공부했다고 자만하지 말기

그리고 눈이 넘 아프다..

대전공항 예제

테이블을 분석해서 어떻게 분리할지 봐야됨

  • IF()CASE를 통해 조건에 따라 출력 가능

  • JOIN ON → SQLD 공부할 때 이론만 열심히 외웠는데 실제로 데이터에 적용해보니 어떻게 쿼리문을 짜야될지 감이 안잡힌다.

외래키를 심어주는 방법

alter table
	테이블
add constraint
	외래키_이름 foreign key
references
	테이블(칼럼)

→ 외래키와 참조하는 기본키는 자료형이 무조건 일치 해야됨

→ 참조하는 칼럼은 반드시 unique 값이 보장돼야함

서브쿼리

select
    (
    	select
    		st.sort
    	from
    		sort_table st
		WHERE
			st.sort = '전자제품'
    ) as '품류',
	c.nation as '국가',
	(
		(
			select
				dc.freight_charge
			from
				distance_charge dc
			left join
				culture c
			on
				c.culture_code = dc.culture_code
			where
					c.nation = '칠레'
				AND
					c.culture_code = dc.culture_code
		)
		+
		(
			select
				sct.special_rate
			from
				special_charge_table sct
			left join
				sort_table s
			on
				sct.is_rush = s.is_rush
			where
				s.sort = '전자제품'
		)
	) as '운임'
from
	culture c
WHERE
	c.nation = '칠레'
;

→ 조인으로 다시 쿼리문 짜보기(도전)

실행하면 결과도 잘 나오는거 확인.

DB 설계를 잘하는 법

→ 요구사항 분석을 잘 해야됨

ChatGPT가 짜준 요구사항 예제

📌 요구사항 1

한 카페에서 고객들의 주문을 관리하려고 합니다.

이제까지 받은 주문을 저장할 테이블을 설계하고, 데이터를 효율적으로 관리할 수 있도록 해야 합니다.

🎯 요구사항 상세

  1. 고객은 고유 ID, 이름, 전화번호 정보를 가집니다.

  2. 주문은 주문 ID, 고객 ID, 메뉴명, 가격, 주문 날짜 정보를 가집니다.

  3. 한 명의 고객은 여러 개의 주문을 할 수 있습니다.

  4. 모든 주문에는 반드시 주문한 고객이 존재해야 합니다.

  5. 고객이 탈퇴하면 주문 정보는 남아 있어야 합니다.

  6. 최근 주문한 고객을 쉽게 찾을 수 있도록 테이블을 설계하세요.


이제 이 요구사항을 바탕으로 DB 스키마(SQL 테이블 생성문)를 작성해보세요!

다 짜고 보내주시면 제가 피드백을 드리겠습니다. 🚀

  • 1차 쿼리문 작성
CREATE DATABASE `gpt`;

USE `gpt`;

CREATE TABLE `customer`(

	`id` INT(5) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
	`name` VARCHAR(5) NOT NULL,
	`phone_num` VARCHAR(20) NOT NULL

);

SELECT * FROM customer;

CREATE TABLE `order`(

    `id` INT(5) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `customer_id` INT(5) UNSIGNED NOT NULL,
    FOREIGN KEY(`customer_id`) REFERENCES customer(`id`),
    `menu` VARCHAR(10) NOT NULL,
    `price` INT(10) UNSIGNED NOT NULL,
    `order_date` DATETIME NOT NULL

);
-- order은 MySQL 예약어이기 때문에 그냥 실행시키면 문법오류가 발생! 백틱으로 감싸서 실행하는게 좋음
SELECT * FROM `order`;
  • 피드백

phone_num의 자료형

• VARCHAR(20)을 사용했는데 전화번호는 문자열로 저장하는 것이 맞음.

• 다만, 전화번호에는 ”-“나 공백 같은 형식이 다양하게 들어갈 수 있음.

• 예를 들어 "010-1234-5678" 또는 "010 1234 5678"과 같은 경우가 있음.

• 따라서, 전화번호는 입력할 때 형식을 통일하는 것이 중요함 → 애플리케이션에서 미리 처리하는 게 좋음.

추천
phone_num VARCHAR(20) NOT NULL CHECK (phone_num REGEXP '^[0-9-]+$')


좋은 점

기본적인 관계형 데이터베이스 구조는 잘 설계됨.

• customer_id를 orders 테이블에서 참조하는 방식도 적절함.

• AUTO_INCREMENT, NOT NULL 등의 제약 조건을 잘 사용함.


📌 요구사항 2 (온라인 강의 플랫폼)

한 스타트업이 온라인 강의 플랫폼을 개발하려고 합니다. 이 플랫폼에서는 강사와 수강생이 회원가입을 하고, 강사는 강의를 개설할 수 있으며, 수강생은 강의를 신청할 수 있습니다.

1. 회원 (Users)

• 회원은 강사(Instructor) 또는 수강생(Student)일 수 있습니다.

• 이메일과 비밀번호로 로그인하며, 이름과 프로필 사진을 가질 수 있습니다.

• 강사는 자신이 개설한 강의를 관리할 수 있습니다.

• 수강생은 자신이 신청한 강의를 볼 수 있습니다.

2. 강의 (Courses)

• 강의는 강사가 개설합니다.

• 강의에는 제목, 설명, 가격, 개설 날짜, 업데이트 날짜가 포함됩니다.

• 하나의 강의에는 여러 개의 강의 영상이 포함될 수 있습니다.

3. 강의 영상 (Lessons)

• 각 강의는 여러 개의 강의 영상으로 구성됩니다.

• 강의 영상에는 제목, 길이(재생시간), 업로드 날짜가 포함됩니다.

• 수강생은 강의 영상을 시청할 수 있습니다.

4. 수강 신청 (Enrollments)

• 수강생은 강의를 신청해야 수강할 수 있습니다.

• 수강 신청 시 결제가 이루어지며, 결제 완료 후 강의를 볼 수 있습니다.

• 수강 신청에는 신청 날짜와 결제 상태가 포함됩니다.

5. 수강 기록 (Progress)

• 수강생이 본 강의 영상에 대한 진도를 기록해야 합니다.

• 수강생이 특정 강의 영상을 끝까지 보면 해당 영상의 수강 완료 여부가 기록됩니다.

• 강의 전체 진도가 몇 %인지 계산할 수 있어야 합니다.


🎯 미션

각 요구사항을 반영하여 테이블을 설계하세요.

외래키 관계를 고려해서 테이블 간의 관계를 설정하세요.

정규화를 고려하여 데이터 중복을 최소화하세요.

필요한 제약조건(NOT NULL, UNIQUE, PRIMARY KEY 등)을 설정하세요.


💡 예시 출력 (답안은 제가 따로 가지고 있을게요!)

CREATE TABLE 문을 작성해도 되고,

ERD를 간단히 그려서 설명해도 됩니다.

• 다 작성한 후 알려주시면 제가 피드백 드릴게요! 🚀🔥

추후 작성

과제 - Java

프로젝트 readme를 작성할 때 어느 부분이 어려웠고 어떻게 해결해는지가 들어가는게 중요

💡프로그램을 종료할 때 단순히 break가 아니라 상태를 boolean으로 두고 while문 조건으로 두는 방법이 있음

  • LocalDate → 날짜 표시할 때 사용하는 자료형
  • 생성일과 수정일을 넣어야겠다는 생각을 못했다…..!

this.updatedAt = LocalDate.*now*(); → 작성 당시 현재 시간을 넣어줄 수 있음

  • 명령어 받는 부분을 전부 if-else로 작성했었는데 case로 작성하는 방법이 있음
profile
Abong_log

0개의 댓글