일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 지연로딩
- shared lock
- fetch
- dfs
- PS
- 비관적락
- 유니크제약조건
- 낙관적락
- 다대일
- FetchType
- 스토어드 프로시저
- 힙
- eager
- 동적sql
- JPQL
- SQL프로그래밍
- 일대다
- 다대다
- 즉시로딩
- querydsl
- 백트래킹
- CHECK OPTION
- 이진탐색
- execute
- 스프링 폼
- exclusive lock
- 연결리스트
- 데코레이터
- 연관관계
- BOJ
- Today
- Total
목록All (557)
흰 스타렉스에서 내가 내리지
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/buvHOT/btrD3zbRc6L/tUyd8OOYjw9gKSDrVFjUU0/img.png)
여러 프로젝트를 진행하면 각 프로젝트에 사용하는 라이브러리 버전이나 파이썬 버전이 달라야 할 수 있다. 이때 가상환경을 통해서 버전과 라이브러리를 쉽게 모아서 독립적으로 관리할 수 있다. 가상환경 만들기 python3 -m venv 가상환경이름 가상환경 실행하기 # window source myvenv/Scripts/activate # mac source myvenv/bin/activate 가상환경 끄기 deactivate pip3 install django 장고 프로젝트 생성하기 django-admin startproject myproject Application 만들기 python3 manage.py startapp dashboard settings.py 에 방금 만든 app을 등록해 줘야 한다. #..
pyinstaller -w -F app.py a = Analysis( ['app.py'], pathex=[], binaries=[], datas=[('chromedriver', '.'), ('madeul.ui', '.')], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyinstaller app.spec
CORS (Cross-Origin Resource Sharing) 클라이언트와 서버의 도메인이 일치하지 않으면, 기본적으로 요청이 차단된다. 클라이언트에서 서버로 요청을 보낼 때만 발생하고, 서버에서 서버로 요청을 보낼 때는 발생하지 않는다. cors 문제를 해결하기 위해서는 응답헤더에 Access-Control-Allow-Origin 헤더를 넣어야 한다. 클라이언트 도메인의 요청을 허락하겠다는 의미를 담고 있다. express 에서는 cors라는 npm 패키지를 사용하면 된다. cors 문제를 해결하는 또 다른 방법으로는 프록시 서버를 이용하는 것이다. 서버에서 서버로 요청을 보낼 때는 cors 문제가 발생하지 않는 다는 것을 이용한 것이다. 브라우저와 도메인이 같은 서버를 만든 후, 브라우저에는 AP..
미들웨어의 작동 방식을 커스터마이징 하고 싶을 때 사용하는 방법이다. 아래의 두 코드는 같다. router.use(cors()) router.use((req, res, next) => { cors()(req, res, next); }); req와 res를 살짝 조작하거나, 데이터를 이용하고 싶은게 있으면 사용하면 되겠다.
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/nGBSo/btrDe86RK3q/RgIMkbNZtkzdrvLSqliUN1/img.png)
회원가입과 로그인을 직접 구현할 수도 있지만, 세션과 쿠리 처리등 복잡한 작업이 많으므로 검증된 모듈인 passport를 사용하면 좋다. 카카오톡 로그인이나 구글 로그인처럼 요즘 sns를 이용한 로그인이 많이 보이는데, 이를 passport 모듈을 사용해서 구현할 수 있다. npm i passport passport-local passport-kakao 사용사례는 내 깃허브에서 직접 보도록 하자. 주요한 것만 적기위해 일부만 캡처해서 설명한다. passport.initialize() 는 request에 passport 설정을 심는다. passport.session() 은 req.session에 passport 정보를 저장한다. 참고로 req.session은 express-session 미들웨어로 생성한다..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bptPXq/btrDdIgMOah/5MIQeTjQXja2K081OHXr71/img.png)
내가 스스로 구현해봤던 코드 : id와 일치하는 post를 일단 불러오고, post에 등록된 UserId와 현재 로그인된 사용자의 id가 일치 하는지 확인 후, 일치하면 해당 포스트 삭제, 아닐 시 401 unauthorized 응답. 이렇게 구현을 했는데... 필요없다. 충분히 짧게 구현할 방법이 있었다. id가 일치하고, 현재 로그인되어있는 사용자의 id와 userId가 동시에 일치하는 post를 찾아 지운다. 한줄이면 가볍게 처리 가능한 로직이다..!
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/N9M0v/btrCApisvCz/Cz6CjIlmRklGpDQCRBK0F0/img.png)
app.js에서 정적파일 연결하기 const __dirname = path.resolve(); app.set("views", path.join(__dirname, "views")); app.set("view engine", "html"); views는 템플릿 파일들이 위치한 폴더를 지정한다. 혹은 절대경로를 넣어주면 되는데, 그렇게 하면 소스코드가 유출되었을때 우리 서버의 구조를 알려주게 되니까 비추천. view engine은 어떠한 종류의 템플릿 엔진을 사용할지를 나타내는데, nunjucks는 html로 표기해도 된다. 굳이 구분하고 싶다면 njk로 한다. import express from "express"; const router = express.Router(); router.get("/", (r..
import express from "express"; import multer from "multer"; import path from "path"; const app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: false })); const __dirname = path.resolve(); const upload = multer({ storage: multer.diskStorage({ destination(req, file, done) { done(null, "uploads/"); }, filename(req, file, done) { const ext = path.extname(file.originalnam..
app.use((req, res, next) => { if (process.env.NODE_ENV === "production") { morgan("combined")(req, res, next); } else { morgan("dev")(req, res, next); } }); NODE_ENV라는 환경변수를 고쳐주기만 하면, 내부 소스코드를 변경하지 않아도 개발환경일 떄와 배포환경일 때의 설정을 다르게 할 수 있다. 특정한 주소의 요청에만 미들웨어가 실행되게 하고싶을 때에도 미들웨어 안의 미들웨어를 사용할 수 있다.
import cookieParser from "cookie-parser"; app.use(cookieParser(process.env.SECRET_KEY)) cookie-parser는 request에 첨부된 쿠키를 해석하여 req.cookies 객체로 만든다. 제공한 비밀 키를 통해 해당 쿠키가 내 서버가 만든 쿠키임을 검증할 수 있다. 쿠키는 클라이언트의 위조를 막기 위해 비밀키를 통해 만들어낸 sign을 쿠키 값 뒤에 붙인다. 서명된 쿠키는 req.cookies 대신 req.signedCookies 객체에 들어있다. // cookie(key, value, option) res.cookie('name', 'joos', { expires: ##; httpOnly: true, secure: true, si..