프리온보딩 | 2차과제 - 3: auth미들웨어, Swagger
·
wecode
✨ 로그인 적용 로그인기능이 머지되기 전이라서 임의로 is_admin과 province_id를 코드에 적어놓고 테스트를 했었는데 미들웨어가 완성돼서 적용시켰다. // hospitalRouter.js const { authMiddleware } = require("../middlewares/auth"); ... router.get("", authMiddleware, errorHandler(hospitalController.getHospitalDataController)); router.get("/download", authMiddleware, errorHandler(hospitalController.downloadHospitalDataController)); authMiddleware에는 요청 header..
프리온보딩 | 2차과제 - 2: 엑셀다운로드, 검색기능
·
wecode
엑셀다운로드기능 각 지역별 담당자는 해당 지역에 대한 데이터만을 조회하여 엑셀 파일로 다운로드받을 수 있어야 하며... 라고 나와있는데 조회-다운로드가 한기능인가 싶었는데 조회만 하고, 다운로드 하고싶을때 다운로드 하는게 맞는것같아서 따로 나눠서 만들었다. 조회 url은 '/hospital'이고 다운로드는 '/hospital/download'로 만들었다. 조회한 데이터랑 같은 데이터를 엑셀로 받는거기 때문에 컨트롤러만 나눠서 조회할때랑 같은 서비스로 보냈다. // controllers/hospitalController.js // 조회기능 const getHospitalDataController = async (req, res) => { ... const hospitalData = await hospita..
프리온보딩 | 2차과제 - 1: db모델링, 데이터조회기능
·
wecode
치매센터 관리자, 지역별 담당자용 어플리케이션 만들기! db모델링 데이터베이스 모델링은 이런식으로 했다. province_id가 null이면 대표관리자인걸 알수 있지만 is_admin 컬럼을 하나 더 추가했다. -> province_id가 없는걸로만 admin을 판단하면 담당자가 아직 지역 배정이 안됐을경우 admin권한을 가져버리는걸 막기위해! hospitals에는 전국치매센터표준데이터 이 데이터들이 들어가는데 주소데이터를 파싱해서 시/도(특별시 광역시나 도)별로 분류할 수 있도록 province_id를 넣어서 지역 테이블과 연결시켰다. 그리고 types에는 센터의 종류(데이터에서 '치매센터유형'에 해당하는것)를 넣었다. 내 기능 데이터를 조회해서 엑셀파일로 다운받을 수 있는 기능을 만들어야함 지역관리..
프리온보딩 | 1차과제 - 3
·
wecode
회의 유닛테스트는 각자 맡은 기능별로 할수있는 사람만 하기로 api명세서는 포스트맨 사용 기능구현 특정유저 정보수정 이것도 비활성유저 정보 수정하려는경우, 없는유저 정보 수정하려는 경우로 예외처리를 나눠야겠다 이번엔 처음부터 라우터, 레이어드 패턴 적용해서 짜봤다 // routers/user_router.js const errorHandler = require("../middlewares/error_handler"); const userController = require("../controllers/user_controller"); router.patch("/:userId", errorHandler(userController.editUserProfile)); // controllers/user_cont..
프리온보딩 | 1차과제 - 2
·
wecode
회의 깃허브 pr템플릿 추가 -> 팀으로 프로젝트 하는 부분에 있어서 그래도 서로 리뷰를 하고 머지를 해야될것같아서 추가했다. db 키(height) 데이터타입 float으로 수정 -> decimal, double, float중에서 정확하지 않아도 상관없는 데이터니까 빠르고 적은 메모리를 차지하는 타입으로 선택 record_data에 타임스탬프 안찍기로 결정 -> 계속 고민했는데 각 기록은 어차피 한나의 기록에 종속된거라서 타임스탬프 추가 안하기로 schema.sql .gitignore에 추가 -> schema.sql에 어디까지 마이그레이션 진행했는지 기록돼있어서 다른사람이 같은 마이그레이션 파일을 가지고 마이그레이트 하면 제대로 작동안하니까 typeorm 안쓰는걸로 변경 -> 조건에 orm사용하지 말라..
프리온보딩 | 1차과제 - 1
·
wecode
회원, 회원 건강기록 관리 앱 만들기 데이터모델링 유저 삭제는 진짜 데이터를 지우지 않고 비활성화 상태로 두는거라서 is_active컬럼을 추가해서 삭제시 비활성화상태로 바뀌도록 했다. 회원 측정 데이터는 같이 삭제되면 안되는데, 유저 삭제가 진짜 삭제가 아니기 때문에 외래키제약은 그냥 on delete cascade로 줬다. 당장은 그냥 비활성화 상태지만 나중에 보관기간이 지나고 회원정보를 진짜로 삭제한다면 기록도 같이 삭제되어야 할것같기 때문.. mysql은 boolean타입이 없다고 한다. 우리가 boolean으로 지정해서 true false란 값을 넣을순 있는데 내부적으로 tinyint로 바꿔서 true면 1 false면 0을 저장한다고함. 어쩐지 프로젝트때 boolean타입넣어서 true fal..
구방문방구 | 리팩토링: 상품리스트 모듈화
·
wecode
프로젝트 코드를 쳐다보고있는데 메인페이지와 카테고리별 상품 페이지의 리스트 만드는 코드가 완전히 똑같은걸 발견했다. 당연함. 메인페이지의 상품 리스트는 전체상품에서 필터링(신상품, 친환경, 베스트)된 리스트를 보여주는 것이기 때문... ✏️ 메인페이지 뷰(수정전) class MainPageView(View): def get(self, request): def get_list(products): product_list = [{ 'id' : product.id, 'name' : product.name, 'price' : product.price, 'is_green': product.is_green, 'is_best' : product.is_best, 'images' : [{ 'id' : image.id, '..
Code Kata | Week3 - Day2
·
wecode
문제 문자로 구성된 배열을 input으로 전달하면, 문자를 뒤집어서 return 해주세요. 새로운 배열을 선언하면 안 됩니다. 인자로 받은 배열을 수정해서 만들어주세요. Input: ["h","e","l","l","o"] Output: ["o","l","l","e","h"] 풀이 1 리스트 인덱싱을 이용한 풀이 def reverse_string(s): return s[::-1] 풀이 2 list의 메소드 reverse 사용하기 def reverse_string(s): s.reverse() return s s.reverse()는 s의 순서를 뒤집어주고 None을 반환한다. 풀이 3 파이썬 내장함수 reversed 사용하기 def reverse_string(s): return list(reversed(s))..
반응형