[11] 음식점 포스 프로그램 - 백엔드 인터페이스 개발(5) - 인터페이스 개발(3), 음식 정보, 계좌 정보 와 로그 부분(2) Service와 Controller
지난 시간에는 고객정보와 로그 API를 구성 하였습니다.
이번 시간에는 음식 정보 및 계좌 정보를 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/account/{uno}
- Method : GET
- Request : uno
- Response : ano, uno, userMoney
- 계좌 입출금 서비스
- URI : /api/account/change
- Method : POST
- Request : ano, uno, userMoney
- Response : 없음
<음식 메뉴 관련 >
- 음식 메뉴 전체 조회
- URI :/api/food/
- Method : GET
- Request : null
- Response : 리스트 [fno, foodMenu, foodPrice, vat]
- 음식 주문시 계좌 출금
- URI :/api/food/purchase
- Method : POST
- Request : uno, fno, pageNo, pageEventTitle, pageEventView, crtTime
- Response : 없음
2. 음식 메뉴, 계좌 정보 API 개발
(1) 사용자 계좌 조회 => (이 프로젝트에서는 1명의 회원만 조회)
<AccountController.java>
@GetMapping("/api/account/{uno}")
public AccountDto selectAccount(
@PathVariable String uno) {
return accountService.selectAccount(Long.parseLong(uno));
}
<UserInfoService.java>
public AccountDto selectAccount(Long uno) {
return accountMapper.selectAccount(uno);
}
(2) 계좌 입출금 서비스
<AccountController.java>
@PostMapping("/api/account/change")
public int InOutAccount(
@RequestBody AccountVo accountVo) {
return accountService.changeInOutMoneyAccount(accountVo);
}
<AccountService.java>
public int changeInOutMoneyAccount(AccountVo accountVo) {
AccountDto accountDto = AccountDto.from(accountVo);
int insertAccountStatus = accountMapper.changeInOutMoney(accountDto);
System.out.println(insertAccountStatus);
LogDto logDto = LogDto.fromAccountInOutMoney(accountVo);
int insertLogStatus = logMapper.insertLog(logDto);
System.out.println(insertLogStatus);
return 1;
}
- 프론트엔드에서 Request로 보낸 데이터들을 VO를 이용하여 받아올 값들을 추가해줍니다.
<AccountVo.java>
@Data
public class AccountVo {
// 음식 구매시의 대한 정보
Long uno;
Long userMoney;
// 로그에 담을 변수 (uno는 이미 있으니 생략)
Long lno;
Long pageNo;
String pageEventTitle;
String pageEventView;
String crtTime;
}
- 계좌 입출금을 위해 프론트엔드에서 데이터를 보낸 값 중에 일부 값을 AccountDto 를 사용할 용도로 가공해줍니다.
<AccountDto.java>
@Data
@Builder // Builder : Reqeust 값 중 일부분을 Dto에 생성을 위해 작업 진행
public class AccountDto {
...
// 이 부분은 Vo에서 받아온 메소드를 dto에 넣기 위해 실행
public static AccountDto from(AccountVo accountVo) {
if (accountVo == null)
return null;
return AccountDto.builder()
.uno(accountVo.getUno())
.userMoney(accountVo.getUserMoney())
.build();
}
}
- 로그 데이터를 삽입할 Dto를 가공해 줍니다. (사용자가 진행한 로그 데이터 삽입)
- 이 경우, 계좌 입출금 한 내용을 로그 테이블에 저장 할 것을 빌드 해줌
<LogDto.java>
@Data
@Builder
public class LogDto {
...
// 이 부분은 AccountInOutMoney Vo에서 받아온 메소드를 dto에 넣기 위해 실행
public static LogDto fromAccountInOutMoney(AccountVo accountInOutMoneyVo) {
if (accountInOutMoneyVo == null)
return null;
return LogDto.builder()
.lno(accountInOutMoneyVo.getLno())
.uno(accountInOutMoneyVo.getUno())
.pageNo(accountInOutMoneyVo.getPageNo())
.pageEventTitle(accountInOutMoneyVo.getPageEventTitle())
.pageEventView(accountInOutMoneyVo.getPageEventView())
.crtTime(accountInOutMoneyVo.getCrtTime())
.build();
}
}
(3) 음식 메뉴 전체 조회
<FoodController.java>
@GetMapping("/api/food/")
public List<FoodDto> selectFood() {
return foodService.selectFood();
}
<FoodService.java>
public List<FoodDto> selectFood() {
return foodMapper.selectFood();
}
(4) 음식 주문시 계좌 출금
<FoodController.java>
@PostMapping("/purchase")
public int purchaseFoodAccount(
@RequestBody PurchaseFoodOutMoneyVo purchaseFoodOutMoneyVo) {
return foodService.PurchaseMoneyAccount(purchaseFoodOutMoneyVo);
}
<FoodService.java>
public int PurchaseMoneyAccount(PurchaseFoodOutMoneyVo purchaseFoodOutMoneyVo) {
System.out.println(purchaseFoodOutMoneyVo);
FoodPurchaseMoneyDto accountPurchaseMoneyDto = FoodPurchaseMoneyDto.from(purchaseFoodOutMoneyVo);
int insertAccountStatus = accountMapper.purchaseOutMoney(accountPurchaseMoneyDto);
System.out.println(insertAccountStatus);
LogDto logDto = LogDto.fromPurchaseFoodOutMoneyVo(purchaseFoodOutMoneyVo);
int insertLogStatus = logMapper.insertLog(logDto);
System.out.println(insertLogStatus);
return 1;
}
- 프론트엔드에서 Request로 보낸 데이터들을 VO를 이용하여 받아올 값들을 추가해줍니다.
<PurchaseFoodOutMoneyVo.java>
@Data
public class PurchaseFoodOutMoneyVo {
// 음식 구매시의 대한 정보
Long uno;
Long fno;
// 로그에 담을 변수 (uno는 이미 있으니 생략)
Long lno;
Long pageNo;
String pageEventTitle;
String pageEventView;
String crtTime;
}
- 여기서 FoodMapper.xml에서 질의어를 사용할 파라미터를 넣어줍니다.
<FoodPurchaseMoneyDto.java>
@Data
@Builder
public class FoodPurchaseMoneyDto {
Long uno;
Long fno;
// 이 부분은 Vo에서 받아온 메소드를 dto에 넣기 위해 실행
public static FoodPurchaseMoneyDto from(PurchaseFoodOutMoneyVo purchaseFoodOutMoneyVo) {
if (purchaseFoodOutMoneyVo == null)
return null;
return FoodPurchaseMoneyDto.builder()
.uno(purchaseFoodOutMoneyVo.getUno())
.fno(purchaseFoodOutMoneyVo.getFno())
.build();
}
}
- 로그 데이터를 삽입할 Dto를 가공해 줍니다. (사용자가 진행한 로그 데이터 삽입)
- 이 경우, 음식 구매의 대한 로그 테이블에 저장할 dto를 만들어 빌드해줍니.
<LogDto.java>
@Data
@Builder
public class LogDto {
...
// 이 부분은 AccountPurchaseMoney Vo에서 받아온 메소드를 dto에 넣기 위해 실행
public static LogDto fromPurchaseFoodOutMoneyVo(PurchaseFoodOutMoneyVo purchaseFoodOutMoneyVo) {
if (purchaseFoodOutMoneyVo == null)
return null;
return LogDto.builder()
.lno(purchaseFoodOutMoneyVo.getLno())
.uno(purchaseFoodOutMoneyVo.getUno())
.pageNo(purchaseFoodOutMoneyVo.getPageNo())
.pageEventTitle(purchaseFoodOutMoneyVo.getPageEventTitle())
.pageEventView(purchaseFoodOutMoneyVo.getPageEventView())
.crtTime(purchaseFoodOutMoneyVo.getCrtTime())
.build();
}
}
마치며, 이번 시간에는 음식메뉴, 계좌정보의 관련되어 인터페이스를 개발해 보았습니다.
추가적으로 로그 Table에 저장할 DTO를 넣어서 작업해봤습니다.
개인적으로는 VO는 프론트엔드 서버에 받을 데이터와 보낼 데이터로 사용 용도로 쓰고 있으며,
DTO 는 데이터 필드 연결하는 용도로 사용하고 있습니다.
DAO 같은 경우는 JDBC 연결을 할 때 쓰이는 것 중 하나이며, My-Batis를 활용하여 하고 있기 때문에 DAO를 활용 하지 않습니다.
이것은 프로젝트나 사람의 따라 쓰는 용도가 다를 수 있으며 개인적으로 프로젝트 구성할 때 주로 쓰이는 원칙 중 하나로 보시면 될 것 같습니다.
다음 시간에는 API를 만든 내용으로 프론트 엔드에 적용해보겠습니다.