유저를 관리하다보면 유저의 요청으로 회원 정보를 변경하거나 회원 정보를 조회 할 일이 생긴다.
이 부분을 구현해볼려고 한다.
회원 정보 변경
유저가 로그인해서 자신의 페이지에 들어가 자신의 정보를 변경 할 때 서버에 보내야 하는 요청 메시지와
응답 메시지를 구현해 볼려고 한다.
Model 패키지
PatchUserReq : 요청 메시지에 들어가야 할 정보, 여기서는 유저의 번호와 이름을 알 때 유저의 정보를 바꿀수 있게 만들었다.
package com.example.delivery.src.user.moedl;
import lombok.*;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PatchUserReq {
private int userIdx;
private String name;
}
User : 요청메시지에의한 응답메시지에 들어갈 내용이다. 바뀐 정보를 보여주기 위해 만들었다.
package com.example.delivery.src.user.moedl;
import lombok.*;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {
private int userIdx;
private String email;
private String password;
private String name;
private String phoneNumber;
private String Birth;
}
UserController
/**
* 유저정보변경 API
* [PATCH] /users/:userIdx
*/
@ResponseBody
@PatchMapping("/{userIdx}")
public BaseResponse<String> modifyUserName(@PathVariable("userIdx") int userIdx, @RequestBody User user){
try{
int userIdxByJwt = jwtService.getUserIdx();
if(userIdx != userIdxByJwt){
return new BaseResponse<>(INVALID_USER_JWT);
}
PatchUserReq patchUserReq = new PatchUserReq(userIdx, user.getName());
userService.modifyUserName(patchUserReq);
String result = "회원정보가 수정되었습니다.";
return new BaseResponse<>(result);
}catch(BaseException exception){
return new BaseResponse<>(exception.getStatus());
}
}
유저가 입력한 인덱스와 jwt를 통해 해독한 유저의 인덱스가 일치할 경우 정보를 변경할 수 있게 승인해준다.
UserService
//유저 정보 변경
public void modifyUserName(PatchUserReq patchUserReq) throws BaseException{
try{
int result = userDao.modifyUserName(patchUserReq);
if(result == 0) {
throw new BaseException(MODIFY_FAIL_USERNAME);
}
}catch(Exception exception){
throw new BaseException(DATABASE_ERROR);
}
}
UserDao
public int modifyUserName(PatchUserReq patchUserReq) {
String modifyUserQuery = "update User set name = ? where userIdx = ?";
Object[] modifyUserNameParams = new Object[]{patchUserReq.getName(), patchUserReq.getUserIdx()};
return this.jdbcTemplate.update(modifyUserQuery,modifyUserNameParams);
}
데이터베이스에서 유저의 정보를 가져오는 부분이다.
실행결과
- 정상적인 결과
- 다른 유저가 접근
- 다른 jwt로 접근
트러블 슈팅
포스트맨에서 body부분에 name만 써서 보낼 경우 User의 모든 내용을 채우지 않았다는 오류가 뜬다. 그 이유는 템플릿의 User에는 @AllArgsConstructor만 적혀있어 모든 파라미터가 있어야 생성되게 만들어져있다. 그래서 name만 적었을 경우 오류가 발생한 것이다.
- 해결 방법
@NoArgsConstructor(access = AccessLevel.*PROTECTED*) 이 부분을 밑에 추가 하면 된다. 파라미터가 없어도 생성자가 생성되게 하면 해결된다.
회원 정보 조회
UserController
/**
* 모든 회원들의 조회 API
* [GET] /users
*
* 또는
*
* 해당 닉네임을 같는 유저들의 정보 조회 API
* [GET] /users? NickName=
*/
//Query String
@ResponseBody
@GetMapping("")
public BaseResponse<List<GetUserRes>> getUsers(@RequestParam(required = false) String name){
try{
if(name == null){ //name이 없을 경우 모두 조회
List<GetUserRes> getUserRes = userProvider.getUsers();
return new BaseResponse<>(getUserRes);
}
//같은 이름 인 것만 조회
List<GetUserRes> getUserRes = userProvider.getUserByName(name);
return new BaseResponse<>(getUserRes);
} catch (BaseException exception){
return new BaseResponse<>(exception.getStatus());
}
}
/**
* 회원 1명 조회 API
* [GET] /users/:userIdx
*/
@ResponseBody
@GetMapping("/{userIdx}") //Path에 직접 변수를 받음
public BaseResponse<GetUserRes> getUser(@PathVariable("userIdx") int userIdx){
try{
GetUserRes getUserRes = userProvider.getUser(userIdx);
return new BaseResponse<>(getUserRes);
} catch (BaseException exception){
return new BaseResponse<>(exception.getStatus());
}
}
회원 정보를 조회 할 수 있는 방법은 2가지가 있다. 하나는 닉네임을 통해 닉네임이 같은 유저를 조회 할 수 있는 것이고 다른 하나는 유저 인덱스를 Path에 직접 변수로 받아서 회원 1명만 조회하는 것이다.
UserProvider
//User들의 정보 조회
public List<GetUserRes> getUsers() throws BaseException{
try{
List<GetUserRes> getUserRes = userDao.getUsers();
return getUserRes;
}catch (Exception exception){
throw new BaseException(DATABASE_ERROR);
}
}
//User들을 name으로 조회
public List<GetUserRes> getUserByName(String name) throws BaseException{
try{
List<GetUserRes> getUserRes = userDao.getUsersByName(name);
return getUserRes;
}catch (Exception exception){
throw new BaseException(DATABASE_ERROR);
}
}
public GetUserRes getUser(int userIdx) throws BaseException{
try{
GetUserRes getUserRes = userDao.getUser(userIdx);
return getUserRes;
} catch (Exception exception){
throw new BaseException(DATABASE_ERROR);
}
}
UserDao
public List<GetUserRes> getUsers(){
String getUsersQuery = "select userIdx, email, password, name, phoneNumber, Birth from User";
return this.jdbcTemplate.query(getUsersQuery,
(rs, rowNum) -> new GetUserRes(
rs.getInt("userIdx"),
rs.getString("email"),
rs.getString("password"),
rs.getString("name"),
rs.getString("phoneNumber"),
rs.getString("Birth"))
);
}
public List<GetUserRes> getUsersByName(String name){
String GetUserByNameQuery = "select userIdx, email, password, name, phoneNumber, Birth from User where name = ?";
String GetUserByNameParam = name;
return this.jdbcTemplate.query(GetUserByNameQuery,
(rs, rowNum) -> new GetUserRes(
rs.getInt("userIdx"),
rs.getString("email"),
rs.getString("password"),
rs.getString("name"),
rs.getString("phoneNumber"),
rs.getString("Birth")), GetUserByNameParam);
}
public GetUserRes getUser(int userIdx){
String GetUserQuery = "select userIdx, email, password, name, phoneNumber, Birth from User where userIdx = ?";
int GetUserParam = userIdx;
return this.jdbcTemplate.queryForObject(GetUserQuery,
(rs, rowNum) -> new GetUserRes(
rs.getInt("userIdx"),
rs.getString("email"),
rs.getString("password"),
rs.getString("name"),
rs.getString("phoneNumber"),
rs.getString("Birth")), GetUserParam);
}
유저 전체를 조회, 닉네임으로 유저 조회, 인덱스로 유저 조회 3가지 방법을 구현해 보았다.
실행결과
- 모든 유저 조회
- 특정 이름 유저 조회
- 특정 번호 유저 조회
유저 관리 프로젝트에서 만든 API 목록
'토이프로젝트 > 배달의 민족 클론코딩' 카테고리의 다른 글
레스토랑 관리 - 레스토랑 조회(Paging 처리) (0) | 2022.12.19 |
---|---|
레스토랑 관리 - 레스토랑 등록 (0) | 2022.12.19 |
유저관리 - 로그인 (0) | 2022.12.16 |
유저 관리 - 회원 가입 (0) | 2022.12.14 |
유저 관리 - 준비 단계 (0) | 2022.12.14 |