2023. 10. 29. 01:03ㆍGithub 프로젝트/음식점 포스 프로그램
지난 시간에는 인터페이스 개발 전, DB 설계 기반으로 Mapper 개발과 Dto로 필드값을 받는 것을 확인해 보았습니다.
이번 시간에는 Front-End 개발자에게 넘겨줄 각각 인터페이스 개발을 진행 해 보겠습니다.
github: https://github.com/BerkleyLim/foodstor_pos
GitHub - BerkleyLim/foodstor_pos: This is the program on foot store pos machine.
This is the program on foot store pos machine. . Contribute to BerkleyLim/foodstor_pos development by creating an account on GitHub.
github.com
1. 프론트엔드 개발자에게 제공 해 줄 고객, 로그 정보 API 리스트
- API 원칙
1) uri 부분에서는 대문자를 절대 사용 하지 않는다.
2) Front 서버와 Back 서버와 연동 시 CORS 문제 해결 할 것 (보안상 인터페이스를 제한적으로 사용 가능)
3) 가급적 로직적인 부분은 백엔드에서 사용할 것. (View 관련 로직은 프론트엔드에서 사용한다.)
4) Controller 는 입출력 처리, 1개의 Data를 여러개의 서비스 로직이 필요한 부분을 넣을 수 있음
5) Service 는 백엔드에서 사용해야할 로직적인 부분에서 작업을 진행 해야한다. (Data 가공 처리 역할)
<사용자 정보>
- 사용자 조회 => (이 프로젝트에서는 1명의 회원만 조회)
- URI :/api/user/info/
- Method : GET
- Request : null
- Response : 리스트 [uno, userName, userAge, userSex, userPhone, userNumber, userCardPassword]
- 회원 정보 추가
- URI :/api/user/info/insert/user/info
- Method : POST
- Request : uno, userName, userAge, userSex, userPhone, userNumber, userCardPassword, lno, pageNo, pageEventTitle, pageEventView, crtTime
- Response : 없음
- 회원 정보, 로그, 계좌 정보 (전체) => 이 프로젝트에서는 연습용 프로젝트이고, 1명의 회원만 존재하여 진행
- URI :/api/user/info/insert/user/info
- Method : POST
- Request : 없음
- Response : 없음
<로그 관련 >
- 로그 조회 => (이 프로젝트에서는 1명의 회원만 조회)
- URI :/api/log/
- Method : GET
- Request : null
- Response : 리스트 [uno, lno, uno, pageNo, pageEventTitle, pageEventView, crtTime]
2. 고객 정보, 로그 API 개발
(1) 사용자 조회 => (이 프로젝트에서는 1명의 회원만 조회)
<UserInfoController.java>
@GetMapping("/api/user/")
public List<UserInfoDto> selectUserInfo() {
return userInfoService.selectUserInfo();
}
<UserInfoService.java>
public List<UserInfoDto> selectUserInfo() {
return userInfoMapper.selectUserInfo();
}
(2) 회원 정보 추가
<UserInfoController.java>
@PostMapping("/api/user/insert/user/info")
public int insertUserInfo(
@RequestBody UserInfoVo userInfoVo) {
return userInfoService.insertUserInfo(userInfoVo);
}
<UserInfoService.java>
public int insertUserInfo(UserInfoVo userInfoVo) {
/**
* 아래부터 개발 만 했을 경우, 정상적으로 로직이 잘 돌아가나
* 단점은 API 처리 도중 중간에 에러 날 경우 이상 DB가 나올 수 있다.
* 유저는 정상적으로 삽입이 되었으나, 로그 기록에 남길 경우 로그 기록에 안남는 경우가 있다.
* 혼자서 토이프로젝트 진행 시 문제없이 잘 돌아가지만
* 실제 현업 프로젝트에서는 데이터 규모와 사용량이 많기 때문에 응답시간 초과일 경우
* 중간에 에러가 나는 부분이 있을 수 있으므로 이에 참고 바람
*/
// 유저 삽입
UserInfoDto userInfoDto = UserInfoDto.from(userInfoVo);
System.out.println(userInfoDto.toString());
int insertUserInfoStatus = userInfoMapper.insertUserInfo(userInfoDto);
System.out.println(insertUserInfoStatus);
// 계좌 추가
long userMoney = 200000;
AccountDto accountDto = AccountDto.fromInitInsert(
userInfoMapper.selectLastRowUno(),
userMoney);
int insertAccountStatus = accountMapper.insertAccount(accountDto);
System.out.println(insertAccountStatus);
// 로그 삽입
LogDto logDto = LogDto.fromUserInfo(userInfoVo);
// 마지막 행 출력 이용하여, 유저 삽입 시 auto로 생성된 uno를 넣는다.
// 사용자 생성 시 한정으로 가장 최근 생성 된 테이블 중 uno 마지막 로그 출력
logDto.setUno(userInfoMapper.selectLastRowUno());
System.out.println(logDto.toString());
int insertLogStatus = logMapper.insertLog(logDto);
System.out.println(insertLogStatus);
return userInfoMapper.insertUserInfo(userInfoDto);
}
- 프론트엔드에서 Request로 보낸 데이터들을 VO를 이용하여 받아올 값들을 추가해줍니다.
<UserInfoVo.java>
@Data
public class UserInfoVo {
// userInfoVo에 담을 변수
Long uno;
String userName;
Long userAge;
String userSex;
String userPhone;
String userNumber;
String userCardPassword;
// 로그에 담을 변수 (uno는 이미 있으니 생략)
Long lno;
Long pageNo;
String pageEventTitle;
String pageEventView;
String crtTime;
}
- 계좌 등록을 위해 프론트엔드에서 데이터를 보낸 값 중에 일부 값을 AccountDto 에서 insert 할 용도로 가공해줍니다.
<AccountDto.java>
@Data
@Builder // Builder : Reqeust 값 중 일부분을 Dto에 생성을 위해 작업 진행
public class AccountDto {
Long ano;
Long uno;
Long userMoney;
// 이 부분은 사용자 생성시 잔고 초기화 (200,000원으로 default로 초기화 해줌)
public static AccountDto fromInitInsert(Long uno, long userMoney) {
if (uno == null)
return null;
return AccountDto.builder()
.uno(uno)
.userMoney(userMoney)
.build();
}
}
- Front End 에서 보낸 데이터 중에 T_User에 넣을 데이터를 가공해 줍니다.
<UserInfoDto.java>
@Data
@Builder
public class UserInfoDto {
Long uno;
String userName;
Long userAge;
String userSex;
String userPhone;
String userNumber;
String userCardPassword;
// 이 부분은 Vo에서 받아온 메소드를 dto에 넣기 위해 실행
public static UserInfoDto from(UserInfoVo userInfoVo) {
if (userInfoVo == null)
return null;
return UserInfoDto.builder()
.uno(userInfoVo.getUno())
.userName(userInfoVo.getUserName())
.userAge(userInfoVo.getUserAge())
.userSex(userInfoVo.getUserSex())
.userPhone(userInfoVo.getUserPhone())
.userNumber(userInfoVo.getUserNumber())
.userCardPassword(userInfoVo.getUserCardPassword())
.build();
}
}
- 로그 데이터를 삽입할 Dto를 가공해 줍니다. (사용자가 진행한 로그 데이터 삽입)
- 이 경우, 음식 구매 및 계좌 입출금 한 것을 마저 이어서 사용합니다.
<LogDto.java>
@Data
@Builder
public class LogDto {
Long lno;
Long uno;
Long pageNo;
String pageEventTitle;
String pageEventView;
String crtTime;
// 이 부분은 UserInfo Vo에서 받아온 메소드를 dto에 넣기 위해 실행
public static LogDto fromUserInfo(UserInfoVo userInfoVo) {
if (userInfoVo == null)
return null;
return LogDto.builder()
.lno(userInfoVo.getLno())
.uno(userInfoVo.getUno())
.pageNo(userInfoVo.getPageNo())
.pageEventTitle(userInfoVo.getPageEventTitle())
.pageEventView(userInfoVo.getPageEventView())
.crtTime(userInfoVo.getCrtTime())
.build();
}
}
(3) 회원 정보, 로그, 계좌 정보 (전체) => 이 프로젝트에서는 연습용 프로젝트, 1명의 회원만 존재하여 진행
<UserInfoController.java>
@PostMapping("/api/user/delete/user/info")
public int deleteUserInfo() {
int deleteUserInfoStatus = userInfoService.deleteUserInfo();
System.out.println(deleteUserInfoStatus);
int deleteAccountStatus = accountService.deleteAccount();
System.out.println(deleteAccountStatus);
int deleteLogStatus = logService.deleteLog();
System.out.println(deleteLogStatus);
return 1;
}
<UserInfoService.java>
public int deleteUserInfo() {
return userInfoMapper.deleteUserInfo();
}
<LogService.java>
public int deleteLog() {
return logMapper.deleteLog();
}
<AccountService.java>
public int deleteAccount() {
return accountMapper.deleteAccount();
}
(4) 로그 조회 => (이 프로젝트에서는 1명의 회원만 조회)
<LogController.java>
@GetMapping("/api/log//")
public List<LogDto> selectLog() {
return logService.selectLog();
}
<LogService.java>
public List<LogDto> selectLog() {
return logMapper.selectLog();
}
마치며, 이번 시간에는 로그와 회원 정보의 관련되어 인터페이스를 개발해 보았습니다.
개인적으로는 VO는 프론트엔드 서버에 받을 데이터와 보낼 데이터로 사용 용도로 쓰고 있으며,
DTO 는 데이터 필드 연결하는 용도로 사용하고 있습니다.
DAO 같은 경우는 JDBC 연결을 할 때 쓰이는 것 중 하나이며, My-Batis를 활용하여 하고 있기 때문에 DAO를 활용 하지 않습니다.
이것은 프로젝트나 사람의 따라 쓰는 용도가 다를 수 있으며 개인적으로 프로젝트 구성할 때 주로 쓰이는 원칙 중 하나로 보시면 될 것 같습니다.
다음 시간에는 음식 메뉴 및 계좌 입출금 정보를 만들어 보겠습니다.