오늘의 코딩테스트
풀이
[프로그래머스/JS] 3진법 뒤집기
문제풀이function solution(n) { var answer = 0; let sum = []; while(n > 0) { sum.push(n % 3); n = Math.floor(n / 3); } sum.reverse(); for(let i = 0; i 해설10진법인 수 n을 3진법의 수로 바꾸기 위해서 우선 데이터를 계속 나누어
ezez99.tistory.com
오늘은 코딩테스트로 3진법 뒤집기에 대해서 학습하였다. 3진법 자체가 평소에 10진법, 2진법만 알던 나에게 생소했는데
계속 2진법처럼 계속 3으로 숫자를 나눠가면서 값을 구하는 방법이였다.
개념자체가 생소해서 그렇지 개념을 학습하고 난 다음부터는 그렇게 크게 어려움 없이 풀었던 것 같다.
학습포인트라고 한다면 제곱을 표현할려면 곱하기를 두번 연속으로하여 **로 표시하는 것이라던가 다른 사람의 풀이를 보고 배운 ParseInt()의 원리, toString(3) 같은 함수적인 부분을 이해하는데 학습시간이 들었던 것 같다!
그리고 오늘은 따로 모의 면접을 보았다.
최근의 학습한 것을 기준으로 면접을 보았는데, 그중 튜터님이 동기와 비동기의 대해 조금 더 블로그에 정리해보는 것이 좋을것 같다고 하셔서 블로그에 정리를 하였다.
동기와 비동기 정리
[CS]동기와 비동기의 이해(블록과 논블록)
오늘은 오늘 배운 모의면접을 바탕으로 추가적으로 조금 더 정리가 필요하다고 생각한 부분인동기와 비동기(블록과 논블록)에 대해서 공부해보고자 한다.동기와 비동기는 우선 데이터의 요청
ezez99.tistory.com
확실히 이렇게 정리하니깐 면접 상황 때 막상 대답하지 못하던 것을 머리속에서 한번 더 정리 하여서 다음부터는 쉽게 말할 수 있을 것 같았다.
오늘 한일
회원가입/로그인/middleware 기능
그리고 오늘은 앞서 만들던 게시판 사이트의 회원가입/로그인 기능과 AccessToken/RefreshToken에 대해 학습하였다.
회원가입 / 로그인 기능에 대해서 설명하자면 회원가입을 할 경우 해당하는 유저의 e-mail이 중복되지 않는다면 user의 정보 테이블과 userInfo의 정보테이블을 제작하게 하였고, password같은 경우에는 어제 학습한 bcrypt를 이용해서 암호화해주었다.
/* 사용자 회원가입 API */
router.post('/sign-up', async(req, res, next) => {
const {email, password, name, age,gender, profileImage } = req.body;
//이메일 중복체크 확인 부분
const isExistUser = await prisma.users.findFirst({
where: {email},
});
if(isExistUser){
return res.status(409).json({message: '이미 존재하는 이메일 입니다.'});
}
//비밀번호 암호화
const hashedPassword = await bcrypt.hash(password, 10);
//비밀번호는 암호화된 비밀번호로 저장
const user = await prisma.users.create({
data: {
email,
password: hashedPassword,
}
});
const userInfo = await prisma.userInfos.create({
data: {
UserId: user.userId,
name,
age,
gender: gender.toUpperCase(), //전달받은 gender를 전부 대문자로 치환한다.
profileImage,
}
});
return res.status(201).json({message: '회원가입이 완료 되었습니다.'});
});
그리고 로그인시스템에 대해서 학습하였는데, 우선 email과 password(암호화된 패스워드)를 먼저 비교하고 맞다면 로그인이 된다. 이때 jwt를 사용해서 authorization이라는 헤더에 Bearer token을 만들어 정보를 넣었다. 이 로그인 정보는 하나의 값만 가진다.(중복 로그인 방지)
/* 사용자 로그인 API */
router.post('/sign-in', async(req, res, next) => {
const {email, password} = req.body;
const user = await prisma.users.findFirst({ where: {email}});
if(!user){
return res.status(401).json({message: '존재하지 않는 이메일입니다.'});
}
const result = await bcrypt.compare(password, user.password);
if(!result){
return res.status(401).json({message: '비밀번호가 일치하지 않습니다.'});
}
const token = jwt.sign(
{
userId: user.userId,
},
'customized_secret_key',
)
res.cookie('authorization', `Bearer ${token}`);
return res.status(200).json({message: '로그인 성공했습니다.'})
})
그리고 이제 미들웨어를 사용해서 로그인한 사용자를 검색할 때에는 스스로를 검색하는 것이므로 cookie 값의 Bearer값을 가져와서 type을 비교하고 token과 키값을 비교하여서 해당 토큰의 사용자가 존재한다면 해당하는 정보값을 전달하도록 구현하였다.
그러면 이제 해당하는 정보를 조회하는 API를 만들 수 있다.
/* 사용자 조회 API */
router.get('/users', authMiddleware,async(req, res,next)=>{
const {userId} = req.user;
const user = await prisma.users.findFirst({
where: {userId: +userId},
//특정 컬럼만 조회하는 파라미터
select:{
userId:true,
email:true,
createdAt:true,
updatedAt:true,
UserInfos:{
select:{
name: true,
age: true,
gender: true,
profileImage: true,
},
}
}
});
return res.status(200).json({data: user});
});
위의 코드의 경우 select를 2중으로 달아서 UserInfo에 들어있는 select 정보값도 가져왔다.
내일은 본격적으로 학습한 것을 바탕으로 프로젝트를 시작해야겠다!
'코딩 > TIL' 카테고리의 다른 글
[TIL/25일차] 새로운 팀 프로젝트 시작 (0) | 2024.06.03 |
---|---|
[TIL/24일차] EC2서버에 프로젝트 배포 (0) | 2024.05.28 |
[TIL/22일차] JWT / 비밀번호 암호화 (0) | 2024.05.23 |
[TIL/21일차] Prisma method 학습 (0) | 2024.05.23 |
[TIL/20일차] SQL 학습 (0) | 2024.05.21 |