1. 로그인 API 구현 + JWT 발급
(1) 로그인 API
auth라는 도메인을 따로 만들어줬다. (원래 있던 user에서 진행해도됨)

# model
PostLoginReq
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class PostLoginReq {
// 로그인 할 때 입력하는 정보
// 이메일로 로그인하기
private String email;
private String pwd;
}
PostLoginRes
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class PostLoginRes {
private int userIdx;
private String jwt;
}
User
@Getter
@Setter
@AllArgsConstructor
public class User {
// pwd만 있어도 됨
private int userIdx;
private String name;
private String nickName;
private String phone;
private String email;
private String password;
}
# Controller
@ResponseBody
@PostMapping("/logIn")
public BaseResponse<PostLoginRes> logIn(@RequestBody PostLoginReq postLoginReq) {
try{
// 이메일을 입력하지 않았을 때
if(postLoginReq.getEmail()==null){
return new BaseResponse<>(POST_USERS_EMPTY_EMAIL);
}
// 비밀번호를 입력하지 않았을 때
if(postLoginReq.getPwd()==null){
return new BaseResponse<>(POST_USERS_EMPTY_PASSWORD);
}
// 정규식 검증
if(!isRegexEmail(postLoginReq.getEmail())){
return new BaseResponse<>(POST_USERS_INVALID_EMAIL);
}
PostLoginRes postLoginRes = authService.logIn(postLoginReq);
return new BaseResponse<>(postLoginRes);
} catch(BaseException exception){
return new BaseResponse<>((exception.getStatus()));
}
}
# Service
public PostLoginRes logIn(PostLoginReq postLoginReq) throws BaseException{
// body로 받은 유저 로그인 객체를 dao에 전달해서 그에 해당하는 유저를 받아온다
// 유저의 비밀번호를 받아올텐데, 새롭게 받은 유저의 비밀번호와 db에 유저의 비밀번호를 비교한다
User user = authDao.getPwd(postLoginReq); // 유저의 비밀번호
String encryptPwd;
try{
encryptPwd = new SHA256().encrypt(postLoginReq.getPwd()); // 암호화 해준 비밀번호
}
catch (Exception exception) {
throw new BaseException(PASSWORD_ENCRYPTION_ERROR);
}
if(user.getPassword().equals(encryptPwd)){
int userIdx = user.getUserIdx();
// 같다면 jwt 발급
String jwt = jwtService.createJwt(userIdx);
return new PostLoginRes(userIdx, jwt);
}
else{
throw new BaseException(FAILED_TO_LOGIN);
}
}
# Dao
public User getPwd(PostLoginReq postLoginReq){
String getPwdQuery = "select userIdx, nickname, phone, email, password from User where email = ?";
String getPwdParams = postLoginReq.getEmail();
return this.jdbcTemplate.queryForObject(getPwdQuery,
(rs,rowNum)->new User(
rs.getInt("userIdx"),
rs.getString("name"),
rs.getString("nickName"),
rs.getString("phone"),
rs.getString("email"),
rs.getString("password")
),
getPwdParams
);
}
# jwt 발급 받기
user 도메인에서 다음 api를 이용해 회원가입을 해주면 jwt가 발급된다. 발급된 jwt를 가지고 auth 도메인에서 로그인 api를 사용해보겠다.
/**
* 회원가입 API
* [POST] /users
* @return BaseResponse<PostUserRes>
*/
// Body
@ResponseBody
@PostMapping("") // (POST) 127.0.0.1:9000/users
public BaseResponse<PostUserRes> createUser(@RequestBody PostUserReq postUserReq) {
// TODO: email 관련한 짧은 validation 예시입니다. 그 외 더 부가적으로 추가해주세요!
if(postUserReq.getEmail() == null){
return new BaseResponse<>(POST_USERS_EMPTY_EMAIL);
}
// 이메일 정규표현
if(!isRegexEmail(postUserReq.getEmail())){
return new BaseResponse<>(POST_USERS_INVALID_EMAIL);
}
try{
PostUserRes postUserRes = userService.createUser(postUserReq);
return new BaseResponse<>(postUserRes);
} catch(BaseException exception){
return new BaseResponse<>((exception.getStatus()));
}
}
# postman
- 회원가입

- 로그인

🤯트러블 슈팅
postman에서 회원가입 api를 테스트 해보려 했는데 데이터 베이스 연결에 실패했다는 에러가 발생했다! 지난번에는 validation해주는 쿼리문에 오타가 있어서 그랬는데,, 이번엔 뭘까,,~ 후

회원가입 코드에 직접 로그를 찍어 어디서 오류났는지 찾아보니까 Dao에서 insert가 실행되지 않고 있었다!
여기저기 찾아봤더니 db에 토큰을 담으려면 password의 데이터타입이 text여야한다길래 바꿔봤더니.. 또 같은 오류가 발생했다.. (원래 비밀번호의 데이터 타입이 varchar(20)이었는데 토큰을 담아내기엔 한참 모자랐을 듯! .. 이건 원인1)
타입을 바꿔도 계속 연결에 실패했다는 에러메시지가 떴다ㅜㅡㅜ
결론은 내가 db를 생성할 때 profileImgUrl의 값은 null값이면 안된다고 설정해놓고..!! profileImgUrl의 데이터를 추가해주지 않아서 이런 오류가 발생한 것이었다! 이번 오류도 생각보다 별거 아니라.. 허무하지만 원인을 찾아내서 뿌듯하다...!!!
2. 게시물 생성 API (회원용)에서 헤더로 JWT를 받아 인증하기
post 도메인의 controller
@ResponseBody
@PostMapping("")
public BaseResponse<PostPostsRes> createPosts(@RequestBody PostPostsReq postPostsReq) {
try{
// 추가한 부분
int userIdxByJwt = jwtService.getUserIdx();
if(postPostsReq.getUserIdx()!=userIdxByJwt){
return new BaseResponse<>(BaseResponseStatus.INVALID_USER_JWT);
}
//
if(postPostsReq.getContent().length()>450){
return new BaseResponse<>(BaseResponseStatus.POST_POSTS_INVALID_CONTENTS);
}
if(postPostsReq.getPostImgUrls().size()<1){
return new BaseResponse<>(BaseResponseStatus.POST_POSTS_EMPTY_IMGURL);
}
PostPostsRes postPostsRes = postService.createPosts(postPostsReq.getUserIdx(),postPostsReq);
return new BaseResponse<>(postPostsRes);
} catch(BaseException exception){
return new BaseResponse<>((exception.getStatus()));
}
}
기존 코드에서 토큰의 유저와 바디로 받은 유저가 같은지 확인하는 코드를 추가해줬다. -> 이 유저는 회원인가 아닌가!
# postman
아래와 같이 헤더에 발급 받은 토큰을 추가해줘야한다!


우앙 드디어 10주차 실습까지 끝났다.. .. 다음주부터 스터디가 없다니 좋기도하고.. 시원섭섭하다. ..~ 이번학기에 umc하길 잘한 것 같다!!! 원래 나 혼자 공부하려했는데.. .. 그럼 아무것도 안했을 듯! 난 게으름뱅이니까ㅎㅎ... 근데 나 이대로 앱런칭할 수 있나..?ㅜㅠ 걱정이 되는군 ! 사실 끝이 아니라 로컬에서 작업한거 서버에 올리는 것도 해봐야하는데 ... (공부하기 싫어서 서버에 올리는거 바로 해버림.. ) 시험끝나고 다른 api도 ... 만들어보고 .. 서버에 올려봐야겠다!!!! (+ 챌린지 과제도 있담 ㅎㅏ암) 그럼 진짜 끝 ~~ 모두 수고하셨습니당 ~~🐿️
그런데.. 서버로 postman 돌리면 다 되는데 https 붙이면 안된다 흠!!!!!
'Server > UMC 2기 Server' 카테고리의 다른 글
[UMC] Server 10주차 Paging / Transaction / 로그인 / 쿠키세션 / jwt / OAuth (0) | 2022.05.26 |
---|---|
[UMC] Server 9주차 *POST*PATCH*DELETE* 게시물 생성 API / 게시물 수정 API / 게시물 삭제 API (0) | 2022.05.18 |
[UMC] Server 8주차 **GET** 유저 피드 조회 API / 게시물 리스트 조회 API (0) | 2022.05.12 |
[UMC] Server 7주차 유저 삭제 API (0) | 2022.05.07 |
[UMC] Server 7주차 Springboot / 유저 조회 API / API 명세서 작성 (0) | 2022.05.05 |
1. 로그인 API 구현 + JWT 발급
(1) 로그인 API
auth라는 도메인을 따로 만들어줬다. (원래 있던 user에서 진행해도됨)

# model
PostLoginReq
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class PostLoginReq {
// 로그인 할 때 입력하는 정보
// 이메일로 로그인하기
private String email;
private String pwd;
}
PostLoginRes
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class PostLoginRes {
private int userIdx;
private String jwt;
}
User
@Getter
@Setter
@AllArgsConstructor
public class User {
// pwd만 있어도 됨
private int userIdx;
private String name;
private String nickName;
private String phone;
private String email;
private String password;
}
# Controller
@ResponseBody
@PostMapping("/logIn")
public BaseResponse<PostLoginRes> logIn(@RequestBody PostLoginReq postLoginReq) {
try{
// 이메일을 입력하지 않았을 때
if(postLoginReq.getEmail()==null){
return new BaseResponse<>(POST_USERS_EMPTY_EMAIL);
}
// 비밀번호를 입력하지 않았을 때
if(postLoginReq.getPwd()==null){
return new BaseResponse<>(POST_USERS_EMPTY_PASSWORD);
}
// 정규식 검증
if(!isRegexEmail(postLoginReq.getEmail())){
return new BaseResponse<>(POST_USERS_INVALID_EMAIL);
}
PostLoginRes postLoginRes = authService.logIn(postLoginReq);
return new BaseResponse<>(postLoginRes);
} catch(BaseException exception){
return new BaseResponse<>((exception.getStatus()));
}
}
# Service
public PostLoginRes logIn(PostLoginReq postLoginReq) throws BaseException{
// body로 받은 유저 로그인 객체를 dao에 전달해서 그에 해당하는 유저를 받아온다
// 유저의 비밀번호를 받아올텐데, 새롭게 받은 유저의 비밀번호와 db에 유저의 비밀번호를 비교한다
User user = authDao.getPwd(postLoginReq); // 유저의 비밀번호
String encryptPwd;
try{
encryptPwd = new SHA256().encrypt(postLoginReq.getPwd()); // 암호화 해준 비밀번호
}
catch (Exception exception) {
throw new BaseException(PASSWORD_ENCRYPTION_ERROR);
}
if(user.getPassword().equals(encryptPwd)){
int userIdx = user.getUserIdx();
// 같다면 jwt 발급
String jwt = jwtService.createJwt(userIdx);
return new PostLoginRes(userIdx, jwt);
}
else{
throw new BaseException(FAILED_TO_LOGIN);
}
}
# Dao
public User getPwd(PostLoginReq postLoginReq){
String getPwdQuery = "select userIdx, nickname, phone, email, password from User where email = ?";
String getPwdParams = postLoginReq.getEmail();
return this.jdbcTemplate.queryForObject(getPwdQuery,
(rs,rowNum)->new User(
rs.getInt("userIdx"),
rs.getString("name"),
rs.getString("nickName"),
rs.getString("phone"),
rs.getString("email"),
rs.getString("password")
),
getPwdParams
);
}
# jwt 발급 받기
user 도메인에서 다음 api를 이용해 회원가입을 해주면 jwt가 발급된다. 발급된 jwt를 가지고 auth 도메인에서 로그인 api를 사용해보겠다.
/**
* 회원가입 API
* [POST] /users
* @return BaseResponse<PostUserRes>
*/
// Body
@ResponseBody
@PostMapping("") // (POST) 127.0.0.1:9000/users
public BaseResponse<PostUserRes> createUser(@RequestBody PostUserReq postUserReq) {
// TODO: email 관련한 짧은 validation 예시입니다. 그 외 더 부가적으로 추가해주세요!
if(postUserReq.getEmail() == null){
return new BaseResponse<>(POST_USERS_EMPTY_EMAIL);
}
// 이메일 정규표현
if(!isRegexEmail(postUserReq.getEmail())){
return new BaseResponse<>(POST_USERS_INVALID_EMAIL);
}
try{
PostUserRes postUserRes = userService.createUser(postUserReq);
return new BaseResponse<>(postUserRes);
} catch(BaseException exception){
return new BaseResponse<>((exception.getStatus()));
}
}
# postman
- 회원가입

- 로그인

🤯트러블 슈팅
postman에서 회원가입 api를 테스트 해보려 했는데 데이터 베이스 연결에 실패했다는 에러가 발생했다! 지난번에는 validation해주는 쿼리문에 오타가 있어서 그랬는데,, 이번엔 뭘까,,~ 후

회원가입 코드에 직접 로그를 찍어 어디서 오류났는지 찾아보니까 Dao에서 insert가 실행되지 않고 있었다!
여기저기 찾아봤더니 db에 토큰을 담으려면 password의 데이터타입이 text여야한다길래 바꿔봤더니.. 또 같은 오류가 발생했다.. (원래 비밀번호의 데이터 타입이 varchar(20)이었는데 토큰을 담아내기엔 한참 모자랐을 듯! .. 이건 원인1)
타입을 바꿔도 계속 연결에 실패했다는 에러메시지가 떴다ㅜㅡㅜ
결론은 내가 db를 생성할 때 profileImgUrl의 값은 null값이면 안된다고 설정해놓고..!! profileImgUrl의 데이터를 추가해주지 않아서 이런 오류가 발생한 것이었다! 이번 오류도 생각보다 별거 아니라.. 허무하지만 원인을 찾아내서 뿌듯하다...!!!
2. 게시물 생성 API (회원용)에서 헤더로 JWT를 받아 인증하기
post 도메인의 controller
@ResponseBody
@PostMapping("")
public BaseResponse<PostPostsRes> createPosts(@RequestBody PostPostsReq postPostsReq) {
try{
// 추가한 부분
int userIdxByJwt = jwtService.getUserIdx();
if(postPostsReq.getUserIdx()!=userIdxByJwt){
return new BaseResponse<>(BaseResponseStatus.INVALID_USER_JWT);
}
//
if(postPostsReq.getContent().length()>450){
return new BaseResponse<>(BaseResponseStatus.POST_POSTS_INVALID_CONTENTS);
}
if(postPostsReq.getPostImgUrls().size()<1){
return new BaseResponse<>(BaseResponseStatus.POST_POSTS_EMPTY_IMGURL);
}
PostPostsRes postPostsRes = postService.createPosts(postPostsReq.getUserIdx(),postPostsReq);
return new BaseResponse<>(postPostsRes);
} catch(BaseException exception){
return new BaseResponse<>((exception.getStatus()));
}
}
기존 코드에서 토큰의 유저와 바디로 받은 유저가 같은지 확인하는 코드를 추가해줬다. -> 이 유저는 회원인가 아닌가!
# postman
아래와 같이 헤더에 발급 받은 토큰을 추가해줘야한다!


우앙 드디어 10주차 실습까지 끝났다.. .. 다음주부터 스터디가 없다니 좋기도하고.. 시원섭섭하다. ..~ 이번학기에 umc하길 잘한 것 같다!!! 원래 나 혼자 공부하려했는데.. .. 그럼 아무것도 안했을 듯! 난 게으름뱅이니까ㅎㅎ... 근데 나 이대로 앱런칭할 수 있나..?ㅜㅠ 걱정이 되는군 ! 사실 끝이 아니라 로컬에서 작업한거 서버에 올리는 것도 해봐야하는데 ... (공부하기 싫어서 서버에 올리는거 바로 해버림.. ) 시험끝나고 다른 api도 ... 만들어보고 .. 서버에 올려봐야겠다!!!! (+ 챌린지 과제도 있담 ㅎㅏ암) 그럼 진짜 끝 ~~ 모두 수고하셨습니당 ~~🐿️
그런데.. 서버로 postman 돌리면 다 되는데 https 붙이면 안된다 흠!!!!!
'Server > UMC 2기 Server' 카테고리의 다른 글
[UMC] Server 10주차 Paging / Transaction / 로그인 / 쿠키세션 / jwt / OAuth (0) | 2022.05.26 |
---|---|
[UMC] Server 9주차 *POST*PATCH*DELETE* 게시물 생성 API / 게시물 수정 API / 게시물 삭제 API (0) | 2022.05.18 |
[UMC] Server 8주차 **GET** 유저 피드 조회 API / 게시물 리스트 조회 API (0) | 2022.05.12 |
[UMC] Server 7주차 유저 삭제 API (0) | 2022.05.07 |
[UMC] Server 7주차 Springboot / 유저 조회 API / API 명세서 작성 (0) | 2022.05.05 |