WMS 프로젝트1

파란상자·2024년 10월 17일
0

신세계아이앤씨 JAVA 기반 백엔드 개발자 과정 1차 프로젝트

🖥️프로젝트 개요

신세계아이앤씨 JAVA 기반 백엔드 개발자 과정 1차 프로젝트로 배웠던 기술로 WMS를 구현 하는 것이 목표입니다. WMS(Warehouse Management System)란 창고 내 재고를 효율적으로 관리하고, 입고부터 배송까지 신뢰성 있는 물류 운영을 지원하는 시스템으로 물류업계에선 없어선 안될 시스템입니다. 저희는 이 프로젝트를 구현하면서 물류의 흐름을 파악하고 기술스택을 견고히 하는 것을 목표로 합니다.

깃허브

https://github.com/HongYong-Woo/WMS_MiniProject

📅프로젝트 일정

👩‍🔧개발 팀🧑‍🔧

BR31 (BaskinRobbins31)

@cookiemiro @HongYong-Woo @PARK-TH @disneydreamworker
팀장
  • 재고 관리
  • 고객 센터
팀원
  • 로그인/회원 관리
  • 출고 관리
팀원
  • 입고 관리
  • 거래처 관리
팀원
  • 입고 관리
  • 상품

🔧개발 환경

Java 17

  • IDE: IntelliJ IDEA Ultimate
  • Database: MySQL(8.0)
  • Tools: GitHub, Notion, Slack

📂프로젝트 구조

⚙️주요 기능

  • 로그인/회원 관리
  • 창고 관리
  • 입고 관리
  • 출고 관리
  • 재고 관리
  • 고객 센터

🔎컨벤션

Git Branch Naming Convention

브랜치 명명 규칙은 아래와 같이 설정합니다:
feature/설명: 새로운 기능 개발 시
예시: feature/login-page
bugfix/설명: 버그 수정 시
예시: bugfix/fix-login-error
test/설명: 테스트 관련 작업 시
예시: test/add-unit-tests

Git Commit Message Convention

커밋 메시지는 아래와 같은 형식을 따릅니다:
🐛 bug: 버그 수정
✨ sparkles: 새로운 기능 도입
🔥 fire: 코드나 파일 삭제
📝 memo: 문서 추가 또는 업데이트
🎨 art: 코드의 구조/형식 개선
🚧 construction: 작업 진행 중
🎉 tada: 프로젝트 시작
✅ white_check_mark: 테스트 추가, 업데이트 또는 통과
🔧 wrench: 설정 파일 추가 또는 업데이트
📦️ package: 컴파일된 파일이나 패키지 추가 또는 업데이트
♻️ recycle: 코드 리팩토링

Pull Request(Pull Request) Convention

Title: [타입] 간략한 설명
예시: [feat] 로그인 페이지 구현
Description:
작업 내용 요약
관련된 이슈 링크
테스트 방법 및 스크린샷(가능한 경우)

Code Review Guidelines

코드 리뷰는 모든 Pull Request에 대해 최소 1명이 수행해야 합니다.
모든 논의는 GitHub의 Pull Request 코멘트를 통해 이루어져야 합니다.
리뷰어는 코드의 가독성, 성능, 보안 문제 등을 검토합니다.
main 브랜치에 merge는 팀장이 진행하거나 팀장의 동의 하에 팀원이 진행합니다.

모든 작업은 사전에 정의된 컨벤션에 따라 진행합니다.
예외 사항이 발생할 경우, 팀 내부에서 논의 후 결정합니다.

코딩 스타일 가이드

코딩 스타일 가이드 참고 링크
https://google.github.io/styleguide/javaguide.html#s5.1-identifier-names
https://www.oracle.com/technetwork/java/codeconventions-150003.pdf


내가 맡은 파트

  • 로그인/회원관리, 출고관리

🔑로그인 / 회원 관리

  • 로그인은 해당 시스템을 이용하기 위해 사용자가 등록되어 있는지 인증하기 위한 절차이다.
  • 회원 관리는 등록되어 있는 사용자들을 관리한다.

1. 기획

  1. 설명
  • 로그인은 DataBase에 저장 되어 있는 id와 비밀번호를 조회하여 일치하면 로그인 성공, 일치 하지 않으면 로그인 실패로 이어진다.
  • 아이디 찾기는 전화번호, Email, 사업자번호로 조회하여 있으면 id를 출력해준다.
  • 비밀번호 찾기는 id로 조회하여 비밀번호를 출력해준다. 원래는 단순히 id로만 조회하는 것이 아닌 핸드폰 인증번호 같은 여러 인증 절차를 거쳐야 하지만 Java로만 구현하기 때문에 여러 인증절차는 제외한다.
  • 회원 가입상태와 회원 권한은 ENUM으로 관리한다.
  • 권한별로 기능이 다르며 보여지는 것도 다르다. (예> 일반회원은 상세보기와 수정만 보여짐)
  1. 기능
    a. 로그인
    b. 아이디 찾기
    c. 비밀번호 찾기
    d. 회원가입승인
    e. 회원조회
    f. 관리자 조회
    g. 사업자 번호 조회
    h. 회원 상세보기
    i. 회원 수정
    j. 회원 삭제
    k. 회원 권한 수정
    g. 회원 가입

2. 설계

  1. 유스케이스 다이어그램
    https://drive.google.com/file/d/1HqgtNMDZrbNUNMMBrXxyIndZB2EG7nmT/view?usp=sharing

  2. 플로우 차트
    https://drive.google.com/file/d/1rGDOgvS9yFpdQrfZAbNvn8pL6UkSb-z8/view?usp=sharing

  3. ERD

  4. 클래스 다이어그램
    https://drive.google.com/file/d/1GQt5a0g0_OHIyAZgpBRSFtzZqXF3Xx54/view?usp=sharing

3. 구현

시연 영상

https://youtu.be/1gLnE4cRUeg

🚚출고 관리

  • 출고란 주문이 들어오면 창고나 저장 시설에서 물품이 나가는 것을 말합니다.

1. 기획

  1. 설명
  • 출고 관리는 물품을 조회하여 출고부터 배차, 운송장까지 담당한다.
  • 출고 지시서는 출고요청을 했으나 아직 미승인인 것, 출고 리스트의 차이는 출고요청승인이 승인 된 것이다.
  • 배차는 출고 요청이 승인된 출고 리스트만 가능하며 운송장은 배차 등록이 된 출고건만 가능하다.
  1. 기능
    a. 출고 요청 승인
    b. 출고 요청
    c. 출고 지시서 조회
    d. 출고 상품 조회
    e. 출고 리스트 조회
    f. 배차 등록
    g. 배차 조회
    h. 배차 수정
    i. 배차 취소
    j. 배차 검색
    k. 운송장텍스트 등록
    l. 운송장 조회
    m. 운송장 수정

2. 설계

  1. 유스케이스 다이어그램
    https://drive.google.com/file/d/1VEKzX78uLWzKSU6PLziI66RuH6n6zO3h/view?usp=sharing

  2. 플로우 차트
    https://drive.google.com/file/d/1KlDGXn8V_PHX5BG52qtL61_buYZJtu11/view?usp=sharing

  3. ERD

  4. 클래스 다이어그램
    https://drive.google.com/file/d/1sNGTIzZO8Woc_tMylrbZBjJbFJ8qapTh/view?usp=sharing


    💾마무리

    느낀점

  • 이번 프로젝트는 처음 접한 팀 프로젝트로 많이 아쉬웠던 점은 시간분배를 제대로 못했다는 것이다.
    기획 및 설계 쪽에 시간을 너무 소비해서 구현하는 시간이 짧아져서 촉박하게 구현을 한 것 같다.
    다음에는 설계쪽에 시간 투자를 줄이고 구현에 시간을 더 투자할 필요가 있는 것 같다.
  • Lombok을 사용한 이후로 DTO 구현이 매우 편해 졌다. 특히 @Getter@Setter, @Builder의 사용으로 인해 따로 코드를 짤 필요 없이 선언 만으로도 getter, setter, 생성자 메서드를 쓸 수가 있으니 코드 분량과 구현 시간을 줄 일 수 있었다.
  • 패키지 구조는 MVC 형태로 만들었으나 처음 접하다 보니 각 역할들에 맞춰 구현하는 것이 애매해진 경우가 있었다. Controller는 View가 없다보니 View의 기능을 가지게 되었다.
  • Service와 DAO도 DAO에 Service에서 대부분의 로직을 연산을 하고 DAO에 query문만 넘겨주고 DataBase와 송수신을 할지 아니면 DAO에 값을 받아와 연산을 할지 많은 고민을 했다.
  • error의 경우 BufferedReader 사용에서 문제가 있었는데 객체마다 BufferedReader를 생성하고 사용후 close()를 한 다음 다른 객체에서 BufferedReader를 사용하려고 하면 Stream closed라는 error가 발생하였다. 이 error를 고치려고 try-with-resources 형식으로 해봤지만 역시 같은 error가 발생하였다.
    이것 저것 해보던중 close()를 안했을 때와 main에 static으로 선언하여 사용하면 error가 발생하지 않는 것을 발견했는데 이때 BufferedReader를 여기저기서 생성해서 사용해도 BufferedReader안에 어떤것이 리터럴 풀처럼 공용으로 사용하고 있을 것 같은 생각이 들었다.
    해서 BufferedReader를 main에 static으로 생성하고 프로그램이 종료 될때 close()를 하면 될 것 같았다.
    이후 다른 팀원이 벨로그 주소를 알려줘서 해결이 되었는데 역시나 생각 했던 것처럼 어디선가 close()를 하면 BufferedReader안에 InputStream가 닫혀서 null이 되어버리는데 이 InputStream은 모든 입력을 받는, 공용으로 사용 되는 것이였다.!
    벨로그에서 말한 해결 방안은 두가지였는데 첫번쨰는 close()를 안하는 것이고
    또 하나는 내가 생각했던 static으로 선언하여 사용하는 것이였다.
profile
프로그래머 생산중....

0개의 댓글