JAVA
MVC를 이용한 쇼핑몰 프로그램
기간 : 7.19 ~ 7.24
- 쇼핑몰 프로그램을 MVC 패턴으로 구현해주세요!
- 회원 속성 : 아이디(PK),비밀번호
- 상품 속성 : 품번(PK),품명,가격,재고
- "로그인한" 회원만 장바구니를 사용할수있습니다.
- 회원이 로그아웃을 하면 장바구니는 사라집니다.
- 요구기능 목록
- 회원가입
- 로그인
- 로그아웃
- 상품 목록 출력 :
- 재고가 없는 상품에 대해서 [품절] 표시하기 장바구니에 상품담기 장바구니에
- 담긴 상품 목록 출력 장바구니에 담긴 상품 목록 구매 장바구니에서 상품 빼기
기획 설계가 중요하다는걸 알기에
19일부터 21일까지 삼일간 코드를 쓰지 않고
기획 및 설계 & 한글 코딩 진행
22일 코딩
23일 코드 취합 및 발표준비
24일 발표
[ 기록(노션) ]
https://www.notion.so/f314b14224f1499d90e14809b3230182?pvs=4
[ 본인 파트 ] [Model - Member]
총 5명이 M V C 파트를 분배해 진행함
M-2, V-1, C-2
Model파트에서도 member와 product로 나뉨
model - member 파트 설계 내용
회원가입(MemberDAO)
- 아이디 중복검사 ▷ selectOne [condition - IS_UNIQUE]
- 같은 id가 있는지 확인하고 중복된 id가 있으면 dto에 id를 담아서 반환
- 없으면 null이 담긴 dto를 반환
- 컨트롤러에서 보내준 id 값을 받아와 멤버 DB를 하나하나 확인 하면서
- 회원가입 ▷ insert
- 컨트롤러에서 받은 id값과 pw값을 DB 저장 후 성공이면 true 실패면 false를 반환
로그인(MemberDAO)
- 로그인 ▷ selectOne [condition - LOGIN]
- 해당 사용자의 정보를 dto에 담아 반환
- id와 pw 둘 중 하나라도 같지 않다면 null을 반환
- 컨트롤러에서 받은 id와 pw값이 DB에 저장된 사용자의 id/pw 값과 모두(AND) 같을 때
[ MemberDTO ]
package model;
public class MemberDTO { // 맴버 DTO 클래스 선언
private String mid; // 맴머 ID > PK
private String password; // 비밀 번호
private String condition; // 개발자용 식별자
public String getCondition() { // getter/setter
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() { // toString 오버라이딩 / log를 보기 위함
return "MemberDTO [mid=" + mid + ", password=" + password + "]";
}
}
[ MemberDAO ]
package model;
import java.util.ArrayList;
public class MemberDAO {//DAO 클래스
private ArrayList<MemberDTO> datas; // DB
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()); // 입력 받은 ID 저장
data.setPassword(memberDTO.getPassword()); // 입력 받은 비밀번호 저장
datas.add(data); // DB에 새로운 객체를 넣기
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) { //DB에 있는 객체 1개를 반환
System.out.println(" model.MemberDAO selectOne() 시작");
if(memberDTO.getCondition().equals("IS_UNIQUE")) { // 중복 검사
//컨디션이 IS_UNIQUE 라면
for(MemberDTO data:this.datas) {
// DB를 데이터 반복
if(data.getMid().equals(memberDTO.getMid())) {
//입력받은 객체의 ID값과 DB의 ID값이 같으면
System.out.println(" model.MemberDAO selectOne()-IS_UNIQUE 종료 : 성공");
return data; //해당 객체 반환
}
}
}
else if(memberDTO.getCondition().equals("LOGIN")) {// 로그인
//컨디션이 LOGIN이라면
for(MemberDTO data:this.datas) {
// DB를 데이터 반복
if(data.getMid().equals(memberDTO.getMid())
//입력받은 객체의 ID값과 DB의 ID값이 같고,
&& data.getPassword().equals(memberDTO.getPassword())) {
//입력 받은 객체의 비밀번호가 DB의 비밀번호와 같으면
System.out.println(" model.MemberDAO selectOne()-LOGIN 종료 : 성공");
return data; // 해당 객체 반환
}
}
}
System.out.println(" model.MemberDAO selectOne() 종료");
return null; //모두 일치하지 않으면 null반환.
}
}
[ 본인 파트 발표 내용 ]
본인은 발표를 굉장히 못하는 사람임
벌벌 떨면서 발표함
회원가입 인설트는
새 객체를 만들어
컨트롤러에서 받은 id값과 pw값을
DB에 저장합니다
저희 팀은 회원가입 시 진행되는 아이디 중복검사를
DAO에서 구현했습니다
셀렉트원은 condition값에 의해 나눠지며
중복검사 셀렉트원은
컨트롤러에서 받은 id값을
멤버 DB의 id값과 비교하면서
같은 id값이 있다면 해당 객체를 반환하고
같은 값이 있지 않다면 null을 반환합니다
로그인 셀렉트원은
컨트롤러에서 받은 id / pw와
멤버 DB의 id / pw를 비교하면서
id / pw가 모두 같다면 해당 객체 반환하고
하나라도 같지 않다면 null을 반환합니다.
Model부분은 크게 신경 쓸게 없었다고 생각함 controller에서 보내는 요청만 수행하면 됨
이라고 생각 View와는 직접적인 상호작용이 없음
예상 질문도 준비함
[ 예상 질문 ]
쓰지 않는 메서드들을 private로 만든 이유
- 외부의 비정상적인 접근을 막고
- 정보 은닉을 위해 private를 사용
- 추후 추가될 기능들을 위해 만들어둠(유지보수 용이)
DAO에서 중복 검사를 한 이유
- 아이디 중복 검사를 Controller에서 하지 않고 DAO에서 하는 이유는
비즈니스 로직과 데이터 로직을 분리하기 위함입니다.
이렇게 하면 각 계층의 역할이 명확해지고, 코드의 응집도와 유지보수성이 향상되기 때문입니다.
비즈니스 로직은
- 사용자의 요구사항을 처리하기 위한 로직
데이터 로직은
- 데이터베이스와의 상호작용이 필요한 로직
condition 사용이유
결합도는 낮추고 응집도는 높이기 위해
오버로딩하지 않고 condition이라는 식별자를 이용하도록 설계했습니다
컨디션 값 선정 이유
- 식별하기 쉽게 만들었다
준비를 했지만 본인에겐 질문이 들어오지 않음
공통 질문에 나서서 대답을 하지도 않음
[ 최종 피드백 ]
설계단계의 내용을 팀원모두가 잘 숙지함
질문에 대해 파트에 맞게 잘 답변함
코드 함수화 수행이 잘 됨
(부족한 기능 다소 있으나)
다만 발표할때에 설명할 부분에 대한 개념 숙지는 필요해 보임
+
주석 부족, 발표자료 맞춤법
[ 소감 ]
기획 / 설계의 중점을 두고 오랜시간 공드린 것이 코드 작성에서 나타남
이번 프로젝트를 통해 기획 및 설계의 중요함을 느낄 수 있었고
한글코딩 역시 마찬가지였음
(Model부분은 막힘이 없었음,
워낙 짧은 코드이기도 했음)
최종코드에 오류가 존재했는데 기획/설계에서 잡지 못한것이 큰 이유라고 생각함
협업을 통해 주석의 필요성과 중요함을 상기시킬 수 있었고
MVC패턴의 흐름과 효율성을 조금 더 깊이 알 수 있게 됐던 프로젝트였음
또한, 중복검사를 controller에서 하지 않고 memberDAO에서 진행 했는데
이 이유는 위에서도 작성 했듯이 비즈니스 로직과 데이터 로직의 책임을 분명하게 구분하기
위함이었다는걸 알게됨 ==> 아직 구별하기는 어렵지만
가장 좋았던 것은 팀원분들임
처음 보는 사람들이지만 잘 맞아서
즐겁게 프로젝트를 진행할 수 있었음👍
마음이 맞지 않은 팀원들을 만나도
프로그래밍이라는게 생각에 생각을 하는 것이라고 느껴서
나름 즐거운거 같음 생각하는 재미랄까
아무튼
뭘해도 즐거워야 하지 않을까 생각
발표가 기획/설계만큼 어렵다 라고
나는 생각한다
고로,, 고로,,, 케
- javaboiii -
아악
더 열심히 합시다
뭐든 다..,.
'프로젝트_리뷰' 카테고리의 다른 글
프로젝트 - 결제 API 흐름 (0) | 2024.10.28 |
---|---|
WEB - 중간 프로젝트 발표 팀 피드백 (1) | 2024.09.30 |
Web - 웹 프로젝트 1차 피드백 (1) | 2024.09.01 |
JAVA - 포켓몬게임 (3) | 2024.07.11 |
JAVA - UP, DOWN GAME (1) | 2024.07.01 |