국비 수업을 들은지 이제 1달차이다. 그 동안 3번의 프로젝트를 끝냈다. 이번 프로젝트의 주제는 MVC 패턴으로 쇼핑몰 프로그램을 구현하는 것이다.
MVC 패턴에 대해서, 그리고 이 패턴을 사용함으로써 장점이 뭐가있는지 간단히 말하면 이렇다.
MVC 패턴은 소프트웨어 디자인 패턴 중 하나로, 소프트웨어를 세 가지 주요 구성 요소로 나누어 관리하는 방법이다.
- Model (모델):
- 모델은 애플리케이션의 데이터와 비즈니스 로직을 나타낸다.
- 데이터를 저장하고, 데이터의 조작 및 처리를 담당한다.
- 일반적으로 데이터베이스, 파일 시스템 등과 상호작용하여 데이터를 관리한다.
- View (뷰):
- 뷰는 사용자에게 데이터를 시각적으로 표현해주는 역할을 한다.
- 사용자 인터페이스의 일부로, 데이터의 형식을 결정하고 사용자에게 정보를 제공한다.
- HTML, XML, JSON 등의 형태로 데이터를 사용자에게 보여준다.
- Controller (컨트롤러):
- 컨트롤러는 모델과 뷰 사이의 중재자 역할을 한다.
- 사용자의 입력을 받아 모델을 업데이트하고, 그에 따라 적절한 뷰를 선택하여 보여준다.
- 사용자와의 상호작용을 처리하며, 애플리케이션의 흐름을 제어한다.
장점과 이점:
- 분리된 역할: 각 구성 요소가 엄격하게 분리되어 있어 유지보수가 용이하고 코드 재사용성이 높다.
- 유연성: 모델, 뷰, 컨트롤러 각각을 독립적으로 변경할 수 있어 애플리케이션의 부분적인 수정이 용이하다.
- 테스트 용이성: 각 구성 요소를 독립적으로 테스트할 수 있어 테스트 코드 작성이 용이하다.
- 복잡성 감소: 코드의 복잡성을 줄여 관리와 개발이 간편해진다.
MVC 패턴은 대규모 웹 애플리케이션에서 널리 사용되며, 애플리케이션의 구조화와 유지보수성을 향상시키는 데 중요한 역할을 한다.
이 프로젝트의 요구사항은 아래와 같았다.
1. 쇼핑몰 프로그램을 MVC 패턴으로 구현해주세요!
2. 회원 속성 : 아이디(PK),비밀번호
3. 상품 속성 : 품번(PK),품명,가격,재고
4. 로그인한 회원만 장바구니를 사용할수있습니다.
5. 회원이 로그아웃을 하면 장바구니는 사라집니다.
6. 요구기능 목록
회원가입
로그인
로그아웃
상품 목록 출력:재고가 없는 상품에 대해서 [품절] 표시하기
장바구니에 상품담기
장바구니에 담긴 상품 목록 출력
장바구니에 담긴 상품 목록 구매
장바구니에서 상품 빼기
아래는 우리 조가 짠 쇼핑몰 프로젝트 코드이다.
M - MemberDTO
package model;
public class MemberDTO {
private String mid; // 회원 아이디
private String password; // 회원 비밀번호
private String condition; // 식별자
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "MemberDTO [mid=" + mid + ", password=" + password + "]";
}
}
M - MemberDAO
package model;
import java.util.ArrayList;
public class MemberDAO {
private ArrayList<MemberDTO> datas;
public MemberDAO() {
this.datas = new ArrayList<MemberDTO>();
}
public boolean insert(MemberDTO memberDTO) {
// ▼ 회원가입
System.out.println(" model.MemberDAO insert() 시작");
MemberDTO data = new MemberDTO();
data.setMid(memberDTO.getMid());
data.setPassword(memberDTO.getPassword());
datas.add(data);
System.out.println(" model.MemberDAO insert() 종료");
return true;
}
private boolean update(MemberDTO memberDTO) {
return false;
}
private boolean delete(MemberDTO memberDTO) {
return false;
}
private ArrayList<MemberDTO> selectAll(MemberDTO memberDTO){
ArrayList<MemberDTO> datas = new ArrayList<MemberDTO>();
return datas;
}
public MemberDTO selectOne(MemberDTO memberDTO) {
System.out.println(" model.MemberDAO selectOne() 시작");
// ▼ 아이디 중복검사
if(memberDTO.getCondition().equals("IS_UNIQUE")) {
for(MemberDTO data:this.datas) {
if(data.getMid().equals(memberDTO.getMid())) {
System.out.println(" model.MemberDAO selectOne()-IS_UNIQUE 종료 : 성공");
return data;
}
}
}
// ▼ 로그인
else if(memberDTO.getCondition().equals("LOGIN")) {
for(MemberDTO data:this.datas) {
if(data.getMid().equals(memberDTO.getMid())
&& data.getPassword().equals(memberDTO.getPassword())) {
System.out.println(" model.MemberDAO selectOne()-LOGIN 종료 : 성공");
return data;
}
}
}
System.out.println(" model.MemberDAO selectOne() 종료");
return null;
}
}
M - ProductDTO
package model;
public class ProductDTO {
private int productId; // 상품 번호
private int productPrice; // 상품 가격
private int productInventory; // 상품 재고
private String productName; // 상품 이름
private String condition; // 개발자에게 필요한 데이터
public String getcondition() {
return condition;
}
public int getProductId() {
return productId;
}
public void setProductId(int productId) {
this.productId = productId;
}
public int getProductPrice() {
return productPrice;
}
public void setProductPrice(int productPrice) {
this.productPrice = productPrice;
}
public int getProductInventory() {
return productInventory;
}
public void setProductInventory(int productInventory) {
this.productInventory = productInventory;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
@Override
public String toString() {
return "ProductDTO [productId=" + productId + ", productPrice=" + productPrice + ", productInventory="
+ productInventory + ", productName=" + productName + ", condition=" + condition + "]";
}
}
M - ProductDAO
package model;
import java.util.ArrayList;
public class ProductDAO {
private ArrayList<ProductDTO> datas; // 상품 데이터를 저장할 리스트
public ProductDAO() {
this.datas = new ArrayList<ProductDTO>(); // 맴버변수 초기화
// ▼ 샘플 데이터
ProductDTO data1 = new ProductDTO();
data1.setProductId(1001); // 상품번호
data1.setProductName(" 수박 "); // 상품이름
data1.setProductPrice(13990); // 상품가격
data1.setProductInventory(4); // 상품재고
this.datas.add(data1); // 리스트에 data1 추가
ProductDTO data2 = new ProductDTO();
data2.setProductId(1002); // 상품번호
data2.setProductName(" 딸기(300g) "); // 상품이름
data2.setProductPrice(14900); // 상품가격
data2.setProductInventory(0); // 상품재고
this.datas.add(data2); // 리스트에 data2 추가
ProductDTO data3 = new ProductDTO();
data3.setProductId(1003); // 상품번호
data3.setProductName(" 바나나(1kg) "); // 상품이름
data3.setProductPrice(4150); // 상품가격
data3.setProductInventory(5); // 상품재고
this.datas.add(data3); // 리스트에 data3 추가
ProductDTO data4 = new ProductDTO();
data4.setProductId(1004); // 상품번호
data4.setProductName(" 참외(1.5kg) "); // 상품이름
data4.setProductPrice(8990); // 상품가격
data4.setProductInventory(2); // 상품재고
this.datas.add(data4); // 리스트에 data4 추가
ProductDTO data5 = new ProductDTO();
data5.setProductId(1005); // 상품번호
data5.setProductName("블루베리(200g)"); // 상품이름
data5.setProductPrice(5660); // 상품가격
data5.setProductInventory(1); // 상품재고
this.datas.add(data5); // 리스트에 data5 추가
}
public ArrayList<ProductDTO> selectAll(ProductDTO productDTO) {
ArrayList<ProductDTO> datas = new ArrayList<ProductDTO>(); // 반환할 리스트 초기화
// ▼ 1. 상품 전체 출력
if(productDTO.getcondition().equals("ALL")) { // 컨디션값 == "ALL"이면
for(ProductDTO data: this.datas) { // 새로운 리스트에 this.상품리스트를 다시 담아서 반환
datas.add(data); // 리스트에 데이터 추가
}
}
// ▼ 2. 장바구니에서 상품목록 출력 (품절상품 제외)
else if(productDTO.getcondition().equals("INSTOCK_PRODUCTS")) { // 컨디션값 == "INSTOCK_PRODUCTS"이면
for(ProductDTO data: this.datas) { // 재고체크후 품절상품을 제외한 상품리스트를 보내줌
if(data.getProductInventory() > 0) { // 재고가 0보다 클 경우에
datas.add(data); // 상품 리스트에 담음 (품절상품 제외)
}
}
}
return datas;
}
// ▼ 3. 장바구니에 상품담기
public ProductDTO selectOne(ProductDTO productDTO) {
// ▼ 전달받은 상품PK로 상품을 선택
for(ProductDTO data:this.datas) {
if(data.getProductId() == (productDTO.getProductId())) {
// ▲ 컨트롤러에서 받는 PK값과 상품 PK값을 비교한다.
return data;
}
}
return null; // 상품이 존재하지 않을 경우 null값을 반환함
}
// ▼ 4. 장바구니에 담긴 상품 목록 구매
public boolean update(ProductDTO productDTO) {
for(ProductDTO data:this.datas) {
if(data.getProductId() == (productDTO.getProductId())) { // 리스트의 상품번호와 DB의 상품번호가 같으면
if(data.getProductInventory() >= productDTO.getProductInventory()) {
// ▲ DB의 상품재고가 장바구니의 상품재고보다 크거나 같다면 (재고가 0 미만으로 내려가지 않을경우)
data.setProductInventory(data.getProductInventory() - productDTO.getProductInventory());
// ▲ DB의 상품재고에서 장바구니의 상품재고를 뺌
return true; // 제대로 업데이터 되면 true 반환
}
else { // 만약 재고가 0미만으로 내려갈 경우
return false; // false 반환
}
}
}
return false; // 상품을 찾지 못하면 false 반환
}
}
V - MainView
package view;
import java.util.ArrayList;
import java.util.Scanner;
import model.MemberDTO;
import model.ProductDTO;
abstract class View {
public static Scanner sc=new Scanner(System.in);
}
public class MainView extends View{
public void printMainMenuList() { // 메인 메뉴 출력
System.out.println("=== 메인 메뉴 ===");
System.out.println(" 0. 프로그램 종료");
System.out.println(" 1. 전체 상품 목록");
}
public int insertMainMenu(MemberDTO user) { //메인 메뉴 입력 받기
int insertMainMenu;
while(true) {
System.out.print(" 번호 입력 >> ");
insertMainMenu= sc.nextInt();
if(user!=null) {//로그인 상태라면
if(!(2<=insertMainMenu&&insertMainMenu<=3)&&(0<=insertMainMenu&&insertMainMenu<=5)) {
//입력값이 2번,3번을 선택타지 않았고,
//0~5 사이의 숫자를 선택받았을때
break;
}
}
else {//로그인 상태가 아니라면
if(0<=insertMainMenu&&insertMainMenu<=3) {
//0~3사이를 입력받기
break;
}
}//위에가 다 아니라면
System.out.println("다시 입력해주세요!");
}
return insertMainMenu;
}
public void end() { // 프로그램 종료
System.out.println("프로그램을 종료합니다.");
}
public void printFalse() { // 실패...
System.out.println("실패 하셨습니다...띵띵 딩딩딩..");
}
public void printProductList(ArrayList<ProductDTO> datas) { // 상품목록 전체 보여주기
String productInventory="품절";
if(datas.size() <= 0) { // 상품이 없을 시 유효성 검사
System.out.println("상품이 준비되지 않았습니다.");
return;
}
System.out.println("=== 상품 목록 ===");
System.out.println("번호 | 상품 이름 | 가격 | 재고");
for(ProductDTO data: datas) { // 전체 목록 출력
if(data.getProductInventory()<= 0) {
//데이터 안에 들어있는 상품 재고가 0 이하라면 재고 > productInventory(품절)
System.out.println(data.getProductId()+" | "+ data.getProductName()+ " | "+ data.getProductPrice()+ " | "+productInventory);
// 출력
}
else {//아니라면
System.out.println(data.getProductId()+" | "+ data.getProductName()+ " | "+ data.getProductPrice()+ " | "+ data.getProductInventory());
// 출력
}
}
}
}
V - LoginView
package view;
import java.util.ArrayList;
import model.ProductDTO;
public class LoginView extends View {
public void printLoginMenuList() { // 로그인 메뉴
System.out.println(" 4. 장바구니 ");
System.out.println(" 5. 로그아웃 ");
}
public void printCartEmpty() {//장바구니가 비어있을 시
System.out.println(" 현재 장바구니가 비어있습니다.");
}
public void printTrueCart() {//장바구니 담김 성공
System.out.println(" 장바구니에 담았습니다.");
}
public void printFalseNull() { //품절 상품 안내
System.out.println(" 품절된 상품입니다.");
}
public void printCart(ArrayList<ProductDTO> datas) {// 장바구니 출력
if(datas.size() <= 0) { // 상품이 없을 시 유효성 검사
//데이터 길이가 0 이하라면 == 장바구니가 비었다
printCartEmpty(); //장바구니가 비었습니다 출력
return;
}
int sum=0;//전체 가격 변수
System.out.println("=== 상품 목록 ===");
System.out.println("상품 번호 | 상품 이름 | 가격 | 수량");
for(ProductDTO data: datas) { // 전체 목록 출력
//데이터 만큼 반복
System.out.println(data.getProductId()+" | "+data.getProductName()+ " | "+ data.getProductPrice() + " | "+ data.getProductInventory());
//상품번호, 상품 이름, 상품 가격, 수량 출력
sum+=data.getProductPrice()*data.getProductInventory();
//총합 = 가격*수량
}
System.out.println("전체 가격 = "+sum);
}
public boolean isBuyCart(ArrayList<ProductDTO> datas) { //가격안내+구매확인하기
//데이터를 컨트롤러에서 받아온다
int sum = 0; // 총합
for(ProductDTO data: datas) { // 전체 목록 출력
sum += data.getProductPrice()*data.getProductInventory();
//총합= 가격 * 수량
}
System.out.println("전체 가격 = "+sum);
while(true) {// 유효성 검사
System.out.println("구매 하시겠습니까? 1. 예 / 2. 아니요");
int check=sc.nextInt();
if(check == 1) { // 구매한다면
return true;
}
else if(check == 2) { // 구매 안한다면
return false;
}
else { //잘못 입력했다면
System.out.println("다시 입력하세요");
}
}
}
public void printCartMenu() { //장바구니 목록
System.out.println("=== 장바구니 ===");
System.out.println("1. 장바구니 상품 담기");
System.out.println("2. 장바구니 상품 빼기");
System.out.println("3. 장바구니 상품 구매");
}
public int inputICartMenu() { //장바구니 메뉴 입력받기
System.out.print(" 번호 입력 >> ");
int inputICartMenu= sc.nextInt(); //장바구니 메뉴 변수 입력 받기
while(true) {//장바구니 메뉴 유효성검사
if(1<=inputICartMenu||inputICartMenu<=3) {
//메뉴 번호에 맞게 입력했다면
break;
}
System.out.println("다시 입력하세요"); // 아니라면 출력
}
return inputICartMenu;
}
public void printTrueBuy() { // 구매성공
System.out.println("구매하셨습니다.");
}
public void printCancelBuy() { //구매 취소
System.out.println("구매가 취소되었습니다.");
}
public int addToCart(ArrayList<ProductDTO> datas) {//전체 상품 목록에서 장바구니에 상품 담기
//컨드롤러에서 데이터 리스트를 받아온다.
int productId; // 상품 번호 변수
while(true) {
System.out.print("상품 번호 입력 >>");
productId=sc.nextInt();
boolean flag=false; //유효성 검사
for(ProductDTO data:datas) { //배열길이만큼 반복
if(data.getProductId()==productId&&!(data.getProductInventory()<=0)) {
//데이터안에 있는 아이디가 입력받은 아이디랑 같고,
//상품 갯수가 0이하가 아니라면
flag=true;
break;
}
}
if(flag) {
break;
}
// 잘못 입력 했다면
System.out.println("상품번호를 다시 입력해 주세요.");
}
return productId;
}
public void printTrueLogOut() { //로그아웃
System.out.println("로그아웃 합니다.");
}
public void printMinusCart() { //장바구니 빼기
System.out.println("해당 상품을 장바구니에서 제거했습니다.");
}
}
V - logoutView
package view;
import model.MemberDTO;
public class LogoutView extends View{
public void printLogoutMenuList() { // 로그아웃 메뉴
System.out.println(" 2. 로그인 ");
System.out.println(" 3. 회원가입 ");
}
public MemberDTO inputLogin() {//로그인
System.out.print(" 아이디 입력 >> ");
String mid=sc.next(); //min > PK값
System.out.print(" 비밀번호 입력 >> ");
String password=sc.next();
MemberDTO data=new MemberDTO();
data.setMid(mid);
data.setPassword(password);
return data;
}
public void printTrueLogin() { // 로그인 성공
System.out.println("로그인 성공!");
}
public void printFalseLogin() { // 로그인 실패
System.out.println("아이디 / 비밀번호를 다시 확인해주세요.");
}
public void printTrueSign() { // 회원가입 성공
System.out.println("회원가입 성공!");
}
public String inputMid() { //회원가입 아이디
System.out.print(" 아이디 입력 >> ");
String mid=sc.next();
return mid;
}
public String inputPassword() {//회원가입 비밀번호
System.out.print(" 비밀번호 입력 >> ");
String password=sc.next();
return password;
}
public void printFalseSign() {//중복 아이디 입력시 안내
System.out.println("중복된 아이디 입니다. 다시 입력해 주세요!");
}
}
C - controller
package controller;
import java.util.ArrayList;
import model.MemberDAO;
import model.MemberDTO;
import model.ProductDAO;
import model.ProductDTO;
import view.LoginView;
import view.LogoutView;
import view.MainView;
public class Ctrl { //맴버변수
private ProductDAO productDAO;
private MemberDAO memberDAO;
private MainView mainView;
private LoginView loginView;
private LogoutView logoutView;
private MemberDTO user; // 현재 로그인 저장 정보 및 상태 확인
private ArrayList<ProductDTO> cart; // 장바구니
public Ctrl() { //생성자 > 맴버변수 초기화
this.productDAO = new ProductDAO();
this.memberDAO = new MemberDAO();
this.mainView = new MainView();
this.loginView = new LoginView();
this.logoutView = new LogoutView();
this.user = null; // 로그아웃 상태
this.cart = new ArrayList<ProductDTO>();
}
public void start() {
while(true) {
mainView.printMainMenuList(); // 기본 메뉴판 호출
if(this.user == null) { // 로그아웃 상태라면,
logoutView.printLogoutMenuList(); // 로그아웃 메뉴판 호출
}
else { // 로그인 상태라면
loginView.printLoginMenuList(); // 로그인 메뉴판 호출
}
int menu = mainView.insertMainMenu(this.user); // 메인메뉴 입력받기
if(menu==0) { // 0번을 입력하면
mainView.end(); // 종료 안내하기
break; // 반복문 탈출(while)
}
else if(menu==1) { // 1번을 입력하면 , 상품목록보기
ProductDTO productDTO = new ProductDTO();
//새로운 객체 생성
productDTO.setCondition("ALL");
//컨디션 값
ArrayList<ProductDTO> productList = productDAO.selectAll(productDTO);
// 모델에서 물건리스트를 받아와서 저장
mainView.printProductList(productList); // 상품목록 전체 출력
//상품목록에서 장바구니 담기 - 지윤 start
if(this.user != null){ //만약 로그인된 상태라면
//상품번호 입력받기
int num = loginView.addToCart(productList);
//입력받은 상품 장바구니에 추가
boolean flag = false; //상품추가성공실패 확인
int cartIndex = hasCartProduct(num); //장바구니에 상품이 있다면 인덱스번호 반환
if(cartIndex < 0){ //반환된 인덱스번호가 있다면
//장바구니에 상품이 없다면 새 객체 추가
flag = addCart(num);
}
else{
//장바구니에 상품이 있다면 상품 카운트 증가
flag = addCartCount(cartIndex);
}
//장바구니 추가 성공실패
if(flag){
//성공
loginView.printTrueCart();
}
else {
//상품추가 실패
mainView.printFalse();
}
}
//상품목록에서 장바구니 담기 - 지윤 end
}
else if(menu==2) { // 2번을 입력하면 로그인
MemberDTO data = logoutView.inputLogin(); // 로그인 - 아이디,비번 입력
data.setCondition("LOGIN"); //컨디션 값
data = memberDAO.selectOne(data); // 아이디,비번이 일치하는지 DAO에서 확인.
if(data != null) { // 로그인에 성공한 경우
this.user = data; // 로그인 상태로 변환
logoutView.printTrueLogin(); // 로그인 성공 문구 출력
}
else {
logoutView.printFalseLogin(); // 로그인 실패
}
}
else if(menu==3) { // 3번을 입력하면 회원가입
MemberDTO memberDTO; //객체 생성
String mid; // 멤버id
while(true) {
mid = logoutView.inputMid(); // 회원가입 입력(아이디)
memberDTO = new MemberDTO(); //객체 생성
memberDTO.setMid(mid); // 사용할 아이디
memberDTO.setCondition("IS_UNIQUE"); // 컨디션 값
memberDTO = memberDAO.selectOne(memberDTO); //ID값 중복 확인
if(memberDTO == null) { // 아이디 중복되지 않았다면
break;
}
else {
logoutView.printFalseSign(); // 아이디 중복/ 안내
continue; // 중복이므로 다시 위로 올라가서 입력받기
}
}
MemberDTO dto = new MemberDTO(); // 새로 가입할 아이디,비밀번호 저장할 객체 생성
String password = logoutView.inputPassword(); // 회원가입 입력(비밀번호)
dto.setMid(mid); //아이디
dto.setPassword(password); //비밀번호
boolean flag = memberDAO.insert(dto); // 입력한 아이디,비밀번호 저장(회원가입 완료!)
if(flag) {
logoutView.printTrueSign(); // 회원가입 성공 문구 출력
}
else {
mainView.printFalse(); // 실패 문구 출력
}
}
else if(menu==4) {//메뉴에서 4번(장바구니)를 입력받으면
//장바구니 메뉴 - 지윤 start
if(this.user == null){ //로그아웃 상태 //유효성검사
System.out.println(" log : [Cart Menu] wrong approach - state : "+ this.user); //확인 로그
continue; //비정상적인접근차단
}
//장바구니 출력
loginView.printCart(this.cart); //장바구니 출력
//장바구니 하위 메뉴
loginView.printCartMenu(); //장바구니 메뉴 출력
int subMenu = loginView.inputICartMenu(); //장바구니 입력
if(subMenu == 1){//물건담기
//로그인확인
if(this.user == null){ //로그아웃 상태 //유효성검사
System.out.println(" log : [Cart Menu - 1] wrong approach - state : "+ this.user); //확인 로그
continue;
}
//상품출력 입력
ProductDTO pro = new ProductDTO(); //새로운 객체 생성
pro.setCondition("INSTOCK_PRODUCTS"); // 컨디션 값
ArrayList<ProductDTO> productList = productDAO.selectAll(pro);
//재고가 남아있는 물건 리스트 받아와서 저장
mainView.printProductList(productList);//물건 리스트 출력
//상품번호 입력받기
int num = loginView.addToCart(productList);
//입력받은 상품 장바구니에 추가
boolean flag = false; //상품추가성공실패 확인
int cartIndex = hasCartProduct(num); //장바구니에 상품이 있다면 인덱스번호 반환
if(cartIndex < 0){ //반환된 인덱스번호가 있다면
//장바구니에 상품이 없다면 새 객체 추가
flag = addCart(num);
}
else{
//장바구니에 상품이 있다면 상품 카운트 증가
flag = addCartCount(cartIndex);
}
if(!flag){ //상품추가 실패
mainView.printFalse();
continue;
}
//성공
loginView.printTrueCart();
}//1
else if(subMenu == 2){//상품빼기
if(this.user == null){ //로그아웃 상태 //유효성검사
System.out.println(" log : [Cart Menu - 2] wrong approach - state : "+ this.user); //확인 로그
continue; //비정상적인접근차단
}
//장바구니가 비었는지 확인
if(!isCartEmpty()){
continue;
}
//상품 입력받기
int num = loginView.addToCart(this.cart);
for(int i=0; i<this.cart.size(); i++){
//장바구니 길이 만큼 반복
if(this.cart.get(i).getProductId() == num){
//장바구니 ID가 입력받은 값과 일치 한다면
this.cart.get(i).setProductInventory(this.cart.get(i).getProductInventory()-1);
//개수를 -1하기
if(this.cart.get(i).getProductInventory() <= 0){ //개수가 0이하가 된다면
this.cart.remove(i); //장바구니에서 해당상품 삭제
}
loginView.printMinusCart(); //성공 화면
break; //상품을 뺐다면 반복문을 종료함
}
}
}//2
else if(subMenu == 3){
if(this.user == null){ //로그아웃 상태 //유효성검사
System.out.println(" log : [Cart Menu - 3] wrong approach - state : "+ this.user); // 확인 로그
continue;
}
if(!isCartEmpty()){//장바구니가 비었는지 확인 //유효성검사
continue;
}
if(!loginView.isBuyCart(this.cart)){ //만약 사지 않겠다고 한다면,
//실패
loginView.printCancelBuy();
continue;
}
boolean checkUpdate = true; //업데이트체크 초기값
for(ProductDTO product : this.cart){ //장바구니 길이 만큼 반복
//장바구니 상품을 하나씩 구매
if(!productDAO.update(product)){
//만약 구매에 실패한다면
mainView.printFalse();
checkUpdate = false;
break;
}
}
if(!checkUpdate){//구매 실패
loginView.printCancelBuy();
continue;
}
loginView.printTrueBuy();
this.cart.clear();//장바구니 비우기
}//3
else{//비정상적인 접근 //유효성검사
System.out.println(" log : [Cart Menu] wrong approach - subMenu : "+ subMenu); // 확인 로그
mainView.printFalse(); //실패
}
//장바구니 메뉴 - 지윤 end
}
else if(menu==5) { // 5번을 입력하면 로그아웃
this.user = null; // 로그아웃 하기
loginView.printTrueLogOut(); // 로그아웃 성공 출력
}
}
}
//Controller - 지윤 start
private boolean isCartEmpty(){//장바구니가 비어있다면
if(this.cart.isEmpty()){
loginView.printCartEmpty();
return false;
}
return true;
}
private boolean addCart(int productId){ //장바구니에 새로운 상품 추가
//해당하는 id를 가진 상품 정보 불러오기
ProductDTO p = new ProductDTO(); // 객체 생성
p.setProductId(productId); //ID
ProductDTO product = productDAO.selectOne(p); //해당하는 ID를 가진 상품 객체 저장
//받아온 상품의 개수를 1개로 지정
ProductDTO addCart = new ProductDTO(); // 객체 생성
addCart.setProductId(product.getProductId()); //상품 ID
addCart.setProductName(product.getProductName()); //상품명
addCart.setProductPrice(product.getProductPrice()); //상품 가격
addCart.setProductInventory(1); //장바구니에 담긴 갯수
//장바구니에 추가
return this.cart.add(addCart);
}
private boolean addCartCount(int i){ //장바구니에 담긴 상품 갯수 증가
this.cart.get(i).setProductInventory(this.cart.get(i).getProductInventory()+1); //해당 상품 카운트 + 1;
return true;
}
private int hasCartProduct(int productNum){ // 장바구니에 입력 받은 값이 일치하는 상품이 있는지 확인
for(int i=0; i<this.cart.size(); i++){
//장바구니 길이만큼 반복
if(this.cart.get(i).getProductId() == productNum){
//장바구니 안에 있는 ID가 입력받은 값과 같다면
return i; //장바구니의 인덱스번호를 반환
}
}
return -1; //구하지 못했을 경우 null값 반환되지 않아서
// -1로 반환하여 구분
}
//Controller - 지윤 end
}
Client
package client;
import controller.Ctrl;
public class Client {
public static void main(String[] args) {
Ctrl program = new Ctrl();
program.start();
}
}
먼저 프로그램의 코드를 짜기 전에 설계를 굉장히 오래 했다.
나는 MVC 중에 C 부분을 맡게 되었고, M,V와 꾸준히 소통하며 코드를 개선해나갔다.
설계를 오래 꼼꼼히 하다보니 코드짜는 것이 굉장히 수월했다.
강사님께서는 설계에 대한 중요성을 엄청 많이 강조하셨다. 여태 개발을 하면서 설계를 이렇게까지 투자한 적이 없었는데.. 이번 프로젝트를 통해 왜 설계가 중요한지 전에 했던 프로젝트보다 더 많이 느꼈다. 프로젝트를 하나씩 하면서 점점 코딩 실력보다는 협업 능력이 정말 많이 느는 것 같다. 서로 다른 사람들끼리 모여서 하는 것이기 때문에 서로가 이해가 안될 수도 있고, 각 개개인의 코딩 능력도 다르다. 그래도 한 조고 한 팀이기 때문에 같이 끌고가야 의미가 있는 것이다. 한달동안 나에겐 정말 생소한 팀플을 3번이나 해서 정말 길었던 한달이었다.
우리 조는 이번 프로젝트를 진행하면서 모든 상황들을 아래 노션에다가 기록했다.
https://minibcake.notion.site/3-e957bed862bc4af0ab29e872116ba287?pvs=4
[임베디드] 3조 팀플 (세번째 팀) 상부삼조 | Notion
240711 ~ 240724 (김승주(팀장), 김무건, 장준희, 주예나, 한지윤)
minibcake.notion.site
팀원들이 다들 열심히 하고 성격도 털털하고 착하셔서 팀 분위기가 정말 좋았다고 생각한다. 강사님의 피드백 부분에서도 팀웤에 대해 긍정적으로 말하셨을 정도였다.
피드백 및 개선사항
○ 설계단계의 내용을 팀원모두가 잘 숙지함
난 Controller 이었기 때문에 M과 V와의 협업이 선택아닌 필수였다. 또한 설계를 다른 팀원분과 같이 머리를 맞대고 했다보니 숙지가 잘 되었던 것 같다.
○ 질문에 대해 파트에 맞게 잘 답변함
사실 내 파트에서는 질문이 크게 들어온 것이 없었다. 또한 MVC 패턴에 대해 잘 숙지한 상태였다.
○ 코드 함수화 수행이 잘 됨 (부족한 기능 다소 있으나)
이 프로젝트를 임하기 전에 배웠던 내용들을 참고해서 설계를 했다보니 좋은 피드백을 받았다고 생각한다.
○ 발표할때에 설명할 부분에 대한 개념 숙지는 필요해 보임
대본을 위주로 읽다보니 GPT 혹은 다른 팀원분들이 알려준 내용을 그대로 읽어서 그런 것이라고 생각한다.
셀프 리뷰
스스로 공부하기 힘들기도 하고, 어디서부터 어떻게 내가 고쳐야될지 모르는 상태에서 국비를 듣게 됐는데 정말 잘 선택한 것 같다. 프로젝트의 규모가 어떻든 간에 협업이란 쉬운 것이 아니다. 이 과정을 학교 생활을 할 때에는 잘 몰랐었다. 이번 기회에 정말 많이 알게 되었다.
내가 구현한 파트는 C에서 비 장바구니 부분인데, 사실 요구사항을 100% 충족하지 못했다. 로그아웃 시에 장바구니가 사라져야 하는데 사라지지 않았던 부분을 구현하지 않았다. 설계에서 빠트린게 컸다. 다시 한번 설계의 중요성을 느꼈다.
'프로젝트' 카테고리의 다른 글
COMA 클라이밍 크루 최종 프로젝트 자료 (0) | 2024.11.14 |
---|---|
[팀 프로젝트] COMA 클라이밍 크루 커뮤니티 중간 프로젝트 후기 및 느낀점 (1) | 2024.10.01 |
[JAVA] 포켓몬 게임 프로젝트 - 2 (1) | 2024.07.12 |
[JAVA] 포켓몬 게임 프로젝트 (2) | 2024.07.12 |
UP - DOWN 게임 만들기 (첫 번째 팀 프로젝트, 셀프 리뷰 ) (0) | 2024.07.01 |