본문 바로가기
Team Project (국비)/Team Project

중간프로젝트 Model 파트 2

by Hwanii_ 2023. 7. 30.
728x90

 

 

 

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 이면,

뒤에 약 또는 중 또는 강 비교 자체를 하지 않고 넘기는 로직 이다.

 

GROUP BY 절이 있어야 쿼리문이 정상 작동 한다.

 

 

?의 값을 set 할 때, Object 타입으로 set 하면 자동으로 데이터의 타입을 인식 해서 set 해준다.

 

 

 

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 쿼리문

 

구독한 회원들의 구독 상세 정보를 전부 보기 위해 JOIN

 

 

구독한 특정 회원의 구독 상세 정보를 보기 위해 JOIN

 

반응형