[SeSACX코딩온] SQL, MVC

JUHEE·2024년 2월 8일
0

SeSACX코딩온

목록 보기
9/26

DML

GROUP BY

- 속성 이름 끼리 그룹으로 묶어서 출력
- having: group의 결과를 나타내는 그룹을 제한
- 집계함수: sum, avg, max, min, count 등 group by와 주로 함께 사용된다

SELECT * FROM user WHERE age >= 23 GROUP BY year HAVING year >20
-- 나이가 23살 이상인 사람들을 경력 별로 묶어서 출력한다 경력은 최소 20 초과여야한다

- WHERE절은 집계함수 사용이 불가능하다
- HAVING조건은 묶은 그룹(속성)에 관한 내용이 들어가야 한다

JOIN

- 두 테이블을 묶어서 검색하여 새로운 테이블 형태의 데이터 출력
- SELECT FROM T1 INNER JOIN T2 ON 조인조건; +(WHERE조건)
- SELECT
FROM T1, T2 WHERE 조인조건 AND 검색조건

(1) INNER JOIN: 두 테이블의 특정 컬럼값을 비교하여 교집합을 출력
(2) NATURAL JOIN: 두 테이블의 컬럼이름과 데이터타입이 같은 컬럼을 기준으로 교집합 출력(ON절 생략가능)
(3) LEFT OUTER JOIN: JOIN문에서 왼쪽에 있는 테이블 전체 + 두테이블의 교집합 출력
(4) RIGHT OUTER JOIN: JOIN문에서 오른쪽에 있는 테이블 전체 + 두테이블의 교집합 출력

SELECT * FROM student s1 INNER JOIN subject s2 ON s1.id = s2.id where age >=22;

DCL

- GRANT: 특정 사용자에게 권한 부여
- GRANT 권한 ON 테이블이름 TO 사용자이름;
- REVOKE: 특정 사용자에게서 권한 박탈
- REVOKE 권한 ON 테이블이름 FROM 사용자이름;

MVC

- MODEL(데이터) ,VIEW(UI), CONTROLLER(연결)의 세 구조로 소프트웨어를 설계하는 디자인 패턴
- MVC웹 프레임워크: PHP, DJANGO, EXPRESS, ANGULAR
- 장점: 패턴 구분 개발, 유지보수 용이, 높은 유연성과 확장성, 협업 용이
- 단점: 의존성 분리 완벽하게 불가, 복잡하고 장시간의 설계, 클래스 단위가 많아짐

- 기존 APP.JS방식과 동작 자체의 차이는 없지만 폴더 구조가 분리되어 EXPORTS, REQUIRE를 사용하여 불러와서 각자 작동하도록 한다

폴더구조

- controller: view와 model의 연결하여 대부분의 기능을 담당한다
- model: 데이터를 처리하는 부분 DB데이터를 가져온다
- routes: 경로 설정을 담당하는 부분, localhost뒤의 주소와 관련된 설정이다
- views: ejs파일을 이용하여 웹페이지에서 보여줄 화면을 작성하는 부분이다

1. app.js router 설정 추가

- 미들웨어 설정, 404페이지 설정, listen메소드 오픈
- routes파일 경로는 request문으로 불러와서 변수에 저장하고, app.use메소드를 사용하여 주소 '/'로 접근시(기본주소) 모두 routes 경로의 파일로 사용되도록 설정한다

const indexRouter = require("./routes");
app.use("/", indexRouter);

2. routes폴더의 index.js 파일 작성

- express를 require한다
- express.Router()를 불러와서 app대신에 router변수로 라우팅한다
- router.get('주소', 실행함수)에서 실행함수부분은 controller에서 작성하기 때문에 controller폴더를 require하여 사용한다
- 맨 밑에 router를 exports해준다(그래야 app.js에서 연결)
- 코드예시

const express = require("express");
const router = express.Router();
const controller = require("../controller/Cmain");

router.get("/", controller.main);
router.post("/login", controller.login);
router.post("/login2", controller.login2);

module.exports = router;

3. model폴더의 데이터 설정

- 현재 강의에서는 mySql을 불러오는 방법을 배우지 않아 임의의 DB를 배열로 생성하여 데이터로 사용하였다
- controller에서 require하여 사용하기 위해 exports해준다

exports.userInfo = () => {
  return {
    id: "cocoa",
    pw: "qwer1234",
  };
};

4. controller폴더에서 실행함수 작성

- model폴더를 require하여 데이터를 사용한다(필요하면)
- req, res를 받는 실행 함수를 작성하고 exports한다
- 예시코드)
- model폴더 User파일을 require하고 id와 pw값을 리턴하는 함수 userInfo를 사용
- view에서 로그인 버튼 클릭시 url로 접근하면 실행될 함수를 작성
- 데이터 값을 비교하여 결과값과 로그인 정보를 전송하도록 설정(send)

const model = require("../model/User");
const userInfo = model.userInfo();
let result;
//id, pw값을 가짐
exports.login = (req, res) => {
  console.log(req.body);
  console.log(userInfo);

  if (req.body.id == userInfo.id && req.body.pw == userInfo.pw) {
    result = true;
  } else {
    result = false;
  }
  res.send({
    result: result,
    userInfo: req.body,
  });
};

- 해당 로그인 함수는 routes의 index폴더에서 require되어 router.post('/login', controller.login); 의 형태로 사용된다

profile
초보개발자

0개의 댓글