6. ProductVO
11개의 멤버 변수 + 4개의 임시 변수
int pStarCnt 와 double pStarAvg 변수는
상품에게 부여된 별점 총 개수와 (별점의 총 합이 아니다 !), 평균 별점 을 뜻한다.
실제 DB의 칼럼이 아니라,
SQL 쿼리문 에서 집계함수를 통해 별점 관련 데이터를 뽑아내고,
그 데이터를 DB로 부터 받아 내기 위해 필요한 임시 변수 이다.
6-2. ProductDAO
public class ProductDAO {
static final String SQL_INSERT // 샘플 데이터로 insert() 하기. => 리스너 서블릿.
= "INSERT INTO PRODUCT (PNAME,PPRICE,PIMAGE,PCNT,PCATEGORY,PALCOHOL,PSWEET,PSOUR,PSPARKLE,PIMAGEDETAIL)
VALUES (?,?,?,?,?,?,?,?,?,?)";
static final String SQL_SELECTALL
= "SELECT P.*, ROUND(AVG(B.BSTAR),1) AS PSTARAVG, COUNT(B.BSTAR) AS PSTARCNT"
+ " FROM PRODUCT P LEFT JOIN BOARD B ON P.PNUM = B.PNUM WHERE 1 = 1";
static final String SQL_SELECTONE
= "SELECT P.*, ROUND(AVG(B.BSTAR),1) AS PSTARAVG, COUNT(B.BSTAR) AS PSTARCNT"
+ " FROM PRODUCT P LEFT JOIN BOARD B ON P.PNUM = B.PNUM WHERE P.PNUM = ?";
static final String SQL_UPDATE = "";
static final String SQL_DELETE = "";
각 CRUD 메서드에서 사용 되는, 3개의 SQL 쿼리문
SQL_INSERT
>> 상품의 데이터를 DB에 저장 하기 위해 사용 된다.
(DB에 직접 insert into 해도 되지만,
csv 파일 입출력을 사용하고,
서버가 시작 할 때, 최초로 1번만 상품 데이터가 insert() 되도록 설계 했다.)
SQL_SELECTALL
>> 상품 테이블에 있는 모든 칼럼을 SELECT 한다.
이때, 해당 상품에 리뷰마다 별점에 대한 데이터가 리뷰 테이블의 별점 칼럼에 저장 되어 있다.
그래서, Board 테이블에 있는 BSTAR 칼럼에 데이터를 사용 하기 위해,
JOIN을 한 모습을 확인 할 수 있다.
B.BSTAR 칼럼의 평균을 집계 함수로 구하고, 소숫점 1의 자리 까지 나타내준다는 의미이고,
B.BSTAR 칼럼의 총 개수를 집계 함수로 구하고,
각각 결과를 PSTARAVG 와, PSTARCNT 라는 별칭으로 나타내도록 한다.
이때, Board 테이블 에서 상품에 대한 별점이 부여 되지 않은 경우라면,
JOIN 시 집계할 별 데이터가 없는 경우,
그 해당 상품에 대해서는 SELECT 가 되지 않기 때문에,
그 부분을 해결 하기 위해, LEFT JOIN 을 사용 했다.
Product 테이블을 기준으로 조인 했기 때문에,
데이터가 없어서, 집계되는 별점 관련 데이터에 대한 결과값이 없더라도,
NULL로 보여주면서, SELECT 해준다.
PSTARAVG 의 데이터를 구하지 못했더라도,
이미지와 같이 NULL로 보여주면서, 상품 목록 모두를 SELECT 해주게 된다.
SQL_SELECTONE
>> 특정 상품에 대한 상세 정보를 보여 주기 위해 사용 된다.
ProductDAO 클래스 내부의 insert() 메서드가 어떻게 사용 되는지 확인 하기.
csv 파일을 가져오는 로직이 작성 되어 있는 SampleData 클래스는 모듈화 했으며,
pdatas 리스트에 담아, for문을 통해, DB에 insert 하게 된다.
아래는 상품 샘플 데이터가 작성된 csv 파일 이다.
아래는 모듈화한 SampleData 클래스 이다.
ProductDAO 클래스 내부의 selectAll() 메서드 확인 하기.
만약에 단맛, 신맛, 탄산감이 null 이거나,
약 또는 중 또는 강 이 아니면,
단맛, 신맛, 탄산감의 값을 null 로 바꿔 준다.
단맛이 약 또는 중 또는 강 이 아니다. == 단맛 자체가 없는 상품 이다.
== setPsour(null) 로 해주기.
근데, 단맛이 약 또는 중 또는 강이 아닌지를 확인 하기 위해서,
pVO.getpSweet()를 하는 모습 인데,
만약에 상품의 단맛 또는 신맛 또는 탄산감이 null 이라면, 위의 약 또는 중 또는 강을
비교할 때, NPE 가 발생 하게 되니까,
pVO.getpSweet()가 애초에 null 이면,
뒤에 약 또는 중 또는 강 비교 자체를 하지 않고 넘기는 로직 이다.
StringBuilder 클래스
>> 문자열을 동적으로 조작 하기 위한 클래스.
>> 문자열의 추가, 삽입, 삭제 등의 작업을 효율적으로 처리 가능.
StringBuilder 클래스의 특징
>> 가변성 (Mutablility)
StringBuilder 객체는 가변적인 (mutable) 특성을 지닌다.
반면에, String 클래스의 문자열은 불변하는 (immutable) 특성을 지니므로,
수정 작업시 마다, 새로운 문자열을 생성 해야 한다.
StringBuilder 클래스의 대표적인 메서드
1) append() : 문자열의 끝에 새로운 문자열을 추가.
2) insert() : 지정한 위치에 문자열을 삽입.
3) delete() : 지정한 범위 내의 문자열을 삭제.
4) reverse() : 문자열을 역순으로 변경.
...
예시)
7. SubscriptionVO
3개의 멤버 변수
7-2. SubscriptionDAO
각 CRUD 메서드에서 사용 되는, 2개의 SQL 쿼리문
8. SubsinfoVO
4개의 멤버 변수 + 조인을 위한 임시 변수 2개
8-2. SubsinfoDAO
각 CRUD 메서드에서 사용 되는, 3개의 SQL 쿼리문
'Team Project (국비) > Team Project' 카테고리의 다른 글
최종 프로젝트 설계 (ERD / UserFlow / LogicProcess) (0) | 2023.10.05 |
---|---|
중간 프로젝트 설계 (ERD / UserFlow / LogicProcess) (0) | 2023.10.05 |
중간프로젝트 Model 파트 (0) | 2023.07.30 |
중간프로젝트 PPT (0) | 2023.07.29 |
중간프로젝트 크롤링 샘플 데이터 (0) | 2023.07.19 |