ddang-ddang / back-end Goto Github PK
View Code? Open in Web Editor NEWNestJS와 TypeORM을 활용한 땅땅 프로젝트 API 서버
NestJS와 TypeORM을 활용한 땅땅 프로젝트 API 서버
typeorm 최신버전인 0.3 이상 사용하는 경우 dependency injection 이슈가 생길 수 있습니다.
저의 경우 feeds.repository.ts파일의 아래의 코드 부분에서 에러가 발생했습니다.
@EntityRepository(Feed)
export class FeedRepository extends Repository<Feed> {}
에러내용 => Cannot set property metadata of #Repository which has only a getter ...
@ddang-ddang/team-nest
Front팀에서 아래와 같이 axios를 이용해 header를 요청했지만 백에서 header에서 받지를 못했습니다.
const instance = axios.create({
baseURL: "http://localhost:3005",
headers: {
"content-type": "application/json;charset=UTF-8",
accept: "application/json,",
"Access-Control-Allow-Origin": "*",
// "Authorization": `Bearer ${token}`,
},
});
개발자 툴-> 네트워크-> header
로 봤을때는 백에서 보내준 Authoraztion부분이 잘 확인되었지만,
막상 데이터를 열어보면 위에 요청한 headers 내용만 보이는 것이 보였습니다.
따라서 추측을 아래와 같이 했습니다.
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
['/api','/uploads,','/players'], //자신이 설정한 업로드 API이름을 입력한다
createProxyMiddleware({
target: 'http://192.168.1.42:3005', // target host API 서버 입력
changeOrigin: true,
})
);
};
@moto4321 @reload1bronze
http 에서는 아래와 같이 헤더만 보내도 문제없이 통신이 가능합니다.
수정된부분은 말씀드리고 바로 요청드리겠습니다.
headers: {
Authorization: `KakaoAK ${process.env.MAP_KAKAO_API_KEY}`,
},
하지만 https내에서는 아래와 같이 추가적으로 access-control-alllow-origin을 설정해 주셔야 합니다.
headers: {
Accept: '/',
'content-type': 'application/json;charset=UTF-8',
'Access-Control-Allow-Origin': '*',
Authorization: `KakaoAK ${process.env.MAP_KAKAO_API_KEY}`,
},
description
description
피드를 전체 조회할 때 사용자에 대한 정보도 join해서 보내줘야하는데 단순히 join하는 경우 password가 그대로 클라이언트에 보내지게 됩니다. 이를 막고 원하는 칼럼만 보내기 위해 queryBuilder를 사용했습니다. 더 좋은 방법있다면 코멘트 부탁드립니다.
const { regionSi, regionGu, regionDong } = regionData;
const feeds = await Feed.createQueryBuilder('feed')
.select([
'feed',
'player.id',
'player.email',
'player.nickname',
'player.mbti',
'player.profileImg',
'player.level',
'player.exp',
])
.where({ deletedAt: null })
.leftJoinAndSelect('feed.quest', 'quest')
.leftJoin('feed.player', 'player')
.leftJoinAndSelect('feed.comments', 'comment')
.leftJoinAndSelect('feed.likes', 'likes')
.leftJoinAndSelect('feed.region', 'region')
.where(
'region.regionSi = :si and region.regionGu = :gu and region.regionDong = :dong',
{ si: regionSi, gu: regionGu, dong: regionDong }
)
.getMany();
@reload1bronze @diasm3
@reload1bronze 아래 확인 부탁드리겠습니다!
서버 실행중 특정 시간? 지나면 아래와 같은 에러메세지가 발생합니다.
카카오 API 부부분에서 에러메세지가 발생하는 거 같습니다.
Cannot destructure property 'address' of 'res.data.documents[0]' as it is undefined.
카카오API - getAddressName: 576.721ms
(node:61139) Warning: Label 'getAll' already exists for console.time()
Cannot destructure property 'address' of 'res.data.documents[0]' as it is undefined.
카카오API - getAddressName: 488.758ms
(node:61139) Warning: Label '주소API - getRegionData' already exists for console.time()
(node:61139) Warning: Label 'getAll' already exists for console.time()
Cannot destructure property 'address' of 'res.data.documents[0]' as it is undefined.
카카오API - getAddressName: 520.166ms
(node:61139) Warning: Label '주소API - getRegionData' already exists for console.time()
player테이블에서 email과 id로 탐색하는 방법 중 id로 탐색하는 방법을 선택하였습니다.
id값이 auto_increment로 설정이 되어 있어서 탐색 속도가 더 빠르지 않을까 했지만 index를 설정하지 않으면 똑같다고 합니다.
index를 설정하면 장단점이 있는데 select문이 더 빠른 장점이 있고 insert, update, delete 성능이 떨어지는 단점이 있습니다. 만들고자 하는 서비스에 따라서 선택적으로 쓰면 되지만 저희 서비스의 경우 index를 설정할 필요성을 느끼지 못했습니다. 혹시 의견 있으시면 코멘트 부탁드립니다.
@reload1bronze @diasm3
@reload1bronze @moto4321 @pol-dev-shinroo
현재 개발된 부분은 간단하게 서버에서 JWT토큰을 발행후 3600초 동안 유지하는 방식으로 테스트를 완료했습니다.
하지만 실제 서비스에서는 보안에 관련하여 좀더 신경써야 하기때문에 Access Token 과 Refresh Token을 이용한 3 Handshake 방식의 인증 방식을 사용하려고 합니다.(5월 16일 개발 예정)
To @pol-dev-shinroo
지금 테스트를 진행할때는 3600초동안 JWT토큰이 유지될거라 3600 이후에는 다시 JWT토큰을 받으려면 로그인을 다시 해야하는 문제점이 있습니다.
따라서 Access Token과 Fresh Token에 대해 이해 하시고 나중에 적용할때 준비를 해두시면 좋을 듯 합니다.
리엑트에서 Refresh Token 관리법 레퍼런스
백에서 Refresh Token 레퍼런스
가정 1. Access Token과 Refresh Token이 둘다 없을때
가정 2. Access Token은 만료 되고, Refresh Token이 유효할때
가정3. accessToken은 만료 되고, refreshToken도 만료될때
-> 다시 로그인해야함
현재 AuthGuard를 통과하지 못하는 경우, 401 Unauthorized로 응답하고 있습니다.
AuthGuard는 '인증'보다는 '인가'에 가까운 성격이므로 403 Forbidden 응답이 적절해 보입니다.authorization의 뜻이 '인가'이므로 401이 '인가'에 대한 거부로 생각되기는 하나,
일반적으로 401은 '인증'에 대한 예외, 403은 '인가'에 대한 예외라고 합니다.급한 건은 아니나, 생각난 김에 이슈로 등록합니다.
추가 의견 있으시면 코멘트 부탁드립니다.
주소 및 좌표 요청 API를 순차적으로 수행함에 따라 처리 시간이 비례적으로 늘어남
3개 요청시 3.074s, 10개 요청시 9.056s
entity 객체가 아닌 id 값으로 저장하고 조회하는 것으로 수정
사유: entity 객체를 활용해서 외래키를 저장하는 현재의 방법은 id를 알고 있음에도 쿼리 문을 날려서 entity를 조회해야 하는 구조
description
아직 퀘스트가 생성되지 않은 지역의 경우,
짧은 시간 간격으로 퀘스트 조회 요청시 지역 및 퀘스트 데이터를 중복으로 생성합니다.
TypeORM의 Unique 데코레이터를 활용하여 해당 컬럼들을 조합한 제약사항을 둡니다.
const locations = await this.find({
order: { id: 'DESC' },
relations: ['completes', 'completes.quest'],
select: [
'id',
'nickname',
'profileImg',
'mbti',
'level',
'exp',
'completes',
// 'completes.quest.id',
],
});
return locations;
} catch (err) {
return err.message;
}
}
너무 많은 요청을 동시에 보내게 되면 429 에러를 반환하는 문제
카카오맵 API의 경우 월간 일간 제한 뿐만 있는게 아니라 초당 호출수 쿼터 제한도 존재한다고 합니다. 정확한 제한 수치를 찾아보고자 했으나 정확한 수치는 공개하기 어렵다고 합니다.
좌표를 랜덤하게 뽑는 로직 개선
juso.go.kr의 공공API 활용시 주소 데이터를 페이지 별로 나눠서 응답받게 됩니다. (페이지별 주소 데이터 최대 100개)
현재는 페이지별로 1개의 주소 데이터를 랜덤하게 추출하고 있습니다.
무작위를 제대로 구현하기 위해서는 특정 개수의 주소를 무작위 페이지, 무작위 인덱스에서 추출해야 합니다.
해당 로직의 구현은 후순위로 미뤄두었지만, 추후 개선을 위해 이슈로 기록합니다.
리덕스에서 프로필 이미지를 가져와서 프로필 수정하는 페이지에 preview로 보여줍니다.
이후 useState를 사용해서 변화된 이미지를 받아옵니다.
이때 useState 초기값으로 리덕스에서 받아온 image preview를 넣을 수가 없습니다.
preview 값이 콘솔로 찍히지만, useState에 초기값으로 넣어지지가 않습니다.
그래서 react-hook-form 으로 해결은 했지만,
이유를 잘 모르겠습니다
description
// 리덕스에 저장된 유저정보를 가져옵니다.
const userDetail = useSelector((state) => state.user);
console.log(userDetail.profileImg)
// profileImg가 존재합니다
// useState를 사용해서 리덕스에서 가져온 profileImg를 useState초기값으로 설정합니다.
const [profileImage, setProfileImage] = React.useState(profileImg ? profileImg : "");
return (
)
이때 preview가 화면에 나오지가 않습니다.
axios.get("/players/myPage") 로 리덕스에 저장한 후 리덕스에서 데이터를 가져오지 말고, 컴포넌트 자체에서 axios로 가져오기
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.