묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
node.js 교과서 3판 질문드립니다
[제로초 강좌 질문 필독 사항입니다]질문에는 여러분에게 도움이 되는 질문과 도움이 되지 않는 질문이 있습니다.도움이 되는 질문을 하는 방법을 알려드립니다.https://www.youtube.com/watch?v=PUKOWrOuC0c0. 숫자 0부터 시작한 이유는 1보다 더 중요한 것이기 때문입니다. 에러가 났을 때 해결을 하는 게 중요한 게 아닙니다. 왜 여러분은 해결을 못 하고 저는 해결을 하는지, 어디서 힌트를 얻은 것이고 어떻게 해결한 건지 그걸 알아가셔야 합니다. 그렇지 못한 질문은 무의미한 질문입니다.1. 에러 메시지를 올리기 전에 반드시 스스로 번역을 해야 합니다. 번역기 요즘 잘 되어 있습니다. 에러 메시지가 에러 해결 단서의 90%를 차지합니다. 한글로 번역만 해도 대부분 풀립니다. 그냥 에러메시지를 올리고(심지어 안 올리는 분도 있습니다. 저는 독심술사가 아닙니다) 해결해달라고 하시면 아무런 도움이 안 됩니다.2. 에러 메시지를 잘라서 올리지 않아야 합니다. 입문자일수록 에러메시지에서 어떤 부분이 가장 중요한 부분인지 모르실 겁니다. 그러니 통째로 올리셔야 합니다.3. 코드도 같이 올려주세요. 다만 코드 전체를 다 올리거나, 깃헙 주소만 띡 던지지는 마세요. 여러분이 "가장" 의심스럽다고 생각하는 코드를 올려주세요.4. 이 강좌를 바탕으로 여러분이 응용을 해보다가 막히는 부분, 여러 개의 선택지 중에서 조언이 필요한 부분, 제 경험이 궁금한 부분에 대한 질문은 대환영입니다. 다만 여러분의 회사 일은 질문하지 마세요.5. 강좌 하나 끝날 때마다 남의 질문들을 읽어보세요. 여러분이 곧 만나게 될 에러들입니다.6. 위에 적은 내용을 명심하지 않으시면 백날 강좌를 봐도(제 강좌가 아니더라도) 실력이 늘지 않고 그냥 코딩쇼 관람 및 한컴타자연습을 한 셈이 될 겁니다. 선생님 안녕하세요3판이 출간된 걸로 아는데, 혹시 리뉴얼 강의도 출시하시는지 문의드리고 싶습니다그리고 REACT에 관심이 있으면웹게임을 만들며 배우는 react -> react nodebird 순으로 들으면 될까요?
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
시퀄라이즈 연결질문...
require('dotenv').config(); const PORT = process.env.PORT; const dotenv = require('dotenv'); const express = require('express'); const compression = require("compression"); const methodOverride = require("method-override"); const cors = require("cors"); const userRouter = require("./routes/userRoute"); const boardRouter = require("./routes/boardRoute"); const authRouter = require('./routes/auth'); // 인증 라우터 const ejsMate = require('ejs-mate'); const path = require('path'); const session = require('express-session'); const morgan = require('morgan'); const nunjucks = require('nunjucks'); const passport = require('passport'); const passportConfig = require('./passport'); const { sequelize } = require('../models/index'); const cookieParser = require('cookie-parser'); const app = express(); passportConfig(); nunjucks.configure('views', { express : app, watch : true, }); sequelize.sync({ force: true }) .then(() => { console.log("데이터 베이스 연결 성공") }) .catch((err) => { console.log(err); }); app.engine('ejs', ejsMate) app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views')) app.use(express.urlencoded({ extended: true })); app.use(compression()); app.use(express.json()); app.use(express.urlencoded({extended:true})); app.use(methodOverride()); app.use(cors()); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( session({ resave: false, saveUninitialized: false, secret: process.env.COOKIE_SECRET, cookie: { httpOnly: true, secure: false, }, }), ); //! express-session에 의존하므로 뒤에 위치해야 함 app.use(passport.initialize()); // 요청 객체에 passport 설정을 심음 app.use(passport.session()); // req.session 객체에 passport정보를 추가 저장 // passport.session()이 실행되면, 세션쿠키 정보를 바탕으로 해서 passport/index.js의 deserializeUser()가 실행하게 한다. app.use('/', userRouter); app.use('/', boardRouter); app.use('/auth', authRouter); app.get('/', (req,res)=>{ res.render('home') }) app.listen(PORT, () => { console.log(`SERVING ON THE ${PORT}`); }) module.exports = app;<env파일>DB_HOST = localhostDB_USER = rootDB_PASS = tkfkdgo12DB_NAME = nodejsPORT = 3000JWT_SECRET = softsquared_jwt_secret_key_07040014087COOKIE_SECRET = cookiesecretKAKAO_ID = bcb213727449d2b53039dcca5f541c02const Sequelize = require('sequelize'); const path = require('path'); const env = process.env.NODE_ENV || 'development'; const User = require('./user'); // config/config.json 파일에 있는 설정값들을 불러온다. // config객체의 env변수(development)키 의 객체값들을 불러온다. // 즉, 데이터베이스 설정을 불러온다고 말할 수 있다. const config = require('../config/config')[env] const db = {}; // new Sequelize를 통해 MySQL 연결 객체를 생성한다. const sequelize = new Sequelize(config.database, config.username, config.password, config) // 연결객체를 나중에 재사용하기 위해 db.sequelize에 넣어둔다. db.Sequelize = Sequelize; db.sequelize = sequelize; User.init(sequelize); // 모듈로 꺼낸다. module.exports = db; <models 폴더 내 index.js>const Sequelize = require('sequelize'); const path = require('path'); const env = process.env.NODE_ENV || 'development'; const User = require('./user'); // config/config.json 파일에 있는 설정값들을 불러온다. // config객체의 env변수(development)키 의 객체값들을 불러온다. // 즉, 데이터베이스 설정을 불러온다고 말할 수 있다. const config = require('../config/config')[env] const db = {}; // new Sequelize를 통해 MySQL 연결 객체를 생성한다. const sequelize = new Sequelize(config.database, config.username, config.password, config) // 연결객체를 나중에 재사용하기 위해 db.sequelize에 넣어둔다. db.Sequelize = Sequelize; db.sequelize = sequelize; User.init(sequelize); // 모듈로 꺼낸다. module.exports = db; <config.json>{ "development": { "username": "root", "password": "tkfkdgo12", "database": "nodejs", "host": "localhost", "dialect": "mysql" }, "test": { "username": "root", "password": null, "database": "database_test", "host": "127.0.0.1", "dialect": "mysql" }, "production": { "username": "root", "password": null, "database": "database_production", "host": "127.0.0.1", "dialect": "mysql" } } <오류메시지>비밀번호 설정도 다해줬는데 모르겠습니다 ㅠㅠ
-
미해결처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지] (업데이트)
pandas를 활용한 매서드 기능 중 오류
pandas 라이브러리와 Pymysql - 파일로 데이터 저장 강의의5:14초 중 명령문을 실행 시키면 작동은 되나, 오류코드가 같이 나오는데 구글링을 통해 답변을 찾아봐도 해결 방법을 얻기 어려워 질문 남깁니다.
-
미해결
sequelize cascade 옵션을 사용해서 delete 할때
안녕하세요.웹 프로젝트를 진행하면서 궁금한 점이 있어서 질문드립니다.mysql과 sequelize를 사용하며users 테이블과 contents 테이블이 1:N 관계를 가지고 있습니다.그래서 users 데이터를 delete 할 때 자식으로 묶인 contents 데이터들을cascade 옵션을 통해 같이 delete 시키고자 합니다.models/contents.jsmodels/users.js 이때 그냥 삭제시키는 게 아니라 users 테이블과 contents 테이블 모두paranoid 옵션을 통해 deletedAt을 생성시키고 삭제된 날짜를 찍히게 하고자 하는데현재 user를 delete 하면 user는 삭제가 되어 deletedAt이 잘 나오지만 content는 삭제가 되지 않아deletedAt이 나오지 않는 상황입니다.구글링을 통해 여러 방법을 시도해 보았지만 해결되지 않아 질문드립니다.hooks나 api를 사용하지 않고 cascade를 통해 자식 요소까지삭제되면서 deletedAt이 잘 나올 수 있는 효과적인 방법이 있을까요?
-
미해결
Springboot 스케줄러를 이용한 db 데이터 자동 삭제
스프링부트스케줄러를 이용해서 mysql에 있는 데이터를 자동삭제 하고 싶습니다. 블로그들을 찾아봐도 딱히 쓸만한 정보를 얻지 못해서 이 글을 작성하게 됩니다. 따롴 클래스를 만들던지 해서 controller에서 처리하고 싶습니다. db에 데이터가 삽입된 기준으로 하던지 현재 시간을 기준으로 최근 1달 정도 데이터를 유지하던지 그런 방식으로 진행하고 싶습니다. 알려주십쇼 ..
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
책15강 LightSail 사용하기 mysql 생성문제
안녕하세요 제로초선생님 AWS로 배포하기 Lightsail부분 강의에서 MySQL 데이터베이스 생성시도하다가 문제가 생겨서 질문합니다 강의 13분에 나오는 것처럼 ALTER USER ~ 명령어 똑같이 치고 (물론 비밀번호는 제 mysql 비밀번호로 변경했습니다), 다시 돌아와서 데이터베이스 생성하려는데 사진처럼 여전히 ERROR가 뜹니다. 이럴경우에 제가 놓친부분이 혹시나 있을까요? 구원의 손길 부탁드립니다..ㅠㅠ 답변 감사합니다 :)
-
미해결
php 회원가입 db 질문 드립니다.
Fatal error: Uncaught Error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in C:\Apache24\htdocs\dbcon.php:8 Stack trace: #0 C:\Apache24\htdocs\index.php(2): include() #1 {main} thrown in C:\Apache24\htdocs\dbcon.php on line 8. APM 환경에서 php로 회원가입을 구현하고 싶은데 위와 같은 오류가 뜹니다. 오류 문장에 언급된 php 파일 첨부합니다.. 찾아봐도 잘 안 나오고 뭐가 문제인지 모르겠습니다. ㅇ위에서 말한 line 8은 아래입니다. 오래 붙잡았는데도 도저히 모르겠습니다.. 도와주시면 감사하겠습니다. $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); dbcon.php <?php $host = 'localhost'; $username = ''; $password = ''; $dbname = 'userdb'; $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); try { $con = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8",$username, $password); } catch(PDOException $e) { die("Failed to connect to the database: " . $e->getMessage()); } $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $con->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { function undo_magic_quotes_gpc(&$array) { foreach($array as &$value) { if(is_array($value)) { undo_magic_quotes_gpc($value); } else { $value = stripslashes($value); } } } undo_magic_quotes_gpc($_POST); undo_magic_quotes_gpc($_GET); undo_magic_quotes_gpc($_COOKIE); } header('Content-Type: text/html; charset=utf-8'); session_start(); ?> index.php <?php include('dbcon.php'); include('check.php'); if(is_login()){ if ($_SESSION['user_id'] == 'admin' && $_SESSION['is_admin']==1) header("Location: admin.php"); else header("Location: welcome.php"); } ?> <!DOCTYPE html> <html> <head> <title>로그인 예제</title> <link rel="stylesheet" href="bootstrap/css/bootstrap1.min.css"> </head> <body> <div class="container"> <h2 align="center">로그인</h2><hr> <form class="form-horizontal" method="POST"> <div class="form-group" style="padding: 10px 10px 10px 10px;"> <label for="user_name">아이디:</label> <input type="text" name="user_name" class="form-control" id="inputID" placeholder="아이디를 입력하세요." required autocomplete="off" readonly onfocus="this.removeAttribute('readonly');" /> </div> <div class="form-group" style="padding: 10px 10px 10px 10px;"> <label for="user_password">패스워드:</label> <input type="password" name="user_password" class="form-control" id="inputPassword" placeholder="패스워드를 입력하세요." required autocomplete="off" readonly onfocus="this.removeAttribute('readonly');" /> </div> <div class="checkbox"> <label><input type="checkbox"> 아이디 기억</label> </div> </br> <div class="from-group" style="padding: 10px 10px 10px 10px;" > <button type="submit" name="login" class="btn btn-success">로그인</button> <a class="btn btn-success" href="registration.php" style="margin-left: 50px"> <span class="glyphicon glyphicon-user"></span> 등록 </a> </div> </br> </form> </div> </body> </html> <?php $login_ok = false; if ( ($_SERVER['REQUEST_METHOD'] == 'POST') and isset($_POST['login']) ) { $username=$_POST['user_name']; $userpassowrd=$_POST['user_password']; if(empty($username)){ $errMSG = "아이디를 입력하세요."; }else if(empty($userpassowrd)){ $errMSG = "패스워드를 입력하세요."; }else{ try { $stmt = $con->prepare('select * from users where username=:username'); $stmt->bindParam(':username', $username); $stmt->execute(); } catch(PDOException $e) { die("Database error. " . $e->getMessage()); } $row = $stmt->fetch(); $salt = $row['salt']; $password = $row['password']; $decrypted_password = decrypt(base64_decode($password), $salt); if ( $userpassowrd == $decrypted_password) { $login_ok = true; } } if(isset($errMSG)) echo "<script>alert('$errMSG')</script>"; if ($login_ok){ if ($row['activate']==0) echo "<script>alert('$username 계정 활성이 안되었습니다. 관리자에게 문의하세요.')</script>"; else{ session_regenerate_id(); $_SESSION['user_id'] = $username; $_SESSION['is_admin'] = $row['is_admin']; if ($username=='admin' && $row['is_admin']==1 ) header('location:admin.php'); else header('location:welcome.php'); session_write_close(); } } else{ echo "<script>alert('$username 인증 오류')</script>"; } } ?>
-
미해결비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
mysql connection 오류
안녕하세요, 강의 잘 듣고 있습니다. 다름이 아니라 강의를 듣는 도중에 Mysql과 연결이 되지 않아서 도움을 구하고자 합니다. Workbench에서 Test Connection을 누르면 계속 could not connect to mysql at "주소" ~ 이렇게 뜨게 됩니다. Vi 편집기를 통해서 Error Log를 확인했는데도 Timestamp가 잘못 설정되어 있다는 에러밖에 확인하지 못했습니다. 그래서 이게 Mysql이 안켜진건가 해서 Putty에서 Mysql을 실행 시키고 접속을 해도 계속 Connection이 안됩니다. Configure Server Management를 해야하나 고민해봤는데 이걸 하면 가상 리눅스환경에 mysql을 연결하는게 아니라 Window 운영체제 자체의 mysql을 연결하는거니 이건 아닌거 같고 지금 요 연결때문에 구글링만 일주일째 하고 있는데 안되고 있습니다. mysql에 문제가 있는건가 싶어 Select host from mysql.user을 해도 % 로 나와 있는 root가 잘 출력 되고, putty에서 netstat -ntlp를 해도 :::3306으로 잘 돌아가고 있는것 같습니다. EC2 주소랑 인바운드 규칙도 잘 설정이 되어 있는 상태인데 더이상 진행이 되지 않습니다. 혹시 해결 방법을 아실까요?
-
해결됨비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
jwtsecretkey
안녕하세요 jwtsecretkey 관련하여 질문드립니다. jwtsecretkey는 강의에 나와있는대로 그대로 사용했고, host는 AWS EC2에 명시된 퍼블릭 IP주소, User명에는 mysql 사용자명, port는 3306, password는 mysql 접속 시 비밀번호, 그리고 사용할 database명까지 입력을 해주었으나 localhost로 접속 시, Cannot get이라는 창만 계속해서 뜹니다. 혹시 이런경우에는 jwtsecretkey를 제것을 따로 생성하지 않아서 발생하는 문제인지 알고 싶습니다. 만약 jwtsecretkey의 문제라면 어떻게 생성하면되는지 알려주시면 감사하겠습니다.
-
미해결갖고노는 MySQL 데이터베이스 by 얄코
안녕하세요 강의 구성 관련 질문
질문은 강의페이지에 안내해놓은 이메일로 보내주세요!(이 페이지에 질문 X) SELECT 기초 를 다 학습하고 다음 Chapter 를 학습할려고 합니다. 기초에 나와있는 함수들을 예시 코드와 함께 한 페이지 정리된 PAGE가 있으면 좋겠습니다. 말씀하신대로 이 기초 함수들은 다 외울 필요 없이, 프로그래밍 언어처럼 구글링 하여 필요할 때 찾으면 되는 건가요??
-
미해결비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
db 연결 후, "/dummy" 요청 시 결과 페이지
안녕하세요? 또 한번 문의 드립니다ㅜㅠ (지난 번 AWS는 아직 해결을 못했습니다. 일단 패스하고 다른 강의부터 듣고 있습니다) mysql 연동 후, 쿼리 작성하고, 서버 띄운 후 결과가 선생님의 페이지 양식과 조금 달라서 이점이 조금 의아합니다. 선생님 결과는 아래와 같이 나오는데, 제 결과는 이렇게 나옵니다. 내용 상에는 차이가 없지만, 선생님 처럼 가독성 좋게 출력이 안되는데요. 이유가 뭔지, 수정할 수 있는지 여쭙고 싶습니다! 오늘도 감사드립니다. 좋은 하루 되세요!
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
TypeORM + Mysql관련 질문
NestJS + TypeOrm을 통해서 데이터베이스(mysql)에 데이터를 Insert하는데 있어 질문 드립니다 (구글링을 해보았지만 TypeOrm의 업데이트가 되서 안먹히는건지, 제가 방법을 잘못활용하고 있는건지 모르겠습니다 / 공식문서대로 해봐도 안되네요 ㅜㅠ) 하고자 하는것 데이터 Insert시 CreatedAt과 UpdatedAt을 자동적으로 같이 입력되도록 하는것 문제점 둘다 null값으로 입력됨 3. 파일 group.ts -> typeorm의 entity파일 @Entity 데코레이터로 정의 4. 시도해본 것 공식문서 @CreateDataColumn() => null로 나옴 @CreateDataColumn({default() => CURRENT_TIMESTAMP(6)}) @Column({{default() => CURRENT_TIMESTAMP(6)}) => null로 나옴 default: Date.now() => null로 나옴 createdAt의 타입문제인가싶어 타입도 any로 해서 진행해봄 아래는 필요한 소스코드 일부를 발췌했습니다 ================= import { BaseEntity, Column, CreateDateColumn, Entity, Index, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm'; import { Appliers } from './Appliers'; import { Comments } from './Comments'; import { Users } from './Users'; @Index('FK_Users_TO_Groups_1', ['userId'], {}) @Entity('Groups', { schema: 'erunjrun' }) export class Groups extends BaseEntity { @CreateDateColumn() createdAt: any; }
-
미해결누구나 따라하면서 배우는 JSP 커뮤니티 게시판 만들기
db error
Access denied for user 'root'@'localhost' (using password: YES) 라는 문구가 계속 나오면서 login.jsp를 실행하면 항상 database 오류가 납니다.. 찾아보니까 다른 버전이라 오류가 난다고 하는데 어떻게 고쳐야 할지 모르겠습니다
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
마지막 쓰레드는 range를 따로 계산하신 이유가 있나요?
threads.add(new Worker(__filename, { workerData: { start, range: range + ((max - min + 1) % threadCount) } })); for문에서 threadCount - 1 안 하고 threadCount 까지 반복하면 안 되는 이유가 있는지 궁금합니다. 마지막에 따로 빼면 range가 10000007까지로 되는거 같아서요.
-
미해결DATABASE 1&2 - MySQL
MariaDB
WAMP를 설치하고 보면 mysql이 아닌 mariaDB가 깔려있어요 ㅠㅜ
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
채팅을 구현할려고할떄 테이블구조
노드버드에 채팅을 구현할려고 하는데 대충 Chat table 만들고 User 랑 관계정의 시켜서 테이블 쭉 쌓으면 될것같은데 모든 채팅 정보가 한테이블에 있으면 나중에 규모가 커진다고 가정했을때 시간이 오래걸리것같습니다. 아무리 sql이 조회가 빠르다해도 채팅의 경우 다른 Post 나 User 테이블보다 훨씬 많이 쌓일테고 유저 개개인의 채팅한 정보가 한곳에 모이다보니 A 와 B 채팅 정보를 가져오는데 모든 사람의 테이블을 다 조회하면 시간이 오래걸릴것같은데 이런경우는 어떻게 처리하는게 좋을까요? 채팅부분만 mongo 써야될까요?
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
fs.readFile 호출시 readFile 도 background 로 보내는 건가요?
const fs = require('fs') fs.readFile('/Users/joe/test.txt', 'utf8' , (err, data) => { if (err) { console.error(err) return } console.log(data) }) 관련 질문을 읽다가 readFile 도 background 로 간다는 뉘앙스가 느껴져서 질문해봅니다. readFile 함수 자체는 background 로 가진 않지만 파일 읽는 행위가 background 에서 진행되는 걸까요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
응답에 비밀번호가 담겨있으면
그전에 요청 날릴때 비번을 해시화 하지 않는이유가 https 로 날릴경우 클라이언트에서 보낸 요청을 암호화 해서 서베에서 디비에 저장할때만 해시화 했던걸로 기억하는데 https 를 적용하면 응답되는 데이터도 암호화 되는건가요?
-
미해결처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지] (업데이트)
큰따옴표 질문입니다.
강의 13:23 import pymysql db = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='funcoding', db='ecommerce', charset='utf8') cursor = db.cursor() for index in range(10): product_code = 215673140 + index + 1 sql = """INSERT INTO product VALUES( '""" + str(product_code) + """', '스위트바니 여름신상5900원~롱원피스티셔츠/긴팔/반팔', 23000, 6900, 70, 'F'); """ print (sql) cursor.execute(sql) db.commit() db.close() -------------------------------------- 13:23 에서 '""" + str(product_code) + """', '스위트바니 여름신상5900원~롱원피스티셔츠/긴팔/반팔', 23000, 6900, 70, 'F'); """ '""" + str(product_code) + """' 이부분에서 str로 이미 문자열이 되었는데 큰따움표 쓰는거랑 작은따움표를 왜 추가하신건지 궁금합니다. 그냥 'str(product_code)' 로 쓰면 안되나요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의 별개의 질문이 있습니다.
안녕하세요. 스프링 입문 다 듣고 기본편을 듣고 있는 수강생입니다. 개인적으로 스프링부트로 프로젝트를 하는도중 mysql 관련해서 궁금한 점이 있어서 글을 남깁니다. 간단하게 말씀드리자면 웹에서 회원가입을 했을 경우 필수 입력사항이 아니면 db에 null 값으로 안들어가고 공백으로 들어가고 있습니다.. 아래 일반적인 테이블인데 공백으로 들어가는 부분이 생깁니다. create table test( num smallint auto_increment primary key, id varchar(200), pw varchar(200), gender varchar(10) ) 다만, 아래 코드처럼 웹사이트가 아닌 쿼리문으로 바로 실행하면 값을 입력하지 않는 컬럼은 null로 들어가고 있습니다. insert into test (id,pw) values ('test','1234'); 웹에서는 입력하지 않은 값이 null이 아닌 공백으로 들어가는지가 궁금합니다.ㅠㅠ