[10] 음식점 포스 프로그램 - 백엔드 인터페이스 개발(4) - 인터페이스 개발(2), 고객 정보 와 로그 부분(1) Service와 Controller

2023. 10. 29. 01:03Github 프로젝트/음식점 포스 프로그램

728x90
반응형
SMALL

지난 시간에는 인터페이스 개발 전, 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를 활용 하지 않습니다.

 

이것은 프로젝트나 사람의 따라 쓰는 용도가 다를 수 있으며 개인적으로 프로젝트 구성할 때 주로 쓰이는 원칙 중 하나로 보시면 될 것 같습니다.

 

다음 시간에는 음식 메뉴 및 계좌 입출금 정보를 만들어 보겠습니다.

 

 

 

 

 

 

728x90
반응형
LIST